milkyway的窝

最初想法的诞生地

 

ce内存映射的点点滴滴

wy12218 发表于 2006-11-9 18:17:00

OEMAddressTable里定义的映射关系是给ARM MMU用的,是在KernelStart(source code参考wince420private目录)时建立的,只要WINCE还在跑,就不会解除.
OEMAddressTable里的Virtual Addr和Physical Addr是对ARM来说的. 其实对于WINCE,就只能访问到它的Virtual address. 也就是说,OEMAddressTable里的Virtual address对WINCE 系统来说才是Physical Address.

经过OEMAddressTable映射后的系统的物理地址,在0x80000000~0x9fffffff之间.是caching and buffering的地址,这个地址加上0x20000000,就是它的cache & buffering disabled地址.所有的硬件寄存器的地址都在这个地址段上,受MMU保护的.

上面讲的系统的物理地址,从0x80000000~0xbfffffff,在Kernel Mode下都可以直接访问. ISR是在KERNEL里,也就可以直接访问这些系统的物理地址.无所谓"因为ISR只能访问静态映射的虚拟地址".

上面说过,对于ARM来说,有虚拟地址和物理地址之分,对于WINCE来说,也有虚拟地址和物理地址之分. 可以这么说,ARM的虚拟地址就是WINCE系统的物理地址.
32位的OS总共有4G的虚拟地址空间,WINCE也不例外. 其中,0x00000000~0x80000000是Application Space; 0x80000000~0xffffffff是System Reserved. 系统的物理地址就在System Reserved的这段,只能在KERNEL MODE访问. 那么,当APPLICATION和DRIVER(都是运行在USER MODE)要访问这些在System Reserved地址段的硬件寄存器或MEMORY怎么办呢? 只好再建立一层映射关系,在Application Space里分配一段空间,把它映射到System Reserved里的地址上,这就是VirtualAlloc/Copy和MmMapIoSpace干的事情.

如果你的地址是这样声明的:
#define RTC_COUNTER *((volatile unsigned *)0x91000000)
那么直接读写就可以了,比如:
int nRtc = RTC_COUNTER;
RTC_COUNTER = nRtc;

否则,可以用:
int nRtc = READ_REGISTER_ULONG(0x91000000);
WRITE_REGISTER_ULONG(0X91000000, nRtc);

其实这两种方式的本质是一样的,都是把地址声明成某个数据类型,然后就可以直接读写了.下面是READ_REGISTER_ULONG()和WRITE_REGISTER_ULONG()的定义:
#define READ_REGISTER_ULONG(reg) (*(volatile unsigned long * const)(reg))
#define WRITE_REGISTER_ULONG(reg, val) (*(volatile unsigned long * const)(reg)) = (val)

 

posted on 2007-02-02 09:27 milkyway 阅读(2246) 评论(2)  编辑 收藏 引用 所属分类: wince(别人的文章技巧总结)

评论

# re: ce内存映射的点点滴滴 2009-02-08 16:47 a mao

这事我见过的讲述WinCE内存和Arm地址最最透彻的文章,由于初入WinCE,本来还是比较模糊的概念,现在全部理清了。

真的感谢博主!!!  回复  更多评论   

# re: ce内存映射的点点滴滴 2010-05-15 21:02 s

同感@a mao
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

公告

随笔皆原创,文章乃转载. 欢迎留言!

常用链接

留言簿(37)

随笔分类(104)

随笔档案(101)

文章分类(51)

文章档案(53)

wince牛人

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜