版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页一文详解Linux虚拟内存技术
接上文:(Linux)虚拟内存基础。
以存储单元为单位来管理显然不现实,因此Linux把虚存空间分成若干个大小相等的存储分区,Linux把这样的分区叫做页。为了换入、换出的方便,物理内存也就按页的大小分成若干个块。由于物理内存中的块空间是用来容纳虚存页的容器,所以物理内存中的块叫做页框。页与页框是Linux实现虚拟内存技术的基础。
虚拟内存的页、物理内存的页框及页表
在Linux中,页与页框的大小一般为4KB。当然,根据系统和应用的不同,页与页框的大小也可有所变化。
物理内存和虚拟内存被分成了页框与页之后,其存储单元原来的地址都被自然地分成了两段,并且这两段各自代表着不同的意义:高位段分别叫做页框码和页码,它们是识别页框和页的编码;低位段分别叫做页框偏移量和页内偏移量,它们是存储单元在页框和页内的地址编码。下图就是两段虚拟内存和物理内存分页之后的情况:
为了使系统可以正确的访问虚存页在对应页框中的映像,在把一个页映射到某个页框上的同时,就必须把页码和存放该页映像的页框码填入一个叫做页表的表项中。这个页表就是之前提到的映射记录表。一个页表的示意图如下所示:
页模式下,虚拟地址、物理地址转换关系的示意图如下所示:
也就是说:(处理器)遇到的地址都是虚拟地址。虚拟地址和物理地址都分成页码(页框码)和偏移值两部分。在由虚拟地址转化成物理地址的过程中,偏移值不变。而页码和页框码之间的映射就在一个映射记录表——页表中。
请页与交换
虚存页面到物理页框的映射叫做页面的加载。
当处理器试图访问一个虚存页面时,首先到页表中去查询该页是否已映射到物理页框中,并记录在页表中。如果在,则MMU会把页码转换成页框码,并加上虚拟地址提供的页内偏移量形成物理地址后去访问物理内存;如果不在,则意味着该虚存页面还没有被载入内存,这时MMU就会通知(操作系统):发生了一个页面访问错误(页面错误),接下来系统会启动所谓的“请页”机制,即调用相应的系统操作函数,判断该虚拟地址是否为有效地址。
如果是有效的地址,就从虚拟内存中将该地址指向的页面读入到内存中的一个空闲页框中,并在页表中添加上相对应的表项,最后处理器将从发生页面错误的地方重新开始运行;如果是无效的地址,则表明进程在试图访问一个不存在的虚拟地址,此时操作系统将终止此次访问。
当然,也存在这样的情况:在请页成功之后,内存中已没有空闲物理页框了。这是,系统必须启动所谓地(交换机)制,即调用相应的内核操作函数,在物理页框中寻找一个当前不再使用或者近期可能不会用到的页面所占据的页框。找到后,就把其中的页移出,以装载新的页面。对移出页面根据两种情况来处理:如果该页未被修改过,则删除它;如果该页曾经被修改过,则系统必须将该页写回辅存。
系统请页的处理过程如下所示:
为了公平地选择将要从系统中抛弃的页面,Linux系统使用
最近最少使用(LRU)页面的衰老(算法)。这种策略根据系统中每个页面被访问的频率,为物理页框中的页面设置了一个叫做年龄的属性。页面被访问的次数越多,则页面的年龄最小;相反,则越大。而年龄较大的页面就是待换出页面的最佳候选者。
快表
在系统每次访问虚存页时,都要在内存的所有页表中寻找该页的页框,这是一个很费时间的工作。但是,人们发现,系统一旦访问了某一个页,那么系统就会在一段时间内稳定地工作在这个页上。所以,为了提高访问页表的速度,系统还配备了一组正好能容纳一个页表的(硬件)(寄存器),这样当系统再访问虚存时,就首先到这组硬件寄存器中去访问,系统速度就快多了。这组存放当前页表的寄存器叫做快表。
总之,使用虚拟存储技术时,处理器必须配备一些硬件来承担内存管理的一部分任务。承担内存管理任务的硬件部分叫做存储管理单元MMU。存储管理单元MMU的工作过程如下图所示:
页的共享
在多程序系统中,常常有多个程序需要共享同一段代码或数据的情况。在分页管理的存储器中,这个事情很好办:让多个程序共享同一个页面即可。
具体的方法是:使这些相关程序的虚拟空间的页面在页表中指向内存中的同一个页框。这样,当程序运行并访问这些相关页面时,就都是对同一个页框中的页面进行访问,而该页框中的页就被这些程序所共享。下图是3个程序共享一个页面的例子:
页的保护
由上可知,页表实际上是由虚拟空间转到物理空间的入口。因此,为了保护页面内容不被没有该页面访问权限的程序所破坏,就应在页表的表项中设置一些访问控制字段,用于指明对应页面中的内容允许何种操作,从而禁止非法访问。
下图是页表项中存放控制信息的一种可能的形式:
注意:其中的PCD位表示着是否允许高速缓存(cache)。
如果程序对一个页试图进行一个该页控制字段所不允许的操作,则会引起操作系统的一次中断——非法访问中断,并拒绝这种操作,从而保护该页的内容不被破坏。
多级页表
需要注意的是,页表是操作系统创建的用于内存管理的表格。因此,一个程序在运行时,其页表也要存放到内存空间。如果一个程序只需要一个页表,则不会有什么问题。但如果,程序的虚拟空间很大的话,就会出现一个比较大的问题。
比如:一个程序的虚拟空间为(4G)B,页表以4KB为一页,那么这个程序空间就是1M页。为了存储这1M页的页指针,那么这个页表的长度就相当大了,对内存的负担也很大了。所以,最好对页表也进行分页存储,在程序运行时只把需要的页复制到内存,而暂时不需要的页就让它留在辅存中。为了管理这些页表页,还要建立一个记录页表页首地址的页目录表,于是单级页表就变成了二级页表。二级页表的地址转换如下图所示:
当然,如果程序的虚拟空间更大,那么也可以用三级页表来管理。为了具有通用性,Linux系统使用了三级页表结构:页目录(PageDirectory,PGD)、中间页目录(PageMiddleDirectory,PMD)、页表(PageTable,PTE)。
Linux的页表结构
为了通用,Linux系统使用了三级页表结构:页目录、中间页目录和页表。PGD为顶级页表,是一个p(gdt)数据类型的数组,每个数组元素指向一个中间页目录;PMD为二级页表,是一个pmdt数据结构的数组,每个数组元素指向一个页表;PTE则是页表,是一个pte_t数据类型的数组,每个元素中含有物理地址。
为了应用上的灵活,Linux使用一系列的宏来掩盖各种平台的细节。用户可以在配置文件config中根据自己的需要对页表进行配置,以决定是使用三级页表还是使用二级页表。
在系统编译时,会根据配置文件config中的配置,把目录include/asm符号连接到具体(CPU)专用的文件目录中。例如,对于i386CPU,该目录符号会连接到include/asm-i386,并在文件pgable-2level-defs.h中定义了二级页表的基本结构,如下图:
其中还定义了:
#definePGDIR_SHIFT22//PGD在线性地址中的起始地址为bit22#definePT(RS)_PER_PGD1024//PGD共有1024个表项#definePTRS_PER_PTE1024//PTE共有1024个表项#endif在文件include/asm-i386/pgtable.h中定义了页目录和页表项的数据结构,如下:
typedofstruct{unsignedlongpte_low;}pte_t;//页表中的物理地址,页框码typedofstruct{unsignedlongpgd;}pgd_t;//指向一个页表typedofstruct{unsignedlongpgprot;}pgprot_t;//页表中的各个状态信息和访问权限从定义可知,它们都是只有一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拆迁专项顾问合同范例
- 气动钻机 采购合同模板
- 礼服馆招聘合同范例
- 2024年度青岛某景区内房产买卖合同2篇
- 灯具供货标准合同模板
- 空调合同范例范例
- 2024年度电线电缆配套电杆采购合同2篇
- 泡沫产品购销合同范例
- 2024年度城市综合体楼板浇注合同2篇
- 2024年营业员个人工作计划(5篇)
- 《马克思主义发展史》题集
- 2024译林版英语初一上单词默写表
- 通信工程冬季施工安全培训
- QGDW 10272-2018 大型电厂接入系统设计内容深度规定
- 赤峰市级继续医学教育项目审批通过汇总表
- 工程数学练习题(附答案版).
- 三年级语文上册竞赛试题
- 中国联通GPON设备技术规范
- 软件正版化工作整改情况汇报
- 钢结构连廊施工方案(完整版)
- 实验室施工组织设计(完整版)
评论
0/150
提交评论