
WINCE5.0和WINCE6.0的存储与平台架构
1.WINCE5.0
1.1WINCE5.0的内存架构

因为WINCE是32位的嵌入式操作系统,所以WINCE的虚拟寻址能力可达4GB(为什呢,2^32=4GB),但是WINCE5.0和XP操作系统的每个进程独享4GB虚拟地址空间不同,WINCE5.0中所有的进程共享一个4GB的虚拟地址空间。这4GB的虚拟地址空间被分为两个2GB的区域,其中低地址的哪2GB区域(0x00000000~0x7FFFFFFF)是用户虚拟空间,这块虚拟空间由应用程序的共用,也就是说应用程序申请的显存都会从低2GB虚拟内存空间分配的;而高2GB区域(0x80000000~0xFFFFFFFF)是操作系统的内核虚拟空间wince6.0播放器,供WINCE操作系统本身使用。

我们了解WINCE5.0的进程数量最多只能达到32个,而且每个进程只能享受32MB的虚拟空间(这个32MB的空间也叫一个slot),这33个进程(32+1,这个1就是指slot0,因为slot0用于映射当前在处理器上执行的轮询所在的进程)占用的虚拟空间0x00000000~0x41FFFFFF(slot0~slot32),slot33~slot63对应的虚拟地址空间是0x42000000~0x7FFFFFFF,这块虚拟地址空间是由所有的进程共享的,如果每个进程独享的32MB虚拟地址空间不够用,那么进程可以在这个范围申请虚拟地址空间,这个范围包含对象存储和存储映射文件(.map文件,每个进程都有自己的map文件)。此范围的最后一个slot(slot63)从0x7E000000~0x7FFFFFFF用来储存纯资源DLL。如果某个DLL里面只有资源信息(比如按钮、位图、对话框及字符串表灯),这个DLL就会被加载至这个空间内。
从0x80000000开始是WINCE内核使用的虚拟内存空间,其中0x80000000~0x9FFFFFFF(512MB)这段用来静态所有的物理地址,也就是说WINCE会把所有的物理存储1:1地址映射至这段虚拟内存上,这也就是WINCE最大支持的物理内存是512MB的由来。0xA0000000~0xBFFFFFFF(512MB)这段虚拟地址会重复映射所有的物理地址,这段对物理内存的映射与0x80000000这段最大的不同是从0x80000000开始的一段虚拟内存(何宗键老师这里写得是物理内存)是有缓冲的,而从0xA0000000开始的一段是没有缓冲的。通常,缓冲可以减少系统的I/O效率(why,有待进一步理解),但是针对一些OAL或者bootloader或者驱动来说,使用缓冲有可能会造成灾难性的后果,因为缓冲有可能会更改我们对设备的写操作顺序,因此在驱动程序中即使直接访问设备的I/O或寄存器,那么一般使用0xA0000000这段内存地址。

物理内存被映射到内核空间以后,WINCE内核如果要访问某个物理内存地址,就只应该把该物理地址加上0x80000000或者0xC0000000就可以了,这样简便的方法只能由WINCE内核使用,通常的应用程序是能够享受这些方便的。
0xC2000000~0xC3FFFFFF是slot97,此slot97是WINCE5.0的核心进程
NK.EXE,可见实现WINCE5.0操作系统的一些主要用途的NK.EXE本身的地址空间还是在跟想法中的,0xE0000000~0xFFFFFFFF这段最高的地址是内核使用的地址空间,对于不同的处理器体系结构,这里保存着不同的内容,通常会存放一些供虚拟内存用的页表和中断向量表等内核使用的数据结构。

从上图我们就slot0来看看一个进程中虚拟地址空间的使用状况。一个进程的32MB虚拟地址空间中,最低的64KB地址(0x000000~0x00010000)是用来捕获野指针的,通常是空指针NULL的,如果某个指针访问了超过64KB的内存区域,那么WINCE就可以捕捉到这个错误,但是这种并不能捕获代码中所有的野指针。
64KB之上是进程的代码、数据或者堆和栈,进程申请虚拟内存是从低地址向高地址增长的。从每位32MB虚拟地址空间最高地址开始,存放的是进程读取的ROMDLL的读写数据或者RAMDLL的数据(ROMDLL的代码对所有的进程来说可以共享一个拷贝,放在slot1中,但针对DLL的数据,就不得不为每个进程设立单独的拷贝),DLL代码跟数据的下降是从高地址向低地址增长的,如果这两个高低增长相遇,那么就表示进程尚未耗尽了它的虚拟地址空间,就算此时有可也有多余的物理内存,但是能够使用它了,因为进程的虚拟地址空间即将用完了。
我们知道虚拟内存的申请是以64KB为界限的,这对进程加载DLL有相当重要的妨碍,这也就意味着每个DLL的都应大约占用64KB虚拟地址空间,从理论上来说每个进程只能加载512个DLL。要记住所有的ROMXIPDLL都会被映射到进程的虚拟地址空间中wince6.0播放器,因为进程有也许访问任何一个XIPDLL。通常一个没有图形界面的WINCE操作系统就会包括有100个左右这种的DLL,一个含有图形界面的正常WINCE包含的此类DLL更多,因此这个难题需要导致重视。可以采用一些方式减少虚拟内存耗尽,例如把几个不到64KB的小DLL合并作为一个大的DLL。
1.2WINCE5.0的系统架构
![]()

2.WINCE6.0
2.1WINCE6.0的内存架构

⑴WINCE6.0支持最大32000个进程。
⑵每个进程独自占用2G虚拟地址空间。
⑶统一/一元化的内核(unifiedkernel),把关键性的OS部分移至内核空间。



***和WINCE5.0类似,2G的用户空间被分为两个别。
***最低64KB,被系统用来捕获野指针。
***低1GB的地址空间用来读取进程的代码、数据、堆、栈等
***0x40000000~0x5FFFFFFF(512MB),这段虚拟内存空间用于读取所有的客户进行的DLL代码跟数据。
***0x60000000~0x6FFFFFFF(256MB)这段存储分配给内存映射文件MMF(memorymappedfiles)。
***0x70000000~0x7FEFFFFF这段存储是内核程序跟用户进程间的共享堆,实现内核程序跟用户进程间通信(无需通过API),此区域用户程序可读,但OS能写。
***0x7FF00000~0x7FFFFFFF这段存储不可访问,作为客户跟核心间的缓存。


***低1GB是静态虚拟地址。
***0xC0000000~0xC7FFFFFF(128MB)用于内核加载的XIPDLLs。
***0xC8000000~0xCFFFFFFFF(128MB)是文件系统的对象存储区。
***0xD000000~0xDFFFFFF(512MB)是内核方式的程序执行区。
***0xF000000~0xFFFFFFFF用于捕获系统读取,包含核心数据页。

WINCE6.0系统被划分为usermode(用户体系)和kernelmode(内核方式)两个“层”,CoreDLL同时发生在两个层中,驱动程序也移到了内核中,以前的.exe基本上都变成了.dll
3.WINCE5.0和WINCE6.0的OALdesign

本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-138522-1.html
也不是实心弹
平常人怎么破