ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:159.11KB ,
资源ID:12189578      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12189578.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第10 章虚拟内存.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第10 章虚拟内存.docx

1、第10 章虚拟内存第10 章虚拟内存虚拟内存储存管理是现代操作系统的核心技术之一,它是整个系统高效合理地管理储存资源的基本保障,尤其是在嵌入式系统中,系统自身资源管理占的比例相对较大的情况下,就显得更为重要。在Windows CE中,除了个别对实时性能要求很高的应用程序需要关闭分页以外,大部分的应用程序都要求系统在虚拟储存上花费很大的比例。本章从系统的角度在特定的环境下跟踪虚拟内存的配置部分,因为虚拟内存配置是系统和使用者程序连接的主要渠道之一,配置的算法也在很大程度上决定了系统的性能。在分析过程中,还要对实体页的获取过程进行详细地分析,因为实体页面是系统极其珍贵的资源,对其的管理要格外小心。

2、本章将会对在这个过程中可能出现的情况逐一分析,力图完整的向读者展示从系统的视角看到的储存管理技术。10.1 配置过程概述在本书的第4章初步介绍了虚拟内存的配置,下面再详细地介绍一下配置的各个具体过程(总体分析及流程图参见第4章)。虚拟内存的状态分为提交( c o m m i t t e d )和保留( r e s e r v e d ),这两部分功能都是在DoVitualAlloc中实现的。先看一下该函数的入口参数LPVOID lpvAddress0, /*要保存或提交的区域地址* /DWORD cbSize, /*区域大小* /DWORD fdwAllocationType, /* 配置方式

3、* /DWORD fdwProtect, /*存取保护方式* /lpvAddress0为呼叫者指定配置的虚拟内存启始地址,为零则表示由系统自动配置,cbSize为需要配置的虚拟内存大小,fdwAllocationType和fdwProtect分别为配置类型(保留或提交)和保护信息。10.1.1 参数验证以下参数为无效参数: cbSize为零。 cbSize32MB且没有指定虚拟内存启始地址。 无效的存取控制信息。10.1.2 扫描虚拟内存区域找到合适大小的空闲区块由于各应用程序扫描空闲区块存在互斥, 配置的虚拟内存前,要先进入虚拟内存临界区。如果需要配置的虚拟内存大于2MB,则从系统的空闲虚拟

4、内存堆中配置,否则根据使用者指定的配置方式从第一个空闲区块或最后一个空闲区块扫描空闲的虚拟内存(MEM_TOPDOWN为从后向前扫描),若使用者指定了配置的虚拟内存启始地址,则只要简单的验证指定的虚拟内存是否都空闲即可。10.1.3 在得到的虚拟内存区块中写入控制信息写入的信息包括存取控制信息、虚拟内存的配置方式信息、共享使用者数(初始为1)以及该段虚存的启始地址。注意如果最后一个区块的页没有用完,要为其配置一个区块描述子,记录其为无效区块,对自动提交的页也要配置区块描述子,这样以后在提交的时候就不必再进入虚拟内存临界区了。10.1.4 获取足够的实体区块并建立映像在指定配置方式为提交的情况下

5、,则跳过上两步,直接执行此步。因为如果需要映像到实体页面,所有的配置都是分两次呼叫DoVirtualAlloc的,第一次保留,第二次映射。所以,这一步也可以看作前两步的延续。在此过程中,先要在系统堆中建立这段区域的页表,最关键的步骤是向系统提交对实体页的申请,得到使用指定大小的实体页的授权,这就有点像盖房子要先申请地皮,申请下来以后再怎么盖由自己决定,当然可以空在那里不用。而前面的对虚拟内存的保留则是单单得到了对地皮使用的认可,并没有真正拿到这块地方(当然,认可也是有限的)。10.1.5 小实验:虚拟内存配置的直观印象用Platform Builder建立一个应用程序,下载到终端机上,观察它的

6、储存配置。在控制台的命令行下键入mi full可得到有关储存管理的全部信息,关于虚拟内存配置的部分信息摘录如下:Memory usage for Process 81a9711c: device.exe pid 3Slot base 08000000 Section ptr 83fca00008000000(1): -r-08010000(0): -CCCCCc08020000(0): -SSSS08030000(0): WWWWWWWWWWWWWWWW08040000(0): WWWWWWWWWWWWWWWW08050000(0): WWWWWWWWWWWWWWW08060000(0): -

7、SS08070000(0): -S08080000(0): -S08090000(0): -SSS080a0000(0): -S080b0000(0): -S080c0000(0): -SS080d0000(0): -S080e0000(0): -S080f0000(0): -S08100000(0): -SSS08110000(0): -SSS08120000(0): -S08140000(0): -S08150000(0): -S08160000(0): -SS08170000(0): WW-08190000(0): -081a0000(0): -S081b0000(0): W-081d0

8、000(0): -081e0000(0): -S081f0000(0): WWWWWWWWWWWWWWWW08200000(0): W-08210000(0): -08220000(0): WWWWWWWWWWWWWWWW08230000(0): WWWWWWWWWWWWWWWW08240000(0): WWWWWWWWWWWWWWW08250000(0): WWWW-08340000(0): -08350000(0): -S08360000(0): -S08370000(0): -S08390000(0): -S083a0000(0): -S083b0000(0): -S083c0000(0

9、): -S083d0000(0): -S083e0000(0): -SSSSSSSSS083f0000(0): -S08400000(0): -S08420000(0): -S08430000(0): WWWWWWWWW-08450000(0): -08460000(0): -S09e70000(0): -W-W-09e80000(0): -09e90000(0): -W-09ea0000(0): -W-W-09f50000(0): -WW-09f60000(0): -W-09f70000(0): -W-W-W-09f80000(0): W-W-W-W-W-W-W09f90000(0): WW

10、WWWWW-W-W-09fa0000(0): -W-W-W-W-W-09fb0000(0): W-W-W-W-W-W-W-W-09fc0000(0): -W-W-W-W-W-W-09fd0000(0): W-W-W-W-WW-W-W-W09fe0000(0): -WWWWW-W09ff0000(0): -W-W-W-WPage summary: code=6(1) data r/o=0 r/w=193 stack=52 reserved=1216这是系统分配给行程device.exe的虚拟内存储存槽(Slot),可以看出每个Slot的第一行(每行1 6个页)用来存放该Slot的信息,堆栈都是在

11、每行末尾向前增长,经过几次分配回收,Slot中出现了一些碎片。在该例子中,最长的一段虚拟内存是09e7000009ff0000共384页。10.2 物理内存的获取10.2.1 分配过程下面详细地分析一下系统在调度实际物理内存时的行为,之所以选择这部分做详细地分析,是因为它是整个系统对公共资源进行分配的底层行为,从系统作为资源管理者的角度,可以从宏观上把握控制各微观行为之间的关系,可以很好地呈现系统的整体性,以及各部分之间的交互作用。而且这部分虽然重要,却只有短短的100多行原始码,因为系统把对物理内存的分配简化成对一个全局变量(PageFreeCount)的切割,很好地实现了系统设计的模块化想

12、法。原始码中几个关于控制的阈值的选取也是经过深思熟虑的,可以帮助理解系统设计者在各个方面的权衡,也能帮助理解嵌入式系统对性能的要求与通用系统的差异。下面对Holdpages函数这段原始码做详细分析,这部分原始码定义在CEROOTprivatewinceoscoreosnkkernelphysmem.c中,原始码的流程图参见第4四章图4 - 11。0684 BOOL0685 HoldPages(0686 int cpNeed,0687 BOOL bForce0688 )0689 0690 BOOL fSetGweOomEvent = FALSE;0691 BOOL bRet = FALSE;06

13、92 WORD prio;0693 EnterPhysCS();0694 / Check if this request will drop the page free count below the0695 / page out trigger and signal the clean up thread to start doing0696 / pageouts if so.0697 if (cpNeed+PageOutTrigger PageFreeCount) &0698 (!PageOutNeeded | (PagedInCount PAGE_OUT_TRIGGER) 0699 Pa

14、geOutNeeded = 1;0700 PagedInCount = 0;0701 if (prio = GET_CPRIO(pCurThread)0702 prio-;0703 if (prio hTh, (DWORD)prio);0705 SetEvent(hAlarmThreadWakeup);0706 这段原始码首先进入物理内存临界区,检测内存分配是否低于一定值,来决定是否要启动换页行程,将部分实体页换出。具体表现是将PCleanupThread的优先级设置为比目前行程略低,这样就可以在目前行程执行完毕之后马上启动。请注意,PageOutNeeded,PagedInCount,Pag

15、eOutTrigger都是与schedule.c和loader.c通信的变量,其值和系统当时的执行状态密切相关。0707 do 0708 if (cpNeed+GwesLowThreshold pfc)0722 & (InterlockedTestExchange (PLONG)&KInfoTable KINX_MINPAGEFREE, pfc2,pfc) != (LONG)pfc2);0723 LogPhysicalPages(PageFreeCount);0724 bRet = TRUE;0725 goto hpDone;0726 0727 while (ScavengeStacks(cp

16、Need+GwesLowThreshold);第二层阈值,如果超出则清空一些无用行程占用的堆栈,注意在这个过程中会修改PageFreeCount的值,因为如果有其它行程释放物理内存则会增加这个值,所以修改过程必须是不可分割的执行,否则可能会出现不一致,造成以后的增加无效。修改系统的核心数据结构KInfoTable中的闲置页项的时候同样是这个道理,请读者仔细体会这段原始码为什么要进行两次不可分割的执行,以及执行顺序。对协调系统工作的临界变量的使用有个初步的认识。0729 / Even after scavenging stacks, we were unable to satisfy the r

17、equest0730 / without going below the GWE low threshold.07310732 / Do not allow a request of size GwesLowBlockSize to succeed if0733 / doing so would leave less than the low threshold. Same with0734 / GwesCriticalBlockSize and GwesCriticalThreshold.0735 if (bForce | !(cpNeed GwesLowBlockSize0736 & cp

18、Need+GwesLowThreshold PageFreeCount)0737 | (cpNeed GwesCriticalBlockSize0738 & cpNeed + GwesCriticalThreshold PageFreeCount) 0739第三层阈值,如果清空行程堆栈之后仍然不能满足条件,则要启动这层阈值,由于此时实体资源已经接近枯竭,所以除了要预留部分物理内存维持系统运行以外,还要限制每次分配的内存大小,由GwesLowBlockSize限定。分配之后向GWE系统发出内存资源不足的警告。0740 / Memory is low. Notify GWE, so that GW

19、E can ask0741 / the user to close some apps.0742 if (GwesOOMEvent &0743 (PageFreeCount = GwesLowThreshold) |0744 (PageFreeCount cpNeed + GwesCriticalThreshold)0745 fSetGweOomEvent = TRUE;07460747 if (cpNeed + (bForce?0:STACK_RESERVE) pfc)0761 & (InterlockedTestExchange (PLONG)&KInfoTableKINX_MINPAGE

20、FREE, pfc2,pfc) != (LONG)pfc2);0762 LogPhysicalPages(PageFreeCount);0763 bRet = TRUE;0764 0765 0766 hpDone:0767 LeaveCriticalSection(&PhysCS);0768 if (fSetGweOomEvent)0769 SetEvent(GwesOOMEvent);0770 return bRet;0771 本节详细分析了HoldPages函数的原始码,在对物理内存的配置上,总体上分为三层阈值,这种层次结构可以较好地满足各种不同层次的需要,使得系统在时间和空间的总体效率比

21、较好,较多地使用了系统的全域环境变量,能灵活地适应系统在不同状态下的需求。10.2.2 小实验:HoldPages函数跟踪在Platform Builder中配置一个应用程序,建立其debug版本,在HoldPages函数入口设置断点,可以跟踪其执行,由于在debug模式下无法仿真多行程协调工作的环境,只能简略的看看这个函数的工作过程。图10-1 察看变数这是在程序启动入口处设置断点时的变量值,由于系统刚刚启动,各阈值还都是0,由于Platform Builder的命名关联的原因,有些变量的值不能直接观察到,可以在汇编码中找到其地址,在除错窗口中直接读取内存的值。察看特定地址的内容如图1 0

22、- 2所示。图10-2 察看特定地址的内容从上图可以看出,PageFreeCount的值是0x00000c26,即3100个空闲页,大约有12M的空闲物理内存,跟实际试验机的空闲内存数相仿,接下来的除错工作就变得相对简单,可以设置变量cpNeed的值来仿真各种实用条件。也可以通过在进入临界区后改变PageFreeCount的值(可以在Memory 1窗口中直接进行修改)来做一致性检测。这部分工作留给读者自己去完成。10.3 虚拟内存配置原始码片段这部分的流程和提交部分的原始码分析在第4章已经给了,读者可再对照上下文读一下这段原始码,另外作者在认为需要的地方适当地增加了一些中文注释,为了节约篇幅

23、,有些常数、变量的定义和一些简单的英文注释、除错信息、系统日志信息也略去。原始码定义在privatewinceoscoreosnkkernelvirmem.c中。0645 LPVOID0646 DoVirtualAlloc(0647 LPVOID lpvAddress0, /* address of region to reserve or commit */0648 DWORD cbSize, /* size of the region */0649 DWORD fdwAllocationType, /* type of allocation */0650 DWORD fdwProtect,

24、 /* type of access protection */0651 DWORD fdwInternal,0652 DWORD dwPFNBase0653 )0654 0681 if (IsKernelVa (dwAddr) / invalid address?0682 | !cbSize / size = 0?0683 | (cbSize = (1 VA_SECTION;0702 DEBUGCHK (ix = SECTION_MASK); / cant be 0, but can be NULL_SECTION0703 if (pscn = SectionTableix) = NULL_SECTION)0704 goto invalidParm;0705 dwBase = dwAddr & (SECTION_MASKVA_SECTION);0706 / Make sure that when remotely allocating memory in another process that0707 / we use the access key for the remote process instead of the current one.0708 if (dwAddr FIRST_MAPPER_ADDRESS) 0709 if (ix & ix

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1