5.WinCe内存管理
它的内存通常有RAM和ROM组成。ROM的内容是有厂商决定,包括系统和自带的一些应用程序;ROM中的程序可以被指定为本地运行,不需要装载到RAM中。RAM可以分为可改变大小的程序内存和对象存储区域。程序区中存放着运行程序的堆和栈的空间。对象存储和程序区的界限是可以移动的。RAM中的对象存储区可以被看做一个永久的虚拟RAM盘。
存储在ROM中的程序可以被设计成本地执行(XIP = Execute in place 本地执行)。
XIP执行方式的优点:不会占用嵌入式系统中的RAM资源;由于省去了释放到RAM的过程,程序启动时间将大为缩短;减少RAM,节约产品的成本。
缺点:由于ROM的CPU访问速度远远低于RAM的访问速度,因此程序执行的速度相对较慢。
虚拟内存:
WinCE.NET中,系统可以管理512M的物理内存和4GB的虚拟地址空间,把4GB的虚拟地址控件划分为两部分,0x8000 0000 以上(2GB)的工内核使用,0x8000 0000 以下的空间仍供应用程序使用。
系统采取的是分页式虚拟存储(Paged Virtual Memory System)
虚拟页面的3种状态:
未使用的free 可以被分配的虚拟页面
保留的reserved 指该页面已经被预定,他的虚拟地址空间不能再分配给操作系统或者另外一个进程的线程。
占用的committed 占用的虚拟页面已经被一个程序占用、保留的虚拟页面。他已经被直接映射到了实际的物理地址空间。
分配和预定保留虚拟内存
LPVOID VirtualAlloc(LPVOID lpAddress, DWORD dwSize, DWORD flAlloactionType, DWORD flProtect)
lpAddress:参数lpAddress 为虚拟地址空间的首地址,如果设置为0,内核将自动查找一个符合要求的首地址。
dwSize: 参数为空间的大小
flAllocationType:为分配类型,下面的一种组合:
MEM_COMMIT:为程序分配将要使用的内存空间
MEM_AUTO_COMMIT:内存块中的页被自动的提交
MEM_RESERVE:为程序分配将要被提交的虚拟地址空间(也就是被保留的虚拟地址)
MEM_TOP_DOWN:告诉系统在为程序分配虚拟地址空间的时候,尽量从空闲区域的顶部开始分配
flProtect:为分配的虚拟地址空间设置保护标志,一下几种模式:
PAGE_READONLY:区域被设置成只读。当一个应用程序试图向这个区域中的页写入数据的时候,这个访问控制策略将发挥作用
PAGE_READWRITE:区域被设置成可读、可写的
PAGE_EXECUTE:区域中包含可以被系统执行的代码。当试图从这个区域读取或者写入数据的时候,会引起访问冲突
PAGE_EXECUTE_READ:区域中包含可以执行的代码,并且只允许应用程序从这个区域读取数据
PAGE_EXECUTE_READWRITE:区域中包含可以执行的代码,并且程序可以读取和写入数据
PAGE_GUARD:需要和其他属性配合使用。当首次访问虚拟空间的时候,将会引起STATUS_GUARD_PAGE异常,当再次访问这个区域的时候,就会按照其他的属性来执行。
PAGE_NOACCESS:不允许任何程序访问虚拟内从空间
PAGE_NOCACHE:停用页面的告诉缓存
释放虚拟内存
WinCE中释放虚拟内存的函数是
BOOL VirtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType)
lpAddress:为需求释放的虚拟内存的首地址
dwSize:为需要释放的虚拟内存的大小
dwFreeType:为指定的释放类型,有下面两种:
MEM_DECOMMIT:函数将释放和这个虚拟内存空间相映射的物理内存,但是保留着这块虚拟地址空间
MEM_RELEASE:函数在释放物理内存的同时,也释放掉这块虚拟地址空间
当使用VirtualFree函数释放虚拟内存的时候,要保证内存中的所有页面都处于同一状态
更改虚拟内存空间的访问权限
BOOL VirtualProtect(LPVOID lpAddress, DWORD dwSize, DWORD flNewProtect, PDWORD lpflOldProtect)
lpAddress:为需要重新定义访问权限的虚拟内存的首地址
dwSize:为虚拟内存的大小
flNewProtect:为新定义的访问权限
lpflOldProtect:和flNewProtect相对应,lpflOldProtect为原来虚拟地址空间中的第一个页面的保护标志
查询一个虚拟地址空间的保护权限
DWOR VirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, DWORD dwLength)
lpAddress:为被查询虚拟地址空间的首地址
lpBuffer:PMEMORY_BASIC_INFORMATION结构的指针
dwLength:PMEMORY_BASIC_INFORMATION结构的大小
PMEMORY_BASIC_INFORMATION的结构为:
typedef struct_MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
PVOID AllocationProtect;
PVOID RegionSize;
PVOID State;
PVOID Protect;
PVOID Type;
}PMEMORY_BASIC_INFORMATION;
参数含义:
BaseAddress:是查询函数VirtualQuery的基地址
AllocationBase:是用VirtualAlloc函数分配内存时,实际分配的基地址;说明BaseAddress一定包含在AllocationBase分配的范围内。
AllocationProtect:是指分配该页面时页面的一些属性。如PAGE_READWRITE,PAGE_EXECUTE等
RegionSize:是指从BaseAddress开始,具有相同属性页面的大小
State:指的是页面的状态。有释放,预定,和提交三种方式
Protect:是指当前虚拟地址空间的保护标志
Type:是指内存空间的类型。主有一下几种:
MEM_PRIVATE:应用程序空间中包括私有数据
MEM_MANPPED:虚拟地址空间和内存映射文件向匹配
MEM_IMAGE:虚拟地址空间和一个EXE或者DLL类型的文件匹配