紧急求助:WinCE如何管理内存的?

来源:百度知道 编辑:UC知道 时间:2024/05/15 12:06:57
我在看“Windows CE程序设计(第一版)”书上的很多内容很是不了解。
有如下问题,请大家勿必解答,本人感激不尽!!

第一个问题:
=====================================
书上说:WinCE创造一个独立的被所有程序共享的4GB虚拟地址空间。
还有一些零碎的文字:
(1)WinCE为所有的应用程序实现了单独的2GB的虚拟地址空间。
(2)稍微有超过一半的虚拟地址空间被分成33个32MB大小的“槽”。
(3)虽然所有程序共享单一地址空间,应用程序仍然可避免相互误用。
(4)WinCE通过改变每页的保护来保护程序内存。

以前文字都是我各处找来的,我很是不理解。
即然,所有程序共享的4GB虚拟地址空间,那么为什么还有一句“WinCE为所有的应用程序实现了单独的2GB的虚拟地址空间”,
这二句矛盾啊?
第(3)句,系统是怎么避免应用程序相互误用的呢?(第4句就答案),但我想要具体的是怎么做的,有例子更好!
总之,这4句话,很不理解,感觉很矛盾,如果能有一个详细的说明就好了。
=====================================

第二个问题:
=====================================
怎么可以找到一个进程的“代码区”,“静态数据区”,“资源数据区”,“堆栈”,“本地堆”的内存范围。
比如说:“代码区”是0x00010000-0x00015400这块内存地址,其它以此类推。
我怎么可以找到这些区的边界呢?
=====================================

就二个问题,大家能答多少就答多少,贵在参与,在此先谢过了。

即然,所有程序共享的4GB虚拟地址空间,那么为什么还有一句“WinCE为所有的应用程序实现了单独的2GB的虚拟地址空间”

据我所知,win32下,通用寄存器是32位,1个程序可以采用32位地址线寻址。也就是2的32次方,就是4GB.这4GB是每个程序都独立私有的。因为8036采用了内存分页机制。系统占用2G左右的虚拟空间。剩下不到2G的空间给用户使用。WinCE 也是32位操作系统都同样支持4GB的虚拟地址空间。

windows内存映射实现中,地址空间中的每个页面在任一时刻有3种情况:1,空闲的,2,保留的,3,已经提交物理内存的。这些页面由操作系统交换进出内存。内存中某1个页面不再需要时,操作系统取消原来拥有该页面的应用程序对它的控制权,并且释放这个页面后供其他应用程序使用。使用内存映射文件,可以实现进程间共享数据。

========================================

汇编里:
CreateFile获得文件句柄。得到hFile.

GetFileSize.

CreateFileMapping创建1个内存映射文件对象,传入hFile,得到hFileMap

MapViewOfFile.得到指向映像到内存的第一个字节的指针lpMemory.

mov esi,@lpMemory

assume edi:ptr IMAGE_SECTION_HEADER 关联lpMemory指向节区。

//获取节区名称(.text/.data/.rsrc(资源段)等)
local @szSectionName[16]:byte

invoke RtlZeroMemory,addr @szSectionName,sizeof @szSectionName
push esi
push edi
mov ecx,8
mov esi,edi
lea edi,@szSectionName
cld
@@: