WinCe.Net中的内存管理

5.WinCe内存管理

它的内存通常有RAMROM组成。ROM的内容是有厂商决定,包括系统和自带的一些应用程序;ROM中的程序可以被指定为本地运行,不需要装载到RAM中。RAM可以分为可改变大小的程序内存和对象存储区域。程序区中存放着运行程序的堆和栈的空间。对象存储和程序区的界限是可以移动的。RAM中的对象存储区可以被看做一个永久的虚拟RAM盘。

存储在ROM中的程序可以被设计成本地执行(XIP = Execute in place 本地执行)。

XIP执行方式的优点:不会占用嵌入式系统中的RAM资源;由于省去了释放到RAM的过程,程序启动时间将大为缩短;减少RAM,节约产品的成本。

缺点:由于ROMCPU访问速度远远低于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:为被查询虚拟地址空间的首地址

lpBufferPMEMORY_BASIC_INFORMATION结构的指针

dwLengthPMEMORY_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类型的文件匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值