********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
时间:2012.02.26
类别:WINCE系统开发
********************************LoongEmbedded********************************
1. WINCE内存模型
图1 WINCE5.0和WINCE6.0内存模型对比图
WINCE6.0之前的WINCE操作系统支持的进程最多只有32个,并且每个进程只有32MB的虚拟内存空间,并且所有的进程共享相同的4GB地址空间。在WINCE6.0中,内核进程占用4GB虚拟内存空间的高2GB,每个用户进程都有独立拥有低端的2GB虚拟内存空间,WINCE6.0支持的最大进程数达到32000个。进程数量的实际限制是受物理内存的大小来决定的。之前的WINCE版本,当前的应用在slot0执行,在WINCE6.0中,抛弃了原来的按Slot分配的方式,而是只要你需要你就可以创建内存,每个都有2GB的有效虚拟内存空间。
因为虚拟内存访问是通过内存管理单元MMU转化为物理内存的访问,所以虚拟内存代码是依赖于CPU的。ARM和x86处理器使用硬件页表OEMAddressTable,所以硬件可以直接访问虚拟内存单元。WINCE支持的其他CPU使用一个软件转换旁路缓冲区TLB(translation look-aside buffer,可理解为页表缓冲或是快表)miss handler,这需要完里面填充虚拟内存的内容。
WINCE6.0基于下面的目标来设计虚拟内存管理:
⑴ 每个进程具有大容量的虚拟内存。
⑵ 不存在进程数量的限制。
⑶ 进程直接相互保护。
⑷ 最低程度降低使虚拟内存管理依赖CPU的代码。
⑸ 有效的虚拟内存分配
⑹ 有效的TLB选中处理机制(miss handling)。
2. WINCE虚拟内存分配
下面来看WINCE6.0虚拟内存地址空间图,先看内核模式下的虚拟内存地址空间分配。
图2 内核模式虚拟内存空间分配图
⑴ 静态映射到虚拟内存,有缓冲的,范围为0x80000000~0xA0000000,大小为512MB,通过CPU的cache直接访问物理内存,这段也就是BSP包中g_oalAddressTable映射表对应于物理内存到虚拟内存的映射关系。
⑵ 静态映射到虚拟内存,无缓冲的,范围为0xA0000000~OxBFFFFFFF,大小为512MB,不需要通过CPU的cache,直接访问物理内存。
⑶ 内核XIP DLLs所在的虚拟内存空间,范围为0Xc0000000~0Xc7ffffff,大小为128MB。
⑷ 对象存储区域,范围为0xC8000000~0Xcfffffff,大小为128MB,主要用于存储RAM文件系统、CEDB数据库、基于RAM的注册表和遗留的数据存储(legacy data sore)。
⑸ 内核虚拟内存空间,为内中中装载的所有服务和驱动所共享,范围为0xD0000000~0xDFFFFFFF,大小为256MB,另外的256MB的虚拟内存空间取决于具体CPU,范围为0xE0000000~0xEfffffff。
⑹具体CPU的虚拟内存空间,用于系统调用的陷阱捕获区域,范围为0xF0000000~0xFFFFFFFF,大小为256MB。
用户模式下的虚拟内存地址空间分配如下
图3 用户模式虚拟内存空间分配图
⑴每个进程的进程空间,主要用于可执行代码和数据,用户堆的虚拟内存分配,
范围为0x00000000~0x3FFFFFFF,大小为1GB。
⑵ 用户模式DLLs的代码和数据空间,范围为0x40000000~0x5FFFFFFF,大小为512MB。
⑶ 用于RAM-backed映射文件,范围为0x60000000~0x6FFFFFFF,大小为256MB。
⑷ 共享系统堆,范围为0x70000000~0x7FFFFFFF,大小为256MB。
一次只能映射一个虚拟内存,不能直接通过其他进程的虚拟内存地址来访问它们的内存。虚拟内存地址只能在已被进程分配的情况下使用,比如应用程序不能在代码中调用VirtualProtect函数来改变自己已有访问保护。
free(可用):可被分配
reserved(保留):虚拟地址被保留,不能再分配。但不能被使用,因为它没有被映射到物理内存。
committed(提交):映射到物理地址。