首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

:WinCE怎么管理内存的

2012-03-19 
紧急求助:WinCE如何管理内存的?我在看“Windows CE程序设计(第一版)”书上的很多内容很是不了解。有如下问题,

紧急求助:WinCE如何管理内存的?
我在看“Windows CE程序设计(第一版)”书上的很多内容很是不了解。 
有如下问题,请大家勿必解答,本人感激不尽!! 

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

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

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

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

[解决办法]
第一个问题,
共享的4GB内存空间实际上是2GB+2GB。其中一个2GB是应用程序的地址空间 Slot0, 另外一个是共享的地址空间 Slot1
每一个应用程序都能访问单独的2GB空间,但是实际上任何一个时刻只有1个程序在执行,也就是说任意时刻只有一个应用程序在访问虚拟地址空间。
WinCE 把每一个正在执行的的程序放到 Slot0, 此时该程序可以访问 Slot0 和 Slot1。
WinCE 把当前正在执行的内存页面按照4k的小页来映射,对当前未使用其它空间按照大页面来映射。

第二个问题
参看PE文件格式。

[解决办法]
Windows CE 的 Memory Management, 在 6.0 時有了很大的改變, 但說到 Slot, 那麼 LZ 應該是在說 5.0 (含) 以前的架構
1. 0x00000000 ~ 0x7FFFFFFF, lower 2GB, 是 user space, 0x80000000 ~ 0xFFFFFFFF, upper 2GB 是 kernel space, user mode 的 instance 是不能直接存取 kernel space 的位址.

2. 分為 32 “槽”(slots) (1~32), 故同時只能執行 32 個 process, 每個 slot 佔 32MB. slot0 (0x00000000 ~ 0x02000000) 是一個特殊的 slot, 它是透過 MMU 的機制, 將目前正在執行的 Slot 的位址也映射到 slot0, 也就是 Scheduler 排程到正在執行的 Thread 所在的 process 所佔的 slot, 如此一來, 所有的 process 都會有一個錯覺, 認為它自己都是在 Slot0 執行.

3. 所有的 process 都可以存取 slot0 的空間 (0x00000000 ~ 0x02000000), 但若是存取到別的 slot 時, 若是沒有 permission, 則會產生 access violation, 不然就是要透過 MapPtrToProcess 將另一個 slot 的位址對映到目前的 slot, 或是 SetProcPermissions 來取得另一個 slot 的 permission.

這東西要說清楚, 大概要 1-2 小時, 可寫一個 Chapter 了.

Paul, Chao @ Techware
[解决办法]

探讨
还有一个问题。

CE下共33个slot ,分别对应32个进程。
每个slot对就一段内存地址。

假如slot 1的内存范围是0x001-0x005
slot 2的内存范围是0x006-px010

再假设进程A运行在slot1中,进程B运行在slot2中。
那么进程B中的一个指针指向0x003地址,那是不是,这个指针就指向了进程A的地址空间了呢?


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


之前曾经看过一些LINUX内存管理的书籍,原理差不多是相似的。
LINUX为每个进程提供4GB的虚拟地址空间,其中,0-3GB是用户空间而高1GB是内核空间。
OS为每个进程分配一个PCB,而这个PCB中有个重要的结构块就是VMA = Virtual Memory Area。VMA中有一个地址映射表提供给硬件MMU使用。应用程序中所使用的地址,并不是真正的物理地址,而是要经过MMU映射得到的虚拟地址。OS为每个进程分配了一个地址映射表,因此每个进程都可以享有3GB+1GB的地址空间。Wince同理。

热点排行