MyException - 我的异常网
当前位置:我的异常网» WinCE » :WinCE怎么管理内存的

:WinCE怎么管理内存的

www.myexceptions.net  网友分享于:2013-03-20  浏览:53次
紧急求助: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同理。

文章评论

Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
旅行,写作,编程
旅行,写作,编程
一个程序员的时间管理
一个程序员的时间管理
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员应该关注的一些事儿
程序员应该关注的一些事儿
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员都该阅读的书
程序员都该阅读的书
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员的鄙视链
程序员的鄙视链
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
10个调试和排错的小建议
10个调试和排错的小建议
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Java程序员必看电影
Java程序员必看电影
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
编程语言是女人
编程语言是女人
我的丈夫是个程序员
我的丈夫是个程序员
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
那些争议最大的编程观点
那些争议最大的编程观点
中美印日四国程序员比较
中美印日四国程序员比较
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
为什么程序员都是夜猫子
为什么程序员都是夜猫子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
如何成为一名黑客
如何成为一名黑客
我是如何打败拖延症的
我是如何打败拖延症的
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
 程序员的样子
程序员的样子
代码女神横空出世
代码女神横空出世
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
老程序员的下场
老程序员的下场
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有