想学编程做网站,青岛市建设工程管理信息网,重庆网红景点排名,枣庄建设局网站要深入了解WinCE的memory结构#xff0c;就不得不在这里先画个virtual memory space的图。这个图是针对WinCE 5.0的。由于WinCE 6的结构做了很大变化#xff0c;关于WinCE 6的内容将在以后介绍。 关于这个图的来源#xff0c;有两点要说明。其一#xff0c;绘制这个图的…要深入了解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 Space0x8000 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 FFFFTrapKPAGE等地址空间。 关于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 storeshare memoryeg. memory mapped files。可以被所有线程访问。0x7E00 0000 ~ (0x8000 0000 - 1)存放dll的resource。 发表转载于:https://www.cnblogs.com/googlegis/archive/2008/11/28/2979219.html