WinCE中的paging pool

      我们知道,在Config.bib配置中,RAM指定的内存区域会被划分为程序内存和对象存储。但在使用paging pool时,RAM段要减去paging pool的大小,剩余空间再划分为程序内存和对象存储。其中程序内存主要为正在运行的程序保存堆和栈的内容。

    那么paging pool是什么呢,使用paging pool有什么好处呢?在查阅了相关资料后谈谈我的一点认识,如有错误,也希望批评指正。(其中参考了Sue Loh的《Paging and the Windows CE Paging Pool》一文,有兴趣的可以看一下。)

    先看一下paging pool的概念。Paging pool是RAM中reserved的一块区域。用于存放pageale data(只读的可执行文件的代码,数据以及内存映射文件)。如果使用paging pool就会给pageale data所使用的内存设定限制,它还包括将pagable data从内存移出的算法机制。

    在WinCE3.0以前的系统,并没有使用paging pool。这意味着系统对保存pageable data所使用的RAM没有限制。那么如果运行大量的程序或访问大量的内存映射文件时,内存使用率就会大大增加,直到系统耗尽内存,这时再分配内存就会失败。看起来好像内存真的用完了,但实际上还存在大量可以通过page data out从而释放的空间。最后,当系统到达一个最低内存限制时,kernel就会把所有的pageble的数据全部page out。这样突然间系统就会出现大量可用内存,你要使用的数据就会通过产生page fault重新page in到内存。但这样会带来系统的不稳定。

    因此WinCE引入了paging pool。The paging pool limits an amount of pageable memory system can has so it would be less "thrashing" prone. 使用paging pool,会设置有限的RAM用于存放pageable的data。Pool的size设置太小,这意味着pages可能会被过早地page out,尽管他们仍然在使用,从而引起频繁的page fault。Pool大小设置得太大,这意味着操作系统将保留更多的内存用于pageable data。这样就会减少page faults ,因为更多的代码存储在paging pool中。但Pool内存将无法被应用程序使用。

    在CE 6.0中,虚拟内存的架构改变了,涉及Windows CE的存储系统的重写,包括paging pool。CE 6.0的paging pool原理仍然相当简单,但有一点更加灵活。CE 6.0有两个paging pools:loader pool用来存放可执行代码,file pool用于存放所有file-backed memory-mapped文件和CE6.0新增的文件cache过滤器,或者叫cache管理器。以这种方式,OEMs不但可以设置只读数据的内存使用量,而且可以设置read-write数据的内存使用量了。并且可以分别为代码和数据设置内存使用的限制。

    这两个pool有几个参数。主要的参数是target size和maximum size。原理是操作系统总会保证pool拥有至少target数量的内存使用。如果有多余的可用内存,内核允许pool占有多于target的内存。但是当这种情况发生时,内核会唤醒一个低优先级的线程去page out一些数据,重新使pool慢慢降到target以下。采用这种方式,在busy “spikes”内存使用时,比如系统启动,系统会占用相当多的内存用来存放pagable data。但是在steady-state,系统的pool内存使用量在target上下徘徊。Maximum size为内存消耗设置了硬性的限制。OEMs可以把这个maximum设的很大从而避免pool的限制。OEMs也可以把target和maximum大小设置的相同,从而获取CE6之前的版本的paging pool的效果。

       paging和paging pool是独立的。不管是不是paging pool都会发生paging。如果你关闭了paging pool,你也就关掉了用于paging的RAM的限制。但是pages仍然可以paging。如果你打开了paging pool,那么就会有限制。只不过对于paging pool,page in的data还可以page out。而对于非paging pool中的data则不会被page out。

    ROM中的中的FILES中可执行文件的code和只读data将会使用pool。可执行文件中的R/W data不能被page out,所以不会使用paging pool。MODULES中的压缩的可执行文件中的code和只读data也会使用pool。如果Image是从NOR或者RAM运行,MODULES中未压缩的可执行文件将直接运行,而不使用pool。NAND中Image中MODULES中的可执行文件将会使用pool。

    如果可执行文件被标志为”non-pagable”,则在加载时就会被page到RAM中,不会被page out,直到被卸载。这些Pages不使用pool。你也可以创造些”partially pagable”的可执行文件,通过告诉linker使部分sections non-pagable。一般如果code和data是ISR的一部分,或者在suspend/resume时被调用,或被其他电源管理调用,就不能是pagable的,因为paging会造成系统崩溃或死锁。如果code和data被IST访问也不能是pagable,因为paging会影响实时性。

        RAM-backed的内存映射文件不会使用Pool。在CE5或更老的版本中,只读的file-back mapfiles会使用Pool而R/W mapfiles不使用。在CE6中,所有的file-backed mapfiles都使用file pool。并且新的file cache filter(cache manager)会映射所有打开的文件,所以cached file data也使用pool。

    在CE5.0中,如果想使用paging pool,只需在Config.bib中定义如下:

#define PAGINGPOOLSIZE 00500000

cbNKPagingPoolSize 00000000  $(PAGINGPOOLSIZE)  FIXUPVAR


    即把paging pool的size设置为5MB。如果设置为0或者不设置的话,就没打开paging pool,没有对存放pageable的data和code的RAM的限制,效果和上面谈到的WinCE3.0之前没有paging pool时一样。不过建议使用paging pool。Pool的size设置是个难题,过大过小都不合适。不过在CE 6.0中,如果将size设置为0的话,系统就会自动调节cbNKPagingPoolSize,这样就比较方便了。

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/flyalice/archive/2009/02/16/3897253.aspx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在FSM模型中使用两态数据类型

在FSM模型中使用两态数据类型 1、使用两态类型和枚举类型对FSM复位 在仿真刚开始时,四态数据类型的值是逻辑X。类似有限状态机这样的模型中,四态变量的X逻辑值可以用来表示模型还没有复位,或复位逻辑的建模不正确。 仿真刚开始时&#xff0c…

没有建立对验证码签名的目录的发布者信任

在Windows 7下安装 FX3 USB驱动,一直提示 “没有建立对验证码签名的目录的发布者信任” 导致无法安装驱动,后来测试很多的方法,包括复制 inf 和sys文件到相应的 C:\windows\inf 与 C:\windows\system32\driver 目录下,设置 IE浏览…

QCon北京2016启动筹备 众多热点专题诚征演讲嘉宾

QCon是由InfoQ主办的全球顶级技术盛会,每年在伦敦、北京、东京、纽约、圣保罗、上海、旧金山召开。\u0026#xD;\n\u0026#xD;\n在即将过去的2015年,我们在中国成功举办了QCon北京和QCon上海。我们紧扣热点,坚持实践驱动,很多精彩演讲…

洪莆日美

韩国女艺术家洪莆日美,曾在台湾研习美学,现为韩国釜山高神大学美术系教授。她的作品与其是在黑与白之间,毋宁说是在暗与光之间,它是东方阴阳哲学与简约主义艺术实践的圆满和结晶。她在自述中写道: “我以纸墨布局&…

关闭Eclipse光标悬浮自动提示

最近几个版本的Eclipse默认鼠标移动到方法、属性等上面会出现悬浮窗提示,但鼠标下移后不会消失,编写代码的时候很烦人。 设置preferences-->General-->Editors-->Text Editors--> when mouse moved into hover:选择Close hover

层次化设计

层次化设计 1、模块原型 外部的模块声明 SystemVerilog允许用户为被实例化的模块指定一个原型,这就简化了编译过程。原型的定义使用关键字extern,extern之后是模块及其端口是声明。 //使用Verilog-1995代码风格的原型 entern module counter(cnt,d,clo…

ASP.NET WebHooks RC 1发布

正如消息队列能够让同一个组织内的多个应用相互通信一样, WebHooks也为来自不同组织的网站提供了一种以异步的形式进行通信的方法。\u0026#xD;\n\u0026#xD;\n从本质上说,WebHook就是一种回调机制。用户可以在WebHook提供者中注册一个自定义的URL&#xf…

远程管理 KVM 虚机 - 每天5分钟玩转 OpenStack(5)

上一节我们通过 virt-manager 在本地主机上创建并管理 KVM 虚机。其实 virt-manager 也可以管理其他宿主机上的虚机。只需要简单的将宿主机添加进来 填入宿主机的相关信息,确定即可。 接下来,我们就可以像管理本地虚机一样去管理远程宿主机上的虚机了。 …

WM的Image格式分析

定制 WM 时 ,生成的image的扩展名很多,dio ,nb0 ,bin等等,他们都是什么关系。看一个例子。 Memory.cfg.xml的内容如下 我们可以看见image由4个分区组成,分别为ULDR,NK,OS,Storage(最多只能有4个分区)。这4…

随机取不重复的数字

for( int i 0; i < 25; i) a[i] i;srand( time(NULL) ); for( i 0; i < 25; i) swap( a[0], a[rand()%25] );

DSP笔记

DSP笔记 duty:占空比&#xff1b;DFT:可测性设计头文件的主要作用是&#xff1a;包含一些宏定义和函数。头文件作为一种包含功能函数、数据接口声明的载体文件&#xff0c;主要用于保存程序的声明&#xff0c;而定义文件用于保存程序的实现。入门&#xff0c;GPIO输入输出&…

KVM 存储虚拟化 - 每天5分钟玩转 OpenStack(7)

KVM 的存储虚拟化是通过存储池&#xff08;Storage Pool&#xff09;和卷&#xff08;Volume&#xff09;来管理的。 Storage Pool 是宿主机上可以看到的一片存储空间&#xff0c;可以是多种类型&#xff0c;后面会详细讨论。Volume 是在 Storage Pool 中划分出的一块空间&…

LVM 类型的 Storage Pool - 每天5分钟玩转 OpenStack(8)

LVM 类型的 Storage Pool 不仅一个文件可以分配给客户机作为虚拟磁盘&#xff0c;宿主机上 VG 中的 LV 也可以作为虚拟磁盘分配给虚拟机使用。 不过&#xff0c;LV 由于没有磁盘的 MBR 引导记录&#xff0c;不能作为虚拟机的启动盘&#xff0c;只能作为数据盘使用。 这种配置下…

UltraEdit中高亮显示verilog HDL关键词

UltraEdit是一款功能强大的文本编辑器&#xff0c;可以编辑文字、Hex、ASCII码&#xff0c;可以取代记事本&#xff0c;内建英文单字检查、C 及 VB 指令突显&#xff0c;可同时编辑多个文件&#xff0c;而且即使开启很大的文件速度也不会慢。是一个使用广泛的编辑器&#xff0c…

你是否做好了代码的备份?

http://blog.csdn.net/norains/archive/2010/03/16/5385773.aspx

CCS的基本操作

CCS的基本操作 1、 创建新工程 方法一&#xff1a; 方法二&#xff1a; 进入工程界面后&#xff0c;第一步选择芯片型号&#xff0c;第二步选择仿真器&#xff0c;第三步编写工程名称&#xff0c;选择工程模板。最后点击finish 2、 编译 方法一&#xff1a; 方法二&…

KVM 网络虚拟化基础 - 每天5分钟玩转 OpenStack(9)

网络虚拟化是虚拟化技术中最复杂的部分&#xff0c;学习难度最大。 但因为网络是虚拟化中非常重要的资源&#xff0c;所以再硬的骨头也必须要把它啃下来。 为了让大家对虚拟化网络的复杂程度有一个直观的认识&#xff0c;请看下图 这是 OpenStack 官网上给出的计算节点&#…

命名的结束语句

命名的结束语句 1、命名的模块结尾 SystemVerilog允许关键字endmoule后指定模块的名字 endmoule:<module_name> endmodule后指定的名称必须与匹配的模块名称一致2、命名的代码块结尾 SystemVerilog还允许对其他命名的代码块指定结尾名称。这包括以下关键字&#xff1a;…

Hive注册表那点事(5.0 VS 6.0)

Hive 注册表那点事&#xff08; 5.0 VS 6.0 &#xff09; 现象 5.0 移置到 6.0 上的时候&#xff0c;发现 Hive-Registry 无效&#xff0c;具体的现象是在控制面板中屏幕校准后 Cold Boot 机器校准数据丢失。 环境变量 PRJ_ENABLE_REGFLUSH_THREAD 和 PRJ_ENABLE_FSREGHIVE …

云计算与 OpenStack - 每天5分钟玩转 OpenStack(14)

“云计算” 算是近年来最热的词了。现在 IT 行业见面不说这三个字您都不好意思跟人家打招呼。 对于云计算&#xff0c;学术界有各种定义&#xff0c;大家有兴趣可以百度一下。 CloudMan 这里主要想从技术的角度谈谈对云计算的理解。 基本概念 所有的新事物都不是突然冒出来的&a…