3438
- 收藏
- 点赞
- 分享
- 举报
Wince 内存管理
Windows ce 是一个保护模式的32位操作系统,支持一个32位线性访问的地址空间。与春他桌面Windows操作系统相比,Windows ce操作系统运行所需要的实际物理内存要少得多,尽管如此,由于Windows ce嵌入式实时性的特点,Windows ce提供了完备的内存管理功能,它几乎实现了Windows xp下所有可用的Win32内存管理API,并支持虚拟内存分配、本地堆和栈、内存映射文件等。另外,由于Windows ce要求更少、更有效地使用内存,所以Windows ce对内存的使用与其他桌面Windows操作系统相比有着很大的差别。
ROM和RAM
Windows ce被设计成为一个ROM+RAM的文件系统,它无缝地集成了基于ROM的应用和基于RAM的数据。
在Windows ce下,RAM被分成对象存储和程序内存两块区域。对象存储就象一个永久的虚拟RAM盘,当系统挂起或软件重置时,对象存储可以保扩存储在RAM里的数据永不丢失。采用这种设计是因为像Pocket PC这样典型的Windows ce系统一般 有主电池和后备电池两个电源,当主电池电量低,用户更换主电池时,后备电池的工作是为RAM提供电源以维持在对象存储里的数据,发现并使用它。对于没有后务电池的ce设备,可以使用蜂窝注册表在多次引导过程中保存数据。
程序内存是由全部RAM除去对象存储剩下的部分,它像pc中的RAM一样,用于为运行的应用程序保存堆和栈。对象存储和程序内存之间的边界是可以移动的,用户可以在ce系统的控制面板中通过移动滑动条来更改它们之间的分配比例。在ce设备低内存的情况下,操作系统会提示用户将对象存储RAM用做程序RAM以满足应用程序对RAM的需求。
在pc中,ROM被用来存储BIOS,一般为64~128KB,而在Windows ce系统中,ROM的大小可能达到32MB甚至64MB,可用来存储整个windows ce操作系统以及与操作系统捆绑到一起的应用程序。从这个意义上,Windows ce下的ROM更像一个只读的小硬盘。
存放到ROM中的模块或文件可以是压缩的,也可以是不压缩的,这取决于OEM的设置,对于未压缩的DLL或EXE文件,Windows ce操作系统可以直接在ROM里就地执行,简称XIP。这些DLL或EXE文件,而不必将它们先加载到内存然后再执行。这样做的好外是节省了宝贵的RAM空间,减少了EXE或DLL的启动时间。对于那些保存在对象存储或Flash存储卡里的程序,Os不会就地执行他们,必须先将它们复制到RAM,然后再执行。
虚拟内存模型
Windows ce是一个保护模式的操作系统,因此程序的访问只能使用虚拟内存。Windows ce对整个系统实现了一个线性的32位的虚拟地址空间,它由Windows ce操作系统启动时创建,并由MMU进行管理。因此,在内核初始化和启动MMU之前,不能使用虚拟地址,而必须由CPU编址物理地址。这意味着在Boot Loader和OAL中的部分内存访问不能使用虚拟内存,而必须使用物理内存。也就是说,虚拟地址是指当MMU活动时,由CPU引用的任何地址。在实际系统中,任何有效的虚拟地址都必须映射为能够用于识别一个物理资源(ROM、RAMM、CPU寄存器等)的物理地址。
Windows ce提供的4GB的虚拟地址空间被分为2个2GB的区域:上面为2GB的内核空间,下面为2GB的用户空间。内核空间是专门为内核使用而保留的,只能由具有kmode优先权的线程访问,而用哀悼空间是为运行用户应用程序准备的,可以由除了进程空间保护限制的所有线程访问。用户空间被分为64个32MB的Slot,其中Slot1-Slot32保留给要加载的每一个进程,Windows ce系统最多同时可以运行32个进程,每个进程将占有一个Slot;而Slot0是一个特殊的Slot,当前正在运行的进程总是被映射到Slot0.
虚拟地址映射
在Windows ce中有两种类型的地址:物理地址和映射的虚拟地址。
物理地址是需要被操作系统访问的实际的RAM或设备存储器,它由来自于CPU的物理地址定义,一旦MMU启动,CPU就不能直接访问。内核只能管理512MB的物理内存。
映身的虚拟地址定义了由用户模式和内核应用程序使用的虚拟地址和物理地址之间的映射。映射的虚拟地址有两种类型:静态映射的虚拟地址和动态映射的虚拟地址。静态映射击的虚拟地址为内核提供了一个虚拟地址到物理地址的映射表,这个映射表在系统引导时创建且不随时间而变化。OEMAddressTable定义了ARM和X86CPU这种静态虚拟地址与物理地址的映射,动态映射是一种在不需要时可以释放的一种虚拟地址到物理地址的映射。
内核地址空间包含了静态映射的虚拟地址、NK.exe进程空间和其他内核映射。512MB之上的物理资源都可以被映射到主要的静态映射区域内。对于ARM和X86架构的CPU来说,在Windows e内核的启动过程中内核会将系统所有的物理内存地址全部映射到0x8000 0000以上的虚拟地址空间中以供内核以后使用,这种物理地址到虚拟地址的映射是由OEM的OAL中通过OEMAddressTable来定义的。
静态映射允许OAL,尤其是中断服务例程ISR访问连接到系统的设备。物理的内存块在被映身到虚拟地址空间时,通常被映射两次,分别映射到两个不同的区域,位于512MB使用缓冲的区域和512MB不使用缓存(Uncached)的区域,OEMAddressTable负责创建第一个基于Cached的映射,而操作系统负责自动创建第二个基于Uncached的映射。
用户地址空间
用户地址空间被分为64个32M的Slot,所有进程分享这个地址空间。在Windows ce内核中,Slot是虚拟地址维护的基本单元。在从Slot0到Slot63的64个Slot中,前面的33个Slot用于进程,剩下的Slot用于对象存储、内存映射文件和资源映射。
Slot0是一个特殊的slot,它对应当前正在运行的进程,slot1至slot33每一个都代表一个当前正在运行的进程,这表示在Windows ce系统中,同一时间最多可以有32个进程运行。当一个进程启动时,内核在这些Slot中为这个进程选择一个打开的slot一个线程只能访问属于自己进程空间内的地址,只有在自己的进程slot内才有访问权限。对象存储是受保护的,不允许从文件系统之外访问对象存储,而内存映射击文件和DLL资源却可以被不同进程内的所有线程访问。
值得注意的是虚拟空间是按照64KB的区域进行分配的,也就是说所有虚拟地址的分配都是以64KB对齐的,而实际物理内存以页为计量单位给虚拟空间分配提交物理内存。页是物理内存分配的最小单位,一页的大小取决于CPU的类型,为4KB或1KB。另外值得注意的一点是DLL虚拟空间的分配是从高地址向氏地址分配,而进程和一般的虚拟空间是从低地址向高地址分配。
虚拟空间按照64KB的区域进行分配,这种分配惊讶工对DLL的加载有极其微妙的影响,这是因为DLL的加载同其他虚分配一样需要从某一个64KB的虚拟地址空间,那么对于一个32MB的进程Slot,意味着一个进程最多可以加载512个DLL。在实际应用系统中,一个进程一般不可能会加载这么多DLL,但是,对于保存在ROM里需要就地执行的DLL来说,每一个进程都会在其进程空间里为这些XIP DLL保留执行空间,就好象每一个进程都要加载这些XIP DLL一样。一个具有网络连接的无头设备,其Windows ce操作系统映像包括大约100多个这样的DLL,而对于一个全特征的ce操作系统将会包括更多这样的DLL,所以很可能用完一个进程的进址空间。因此,为了避免这些ROL DLL使用进程的地址空间,从Windows ce 4.x版本后,以前那些在用户虚拟地址空间由内核执行的代码被移到了内核空间,同时所有的ROM DLL被映射到了一个单独的slot,即slot1,这样就为每一个进程释放了空间。由上面的分析可知,创建数据量更少而文件尺寸较大的DLL要比创建许多文件尺寸小的DLL要好得多。
ROM和RAM
Windows ce被设计成为一个ROM+RAM的文件系统,它无缝地集成了基于ROM的应用和基于RAM的数据。
在Windows ce下,RAM被分成对象存储和程序内存两块区域。对象存储就象一个永久的虚拟RAM盘,当系统挂起或软件重置时,对象存储可以保扩存储在RAM里的数据永不丢失。采用这种设计是因为像Pocket PC这样典型的Windows ce系统一般 有主电池和后备电池两个电源,当主电池电量低,用户更换主电池时,后备电池的工作是为RAM提供电源以维持在对象存储里的数据,发现并使用它。对于没有后务电池的ce设备,可以使用蜂窝注册表在多次引导过程中保存数据。
程序内存是由全部RAM除去对象存储剩下的部分,它像pc中的RAM一样,用于为运行的应用程序保存堆和栈。对象存储和程序内存之间的边界是可以移动的,用户可以在ce系统的控制面板中通过移动滑动条来更改它们之间的分配比例。在ce设备低内存的情况下,操作系统会提示用户将对象存储RAM用做程序RAM以满足应用程序对RAM的需求。
在pc中,ROM被用来存储BIOS,一般为64~128KB,而在Windows ce系统中,ROM的大小可能达到32MB甚至64MB,可用来存储整个windows ce操作系统以及与操作系统捆绑到一起的应用程序。从这个意义上,Windows ce下的ROM更像一个只读的小硬盘。
存放到ROM中的模块或文件可以是压缩的,也可以是不压缩的,这取决于OEM的设置,对于未压缩的DLL或EXE文件,Windows ce操作系统可以直接在ROM里就地执行,简称XIP。这些DLL或EXE文件,而不必将它们先加载到内存然后再执行。这样做的好外是节省了宝贵的RAM空间,减少了EXE或DLL的启动时间。对于那些保存在对象存储或Flash存储卡里的程序,Os不会就地执行他们,必须先将它们复制到RAM,然后再执行。
虚拟内存模型
Windows ce是一个保护模式的操作系统,因此程序的访问只能使用虚拟内存。Windows ce对整个系统实现了一个线性的32位的虚拟地址空间,它由Windows ce操作系统启动时创建,并由MMU进行管理。因此,在内核初始化和启动MMU之前,不能使用虚拟地址,而必须由CPU编址物理地址。这意味着在Boot Loader和OAL中的部分内存访问不能使用虚拟内存,而必须使用物理内存。也就是说,虚拟地址是指当MMU活动时,由CPU引用的任何地址。在实际系统中,任何有效的虚拟地址都必须映射为能够用于识别一个物理资源(ROM、RAMM、CPU寄存器等)的物理地址。
Windows ce提供的4GB的虚拟地址空间被分为2个2GB的区域:上面为2GB的内核空间,下面为2GB的用户空间。内核空间是专门为内核使用而保留的,只能由具有kmode优先权的线程访问,而用哀悼空间是为运行用户应用程序准备的,可以由除了进程空间保护限制的所有线程访问。用户空间被分为64个32MB的Slot,其中Slot1-Slot32保留给要加载的每一个进程,Windows ce系统最多同时可以运行32个进程,每个进程将占有一个Slot;而Slot0是一个特殊的Slot,当前正在运行的进程总是被映射到Slot0.
虚拟地址映射
在Windows ce中有两种类型的地址:物理地址和映射的虚拟地址。
物理地址是需要被操作系统访问的实际的RAM或设备存储器,它由来自于CPU的物理地址定义,一旦MMU启动,CPU就不能直接访问。内核只能管理512MB的物理内存。
映身的虚拟地址定义了由用户模式和内核应用程序使用的虚拟地址和物理地址之间的映射。映射的虚拟地址有两种类型:静态映射的虚拟地址和动态映射的虚拟地址。静态映射击的虚拟地址为内核提供了一个虚拟地址到物理地址的映射表,这个映射表在系统引导时创建且不随时间而变化。OEMAddressTable定义了ARM和X86CPU这种静态虚拟地址与物理地址的映射,动态映射是一种在不需要时可以释放的一种虚拟地址到物理地址的映射。
内核地址空间包含了静态映射的虚拟地址、NK.exe进程空间和其他内核映射。512MB之上的物理资源都可以被映射到主要的静态映射区域内。对于ARM和X86架构的CPU来说,在Windows e内核的启动过程中内核会将系统所有的物理内存地址全部映射到0x8000 0000以上的虚拟地址空间中以供内核以后使用,这种物理地址到虚拟地址的映射是由OEM的OAL中通过OEMAddressTable来定义的。
静态映射允许OAL,尤其是中断服务例程ISR访问连接到系统的设备。物理的内存块在被映身到虚拟地址空间时,通常被映射两次,分别映射到两个不同的区域,位于512MB使用缓冲的区域和512MB不使用缓存(Uncached)的区域,OEMAddressTable负责创建第一个基于Cached的映射,而操作系统负责自动创建第二个基于Uncached的映射。
用户地址空间
用户地址空间被分为64个32M的Slot,所有进程分享这个地址空间。在Windows ce内核中,Slot是虚拟地址维护的基本单元。在从Slot0到Slot63的64个Slot中,前面的33个Slot用于进程,剩下的Slot用于对象存储、内存映射文件和资源映射。
Slot0是一个特殊的slot,它对应当前正在运行的进程,slot1至slot33每一个都代表一个当前正在运行的进程,这表示在Windows ce系统中,同一时间最多可以有32个进程运行。当一个进程启动时,内核在这些Slot中为这个进程选择一个打开的slot一个线程只能访问属于自己进程空间内的地址,只有在自己的进程slot内才有访问权限。对象存储是受保护的,不允许从文件系统之外访问对象存储,而内存映射击文件和DLL资源却可以被不同进程内的所有线程访问。
值得注意的是虚拟空间是按照64KB的区域进行分配的,也就是说所有虚拟地址的分配都是以64KB对齐的,而实际物理内存以页为计量单位给虚拟空间分配提交物理内存。页是物理内存分配的最小单位,一页的大小取决于CPU的类型,为4KB或1KB。另外值得注意的一点是DLL虚拟空间的分配是从高地址向氏地址分配,而进程和一般的虚拟空间是从低地址向高地址分配。
虚拟空间按照64KB的区域进行分配,这种分配惊讶工对DLL的加载有极其微妙的影响,这是因为DLL的加载同其他虚分配一样需要从某一个64KB的虚拟地址空间,那么对于一个32MB的进程Slot,意味着一个进程最多可以加载512个DLL。在实际应用系统中,一个进程一般不可能会加载这么多DLL,但是,对于保存在ROM里需要就地执行的DLL来说,每一个进程都会在其进程空间里为这些XIP DLL保留执行空间,就好象每一个进程都要加载这些XIP DLL一样。一个具有网络连接的无头设备,其Windows ce操作系统映像包括大约100多个这样的DLL,而对于一个全特征的ce操作系统将会包括更多这样的DLL,所以很可能用完一个进程的进址空间。因此,为了避免这些ROL DLL使用进程的地址空间,从Windows ce 4.x版本后,以前那些在用户虚拟地址空间由内核执行的代码被移到了内核空间,同时所有的ROM DLL被映射到了一个单独的slot,即slot1,这样就为每一个进程释放了空间。由上面的分析可知,创建数据量更少而文件尺寸较大的DLL要比创建许多文件尺寸小的DLL要好得多。
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2012-12-05 13:32:58
-
02019-09-28 17:06:35
-
02019-10-29 10:50:36
-
2018-12-18 10:10:14
-
2016-04-17 15:10:54
-
2019-07-22 10:45:02
-
2015-10-10 14:40:45
-
2008-08-25 18:16:26
-
2010-01-28 10:58:40
-
2012-12-05 11:10:23
-
2012-12-04 13:13:47
-
2012-12-05 13:32:08
-
2018-12-17 14:35:34
-
2020-11-28 13:36:36
-
2012-12-05 10:57:05
-
2012-12-04 13:34:40
-
2008-08-24 11:58:57
-
2008-10-09 08:56:15
-
2012-12-04 14:18:16
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认