紧急求助: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
[解决办法]