15164|54

55

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

紧急求助:WinCE如何管理内存的? [复制链接]

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

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

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

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

就二个问题,大家能答多少就答多少,贵在参与,在此先谢过了。
此帖出自WindowsCE论坛

最新回复

所有程序共享的4GB虚拟地址空间,其中内核占用了2G空间,应用程序分配了2G,在6.0中,其实进程只有1G的应用程序空间,其余的1G是被进程所共享的。 系统是怎么避免应用程序相互误用的呢?看看Demand paging吧。。就能找到答案。  详情 回复 发表于 2009-8-31 17:12
点赞 关注
 

回复
举报

55

帖子

0

TA的资源

一粒金砂(初级)

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

第二个问题
参看PE文件格式。
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
第一个我也想了解,我曾经试图了解,结果发现自不量力,必须对操作系统有深刻的认识才行。先看几本好的操作系统的书再重新去看看代码才行。

第二个:这个在编译的时候就指定了。你用dumpbin /exports XXX.dll 看看

这些东西都和计算机软硬件相关。实在难。
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
[url=http://msdn.microsoft.com/en-us/library/bb331824.aspx][/url]
                         ---------msdn ce6.0 内存管理

其它高手点破......
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

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


WinCE是多任务的呀?你所说的“任何一个时刻只有1个程序在执行”是指的CPU指令级的吗?
“WinCE 把每一个正在执行的的程序放到 Slot0“,如果有二个程序同时运行呢?系统如何转换?
此帖出自WindowsCE论坛
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(中级)

6
 
多任务是分时执行的,不是并行的。
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
另外,Slot0是当前进程!
这个当前进程指的是什么?
是当前具有焦点的窗口的程序吗?如果是的话,那么后台运行的程序又做何解释?

或者这个Slot0就是指的本程序的槽?

如果我已知一个进程的ID或进程句柄,我如何能知道它在哪个”槽“里?

此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
上次听微软的人讲了下,大概明白了WinCE5.0 和 WinCE6.0 的内存管理模式。
实际上就是楼上说的这个网址里面的东西
http://msdn.microsoft.com/en-us/library/bb331824.aspx
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 xajhuang 的回复:
上次听微软的人讲了下,大概明白了WinCE5.0 和 WinCE6.0 的内存管理模式。
实际上就是楼上说的这个网址里面的东西

这位兄弟,你看的是MSDN WebCast吧?
课程的名称是什么?或地址?我也想看看,实在搞不懂CE的内存布局。
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
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
此帖出自WindowsCE论坛
 
 
 

回复

38

帖子

0

TA的资源

一粒金砂(初级)

11
 
楼上的这位兄弟,你很强。。英文强,技术也强。嘿嘿。
不过通过你的讲解我理解了。
我想搜索别的进程的地直空间。。

如你所说: 但若是存取到別的 slot 時, 若是沒有 permission, 則會產生 access violation
我怎么可以通过一个进程ID或进程句柄,知道这个进程在哪个slot呢?然后访问它。
此帖出自WindowsCE论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
还有一个问题。

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

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

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

回复

71

帖子

0

TA的资源

一粒金砂(初级)

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

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

是的



通常這個位址是不會無緣無故得到的, 通常是由另一個 process 傳來的, 故可用 MapCallerPtr 等 api 對映到原來的位置.

Paul, Chao @ Techware
此帖出自WindowsCE论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

14
 
> 学习了.
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

15
 
谢谢几位,我明白了。。。

不过大家每解达一个问题,我就会产生一个新的疑问,看来这还真是三言二语难说清的。。

大家有没有这方面的比较全的文章(或书也行)(中文的)?
就是对CE对内存管理及内存布局等方面的资料。。。
此帖出自WindowsCE论坛
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

16
 
找本好点的操作系统书看,原理都差不多
此帖出自WindowsCE论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 14 楼 MS_Frank 的回复:
谢谢几位,我明白了。。。

不过大家每解达一个问题,我就会产生一个新的疑问,看来这还真是三言二语难说清的。。

大家有没有这方面的比较全的文章(或书也行)(中文的)?
就是对CE对内存管理及内存布局等方面的资料。。。

可以去看看 m$的 webcast讲座
此帖出自WindowsCE论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

18
 
有相关讲座吗?
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

19
 
paul_chao 讲的比较好,
对于初学者来说,先看几本书最好,先把基础打好,再说提高的话。
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

20
 
这个。。。。。。
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表