要深入了解WinCE的memory结构,就不得不在这里先画个virtual memory space的图。这个图是针对WinCE 5.0的。由于WinCE 6的结构做了很大变化,关于WinCE 6的内容将在以后介绍。 关于这个图的来源,有两点要说明。其一,绘制这个图的主要依据是Micorsoft一份ppt。其二,在Nasiry的blog上也有一份类似的图(http://www.cnblogs.com/nasiry/archive/2004/11/16/64437.html)。也正是Nasiry的那幅图给我启发,才让我想在这里重新绘制一份,并写下一些说明。
WinCE 5.0 的virtual memory 分为4GB。其中高位的2GB为Kernel space,低位的2GB为User space。Kernel space可以被拥有权限(运行在Kernel mode)的线程访问。任何线程,可以通过调用SetKMode来让自己切换到Kernel mode或者User mode。低位的2GB,只是理论上可以被任何线程访问,但实际上访问起来也要受到一些限制。这点在下文说明。
关于Kernel Space:
0x8000 0000 ~ (0xC000 0000 - 1): 这1GB的空间是用来做static mapping的。在WinCE启动时,WinCE会把物理地址通过静态映射到这1GB的空间。其中0x8000 0000 - (0xA000 0000 - 1)的512MB空间是带缓存的映射,另外的高512MB空间是不带缓存的。为什么同样的memory要做两次映射?目前能想到的例子是,当我们使用一片memory,比如FileMapping的方式在多个进程之间共享memory的时候,如果一个进程写,一个进程读,那么这片meomry可能要设置为UnCached,从而保证两边的数据不会因为cache的原因而出现不同步的情况。另外,由于静态映射的地址空间已经确定了,最大为512MB,那么也就限定了WinCE 5.0最多只能管理512MB的memory。 0xC000 0000 ~ (0xC200 0000 -1) 未使用。 0xC200 0000 ~ (0xC400 0000 -1): NK.exe进程被load的位置。 0xC400 0000 ~ (0xE000 0000 -1):OEM可以使用的静态映射空间,具体如何使用尚未遇到过。 0xE000 0000 ~ 0xFFFF FFFF:Trap,KPAGE等地址空间。 关于User space,可以被分为64个,每个为32MB的slots。
0x0000 0000 ~ (0x0200 0000 - 1):Slot0 为当前运行的进程。前面说道每个线程虽然可以放问user space,但时机上,在访问其它进程的空间时,需要获得对那个进程的访问权限。可以通过调用SetProcPermissions 获得对其它进程的访问权限。 0x0200 0000 ~ (0x0400 0000 - 1):slot1 为存放XIP DLL的地方。所谓XIP,就是execute in place的缩写。XIP区域就是可以直接从ROM中执行,不需要load到RAM中的代码。 0x0400 0000 ~ (0x4200 0000 - 1):存放另外31个进程的slot。0x4200 0000 ~ (0x7E00 0000 - 1):object store,share memory(eg. memory mapped files)。可以被所有线程访问。0x7E00 0000 ~ (0x8000 0000 - 1):存放dll的resource。
发表
转载于:https://www.cnblogs.com/googlegis/archive/2008/11/28/2979219.html