milkyway的窝

最初想法的诞生地

 

Windows CE的存储与地址映射技术学习

  Windows CE采用了四层内存管理结构,从下到上依次为:物理内存,虚拟内存,逻辑内存和C/C++运行时库.其中物理内存包括:RAM(为OS和程序提供运行和缓冲空间),ROM(存储程序,包括OS和一些文件),Flash(可擦写).CE支持最大物理内存为512M.
  所有进程共享4G的虚拟存储空间,它是通过以页为单位管理的,不同处理器支持页大小不同(ARM支持1K,4K,64K,1M;X86支持4K与4M).虚拟内存的申请分成保留和提交两个过程(reserve and commit).虚拟内存要求硬件上具有MMU的支持,MMU负责把虚拟地址映射到物理地址,并提供内存保护.CE把4G的虚拟内存分成两部分:低2G为用户空间,由应用程序使用;高2G为内核空间,由OS使用.
  所谓逻辑内存分成堆(64K)和栈(60K).而C/C++运行时库提供了一系列内存管理函数,比如malloc,new,delete等等.
  在PB的帮助中指出WINCE有两种地址:物理地址和虚拟地址.在不同架构的CPU下,概念有所区别.MIPS和SHx处理器,内核操作1G的存储(512M缓存,512M非缓存);而X86和ARM在OEMAddressTable中划分物理存储.相应的地址映射方法也分成两种:MIPS和SHx处理器,不采用MMU,直接在CPU和内核里定义;X86和ARM在OEMAddressTable中定义映射关系或者是OS启动后调用CreateStaticMapping和NKCreateStaticMapping来实现从虚拟地址到物理地址的映射.
  另一种分类是映射虚拟地址的形式可以分成静态虚拟地址映射和动态虚拟地址映射.所谓静态,就是在OEMAddressTable中定义映射关系或者是OS启动后调用CreateStaticMapping和NKCreateStaticMapping来实现从虚拟地址到物理地址的映射;动态则是通过VirtualAlloc和VirtualCopy(或者调用MmmapIoSpace函数).这两种映射虚拟地址的形式区别在于静态虚拟地址只能由内核使用,用于ISR访问外设存储.而动态虚拟地址可以在应用程序里访问物理地址(比如在驱动中操作寄存器).
  在X86和ARM体系的CPU里,有一个数据结构对于地址映射技术尤其重要:OEMAddressTable.这个数组定义了外设从4G的虚拟地址到512M物理地址的映射关系.它位于public\common\oak\csp\x86\oal目录下的oeminit.asm中,格式为 Virtual Address, Physical Address, Size
在X86下大小必须是4M的倍数,ARM下为1M的倍数.内核建立了两个范围的虚拟地址:从0x80000000到0x9FFFFFFF是带缓存的物理地址映射,而0xA0000000 到 0xBFFFFFFF 是不带缓存的物理地址映射.驱动访问外设时,应该用不带缓存段的虚拟地址.  要注意的一点是,如果改动了OEMAddressTable,相应要改动config.bib.

posted on 2007-01-20 20:18 milkyway 阅读(3193) 评论(1)  编辑 收藏 引用 所属分类: Wince学习小结

评论

# re: Windows CE的存储与地址映射技术学习 2007-01-27 20:31 相思酸中有甜

在不同CPU下对I/O的编址方式不同.比如X86下是存储器和I/O端口分开编址,ARM下是把I/O端口映射到存储器的。

cached/uncached这个概念是硬件层面上的,与程序是OS还是应用或者驱动没有关系。如果一段SDRAM空间只有CPU访问,则应该使用CACHED地址,这样能获得最快的速度,而如果这段地址CPU与外设都会访问(比如DMA),则必须使用UNCACHED地址,这样CPU与外设的数据才能同步.
  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

公告

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

常用链接

留言簿(37)

随笔分类(104)

随笔档案(101)

文章分类(51)

文章档案(53)

wince牛人

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜