Windows CE虚拟内存模型

Windows CE虚拟内存模型(一) zz

(2007-09-21 10:09:19)
转载
标签:

it/科技

分类: 工作

与Windows XP一样,Windows CE也是32位的操作系统,因此Windows CE的虚拟寻址能力可以达到4GB,但是与Windows XP的每个进程独享4GB虚拟地址空间不同,Windows CE中所有的进程共享一个4GB的虚拟地址空间。

Windows CE的内存是基于页式管理的,Windows CE操作系统支持两种页大小:1KB和4KB。在Windows CE中,与桌面Windows一样,虚拟内存的申请分为保留(reserve)和提交(commit)两个过程,虚拟地址空间的保留是以64KB为边界的,也就是说,任何一次虚拟内存申请都会返回一个64KB的整数倍的地址。但是把虚拟内存提交到物理内存是以页为粒度的,

管理虚拟内存的硬件是内存管理单元(MMU,Memory Management Unit)。MMU负责把虚拟地址应为到物理地址,并且提供一定的内存保护。尽管Windows CE支持台式机的硬盘,但是基于Windows CE的设备中通常都没有硬盘,因此Windows CE无法把一些暂时不用的页换出到硬盘上来空出一些RAM。然而,虚拟内存是Windows CE中的重要模块,它把进程申请的内存映射到物理内存,并且提供系统4GB的寻址能力。在程序启动时,虚拟内存可以按照需要来即时的申请程序代码空间所需要物理内存,而不是在程序启动时就把它完全加载到物理内存中。此外,应用程序也不需要关心到底有多少物理内存剩余,程序需要的内存会被申请并且映射到虚拟地址空间中。如果没有剩余的物理内存了,内存申请就会失败。

?/P>

Windows CE虚拟内存模型_第1张图片 图:Windows CE的4GB地址空间

这4GB的虚拟地址空间又被分为两个2GB区域,低地址2GB是用户空间,供应用程序使用,应用程序申请的内存都会从低2GB地址空间中返回。高地址2GB是内核空间,供Windows CE操作系统本身使用。

Windows CE把4GB虚拟地址空间分成若干个Slot,每个Slot占32MB,Slot的编号从0开始。Slot 0到Slot 32对应的虚拟地址是0x0000 0000到0x41FF FFFF,它们用于存放进程的虚拟地址空间。其中Slot 0用于映射当前在处理器上执行的进程(确切的说当前在处理器上执行的线程属于哪个进程)。Slot 1由XIP的DLL代码使用。Slot 2到Slot 32对应Windows CE中每个进程的32MB虚拟地址空间,其中Slot 2通常被Filesys.exe占用。也就是说,理论上在Windows CE中最多可以有30个用户进程,对应Slot 3到Slot 32。但实际上通常的Windows CE除了NK.exe和Filesys.exe还会产生很多进程,因此用户实际可以用的进程数大大少于30个。

Slot 33到Slot 63对应的虚拟地址空间是0x4200 0000到0x7FFF FFFF。这块虚拟内存是由所有进程共享的,由于每个进程只有32MB的虚拟地址空间,如果应用程序希望使用更多的虚拟内存,就可以在这个范围内申请。这个范围包括对象存储和内存映射文件。此范围内的最后一个Slot从0x7E00 0000到0x 7FFFF FFFF,也就是Slot 63,用来存放纯资源DLL,如果某个DLL里面只有资源信息(例如图标,位图,菜单,对话框,字符串表等等),这个DLL就会被加载到这个空间内。

 

 

 

 

从0x8000 0000开始是Windows CE内核使用的虚拟地址空间。虚拟地址0x8000 0000到0x9FFF FFFF一段用来静态映射所有的物理地址。也就是说Windows CE会把所有的物理内存一比一的映射到这段虚拟地址上。这段地址一共有512MB,这也就是Windows CE所支持的物理地址的最大值为512MB的由来。

虚拟地址0xA000 0000到0xBFFF FFFF会重复映射所有的物理内存,如图所示。这一段对物理内存的映射与0x80000000一段最大的不同是从0x8000 0000开始的一段物理内存是有缓冲的,而从0xA000 0000开始的一段是没有缓存的。通常,缓冲可以提高系统的I/O效率,但是对于一些OAL或者Bootloader中的设备驱动程序来说,使用缓冲有可能会造成灾难性后果,因为缓冲有可能会更改我们对设备的写操作顺序。因此在驱动程序中我们如果需要直接访问设备I/O或寄存器,我们通常使用0xA000 0000一段物理地址。

Windows CE虚拟内存模型_第2张图片

从0xC200 0000到0xC3FF FFFF是Slot 97,这个Slot是Windows CE的核心进程NK.exe专用的。可见实现Windows CE操作系统的一些主要功能的NK.exe本身的地址空间还是在核心态中的。

从0xE000 0000到0xFFFF FFFF一段最高的地址是内核使用的地址空间。对于不同的处理器体系结构这里保存着不同的东西。通常会放置一些供虚拟内存用的页表,中断向量表等等内核使用的数据结构。

下面我们就Slot 0来看看一个进程中虚拟地址空间的使用情况。在一个进程的32MB虚拟地址空间中,最低的64KB地址,也就是0x0000 0000到0x0001 0000是用来捕获野指针,通常是空指针NULL的。如果某个指针访问了低于64KB的内存区域,Windows CE就可以捕捉这个错误。但是这样并不能捕获代码中所有的野指针。

64KB之上是进程的代码和数据,以及一些堆和栈。进程申请虚拟内存是从低地址往高地址增长的。从32MB虚拟地址空间最高地址开始,存放的是进程加载的ROM DLL的读写数据以及RAM DLL的数据(ROM DLL的代码对所有进程来说可以共享一个拷贝,放在Slot 1中,但对于DLL的数据,就不得不为每个进程设立单独的拷贝),DLL代码和数据的增长是从高地址往低地址增长的。如果这两个高低增长相撞,就预示着进程已经耗尽了它的虚拟地址空间。尽管这个时候有可能我们还有多余的物理内存,但是我们已经没法使用它了。因为进程的虚拟地址空间已经用完了!

Windows CE虚拟内存模型_第3张图片

你可能感兴趣的:(内存管理)