我们将对Windows CE 中,储存管理采用的内存分配、回收、虚拟内存映像、调页等机制一一作深入的探讨。
在 Windows CE 系统中,内存的实体结构大致可分为RAM 和ROM 二种内存。在 Windows CE 系统中,RAM 被分为程序空间 (program memory) 和对象空间(object store)。程序空间和一般计算机系统中RAM 的使用类似,用来储存执行程序及所需数据。对象空间则类似一般计算机系统中的硬盘,用来储存应用程序及档案。。程序空间和对象空间的大小是可以调整的。若是Windows CE 发现处理程序 (process) 的内存空间不敷使用的情况下,Windows CE 会要求使用者释放一些对象空间的内存来满足程序空间的需求。
对象空间中存放的数据可分为三大类 : (1) 档案系统 (file system),(2) 注册信息(registry),(3) Windows CE 数据库 (Windows CE database)。
Windows CE 系统的电源管理机制,即使在关机状态时,仍旧有少量的电力供应RAM,以保留储存在其中的数据。只有在电池电力完全耗尽时,RAM 中储存的数据才会消失,而当系统重新获得电力时,一切的数据与软件都必需新加载。
在 Windows CE 系统中,ROM 储存了包含操作系统在内相关的档案。系统程序执行则分为两种模式 : RAM 执行模式和ROM 执行模式。一般的系统程序执行
采用RAM 执行模式,操作系统会先把程序从ROM 中取出,加载RAM 中执行。RAM 执行模式因为牵涉到程序拷贝,有执行效率差及占用RAM 内存空间等缺点。为此,Windows CE 提供XIP (Execute in Place),也就是ROM 执行模式,使得储存在ROM 中的系统程序,可以在指定的ROM 地址中直接执行,而不用加载RAM 中。
虚拟内存管理
虚拟内存
计算机程序的运算大多是在循环 (loop) 结构内完成。循环执行时所表现出来的地址局限性 (address locality) 及空间局限性 (space locality),使得执行程序所需
的物理内存空间远比程序代码本身小,且同一时段内,只需加载一小部分的数据结构即可。为了程序设计师撰写程序方便,操作系统一般都将程序内存空间与物理内存空间分开。这里所称的程序内存即是虚拟内存。物理内存内所使用的地址称为实体地址 (physical address),而虚拟内存内所使用的地址称为虚拟地址(virtual address)。
分页机制
Windows CE 将4GB 虚拟地址空间分为低地址2GB 及高地址2GB。应用程序使用的地址空间为低地址2GB,高地址2GB 专供Windows CE核心模块使用。Windows CE 操作系统使用KDataStruct 数据结构来存放低地址2GB 内的数据。在 KDataStruct 数据结构中,又利用PSECTION aSections[64] 将低地址 2GB 分割成64 个32MB 大小的空间,称之为Section。一个Section 再被分割成512 个64KB大小的空间,称之为MemBlock,一个MemBlock 再被分割成数个页 (Page)。页的大小 (PAGE_SIZE) 在不同的系统中略有不同。ARM4处理器的PAGE_SIZE 为4096,ARM920 的PAGE_SIZE 为1024,MIPS 及x86处理器的PAGE_SIZE 则为4096。若以PAGE_SIZE = 4096,一个MemBlock 可被分割成16 个页。
Windows CE 从低地址的2GB 起始地址开始的连续地址,划分出33 个32MB 的内存空间,称之为”slot”,等同于前述的前33 个SECTION,当处理程序要执行
前,Windows CE 将处理程序加载至slot 中执行,特别需要注意的是,slot 0 保留给目前正在执行的处理程序使用,其余的slot 则留给非正在执行的处理程序使
用。因此,Windows CE 系统中,最多只能有32 个处理程序同时进行。
SLOT 0
DoVirtualAlloc()
Windows CE 系统配置内存有两种方式 : 保留(MEM_RESERVE) 和 提交(MEM_COMMIT)。这两种方式的差别在于保留只会保留虚拟页给处理程序,而提交不仅给予处理程序虚拟页,更会于物理内存取得对应页。DoVirtualAlloc() 可以根据使用者对内存的要求,如保留、提交,执行保留虚拟内存或是抓取实体页并填入页表 (page table)。WINCEROOT\PRIVATE\WINCEOS\COREOS\NK\KERNEL\virtmem.c
物理内存管理
可用内存串行用以记录目前系统中尚可使用的内存,可由LogPtr->pKList 找到串行。可用内存串行采用简单的双向链接串行形式。
操作的函数
LinkPhysPage();GetHeldPage();GrabFirstPhysPage();FreePhysPage();GetContiguousPages();
实体页抓取流程
在虚拟内存的映像过程中,要进行实体页的抓取,这个过程分为两个步骤,第一步是检查物理内存是否满足需求,如果配置导致物理内存极度减少,则启动CleanUp 执行绪,并向系统发出警报。如果配置后实体页数低于某个阈值,则削减执行绪PthScavTarget 的堆积(stack),如果可以满足,那么标记配置并警告GWE内存不足,这部分原始码定义在函数HoldPages 中。
第二步,标记之后,由 GetHeldPage 函数得到所需的实体页,该函数主要呼叫GrabFirstPhysPage 从可用内存链接串行中摘出一个实体页。
ProcessPageFault()
ProcessPageFault 函式处理存取页内存时发生的错误,产生的原因可能为:
.虚拟内存地址没有实体页映像
.存取权限不允许此动作
.无效虚拟内存地址
在ProcessPageFault定义了这几种情况下相应的处理方法。首先检查该虚拟内存地址是否有效,再检查当前处理程序是否对该地址有权限,最后根据该block 的类型决定呼叫函式,如果是mapper 则呼叫MapperPageIn,如果是处理程序地址空间则调用LoadPageIn,每次呼叫若不成功,则重复,2 秒钟以后超时,传出错误讯息
堆栈(Heap)
当处理程序执行时,需要静态或动态配置内存,如宣告变量或宣告指针,此时所需的内存小,不应配置一个页面而造成内存的浪费,堆栈因此而生,系统可以利
用堆栈对处理程序做较少的内存配置,而使用者不需了解系统的内存配置。处理程序可以利用堆栈申请大小比页小很多的内存,一旦申请了堆栈,系统会根据处
理程序的需要自动增加堆栈的大小,而释放堆栈的时候,堆栈的削减也是由系统自动完成的。在Windows CE 中,系统对堆栈的管理只允许申请固定大小的块。这样做的好处是简化了对堆栈中各个块的管理,代价是在程序运行过程中不断的分配和释放会出现很多碎片,会导致只要堆栈没有被完全释放,还会保留大量的虚拟页的情况。在Windows CE 中,每个堆栈都有一个信号(signal)来控制顺序存取,两个处理程序同时对堆栈执行动作是不允许的。
本地堆栈(Local Heap)和独立堆栈(Separate Heap)
在缺页情况下,系统保留384 个页作为本地堆栈,这些页只有在分配的时候才会被提交,如果应用程序需要的本地堆栈超过384 页,系统会自动分配其余的
空间,不过这些空间可能在虚拟地址上并不相邻而产生碎裂,因为系统的堆栈分配只支持固定大小的块。为了避免碎裂的出现,在申请要反复分配和回收的储存空间时,使用者最好对每个申请使用独立堆栈。独立堆栈的分配是以slot 为界限的,系统不允许应用程序申请的堆栈耗尽其它处理程序所拥有的32MB 虚拟地址空间。
堆栈的逻辑结构
逻辑地址是虚拟内存地址的名称,而逻辑结构就是虚拟地址的结构。处理程序分配储存空间的基本单位是堆栈。每个堆栈维护着一个虚拟地址项(VAitem)
和区域(region)的链接串行。项的大小可变,是实际进行分配时的最小单位。项和项之间在虚拟地址上是相邻的,所以项只在链接串行头记录该项的大小,下
一个项就可以顺着这个值找到。为了便于对项的管理,系统还定义了单位更高的区域,区域是一段连续的项的空间,也是虚拟地址分配和回收的基本单位,记录
了区域中最大的项的大小以及所属的堆栈,这样在查找可用内存项的时候可以提高效率,并且可以用很大的单位申请虚拟地址空间和提交已保留的空间。虚拟地
址项是为了在分配大空间时直接使用的,因为单位大,所以不必包含在区域中,而直接由堆栈来维护。
堆栈的创建和初始化
HeapCreate(DWORD flOptions, DWORD dwInitialSize, DWORD dwMaximumSize);
堆栈的分配和回收(省略)
Windows CE 的保护和共享机制
在页表中,每个项目的长度都是32 位。事实上,页表中并不需要储存offset的信息,因此Windows CE 利用offset 的12 位作为保护的机制,这也代表Windows
CE 对内存的保护是以页为单位,并且可利用TestAccess 函式作安全性的检查,及VirtualProtect 函式得到或设置一个虚拟地址区域的存取权限。
在 Windows CE 中页的共享在两个层次实现。在逻辑储存层,实现处理程序之间的内存共享,通过建立共享堆栈来实现。在虚拟内存管理的层次,系统通过直接
将不同的虚拟地址映像到同一实体地址来实现内存共享,主要实现一些处理程序间通讯的系统呼叫。
堆栈共享,虚拟内存共享
浙公网安备 33010602011771号