阅读:1735回复:6
访问硬件寄存器一定要映射虚拟地址吗?
问题是这样的,我在应用程序中直接访问硬件寄存器,比如IIC控制器,直接访问它的硬地址可以实现对它的操作,我想知道为什么一定要用virtualAlloc和virtualCopy呢?哪位兄弟能指点一二。。。
|
|
沙发#
发布于:2007-04-10 16:57
看你的CPU了。如果是X86下访问设备I/O是不需要影射的;如果是ARM的CPU需要做虚实地址映射
原因在于X86下把地址线分成I/O和存储器;而ARM架构里是不存在I/O的,它的I/O全都映射到存储器里。 在wince起来后,只能通过 MMU访问到虚拟地址而不能直接访问物理内存。 |
|
板凳#
发布于:2007-04-16 23:16
谢谢,那我在应用程序中直接使用s2410.h中提供的那个地址是否可以呢?
|
|
地板#
发布于:2007-04-17 09:48
肯定不可以咯 那是物理地址了
能跑应用程序的时候 mmu都跑起来了 |
|
|
地下室#
发布于:2007-04-17 10:41
s2410.h中例如 #define IOP_BASE 0xB1600000 // 0x56000000 这行, 宏定义的 0xB1600000 是kernel段的虚拟地址,ISR中可以直接操作,但是应用程序是在用户态,必须使用VirtualAlloc/virtualCopy再做一个动态的虚实地址映射,把想要操作的物理地址映射到当前进程的虚拟空间中.
如果想了解原理性的东西,建议看看CE下4G虚拟内存的分配以及虚拟地址的相关知识. 如果只是想完成2420上的I/O操作,查看帮助下virtualAlloc和virtualCopy的用法就可以了,上网搜索下,有很详细的例子的. |
|
5楼#
发布于:2007-04-17 22:17
谢谢兄弟们的指点,但是我在应用程序中不用VirtualAlloc和VirtualCopy而是直接用kernel段的虚拟地址,程序也可以正确访问寄存器啊,我觉得有点奇怪,所以来问问兄弟们~~~
|
|
6楼#
发布于:2007-04-18 19:59
这个应该是FULL KERNEL没有打开.
|
|
|