modernhill
驱动小牛
驱动小牛
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分98分
  • 威望278点
  • 贡献值0点
  • 好评度172点
  • 原创分0分
  • 专家分0分
阅读:1726回复:6

访问硬件寄存器一定要映射虚拟地址吗?

楼主#
更多 发布于:2007-04-10 10:18
  问题是这样的,我在应用程序中直接访问硬件寄存器,比如IIC控制器,直接访问它的硬地址可以实现对它的操作,我想知道为什么一定要用virtualAlloc和virtualCopy呢?哪位兄弟能指点一二。。。
milkyway1888
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2011-05-07
  • 粉丝1
  • 关注0
  • 积分6分
  • 威望97点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-10 16:57
看你的CPU了。如果是X86下访问设备I/O是不需要影射的;如果是ARM的CPU需要做虚实地址映射
原因在于X86下把地址线分成I/O和存储器;而ARM架构里是不存在I/O的,它的I/O全都映射到存储器里。
在wince起来后,只能通过 MMU访问到虚拟地址而不能直接访问物理内存。
modernhill
驱动小牛
驱动小牛
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分98分
  • 威望278点
  • 贡献值0点
  • 好评度172点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-16 23:16
谢谢,那我在应用程序中直接使用s2410.h中提供的那个地址是否可以呢?
sniper167
驱动中牛
驱动中牛
  • 注册日期2006-07-12
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望411点
  • 贡献值0点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-04-17 09:48
肯定不可以咯  那是物理地址了
能跑应用程序的时候  mmu都跑起来了
[url]http://sniper167.bokee.com[/url]
milkyway1888
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2011-05-07
  • 粉丝1
  • 关注0
  • 积分6分
  • 威望97点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-17 10:41
s2410.h中例如 #define IOP_BASE      0xB1600000 // 0x56000000 这行, 宏定义的 0xB1600000 是kernel段的虚拟地址,ISR中可以直接操作,但是应用程序是在用户态,必须使用VirtualAlloc/virtualCopy再做一个动态的虚实地址映射,把想要操作的物理地址映射到当前进程的虚拟空间中.
如果想了解原理性的东西,建议看看CE下4G虚拟内存的分配以及虚拟地址的相关知识.
如果只是想完成2420上的I/O操作,查看帮助下virtualAlloc和virtualCopy的用法就可以了,上网搜索下,有很详细的例子的.
modernhill
驱动小牛
驱动小牛
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分98分
  • 威望278点
  • 贡献值0点
  • 好评度172点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-17 22:17
谢谢兄弟们的指点,但是我在应用程序中不用VirtualAlloc和VirtualCopy而是直接用kernel段的虚拟地址,程序也可以正确访问寄存器啊,我觉得有点奇怪,所以来问问兄弟们~~~
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-04-18 19:59
这个应该是FULL KERNEL没有打开.
学海无涯
游客

返回顶部