第九章 虚拟内存 第七节 案例研究:Intel Core Linux 内存系统

1、Core i7 地址翻译

1. 翻译概览

Core i7采用四级页表层次结构。 每个进程有它自己私有的页表层次结构。 当一个Linux进程在运行时, 虽然Core i7体系结构允许页表换进换出,但是与已分配了的页相关联的页表都是驻留在内存中的。 CR3控制寄存器指向第一级页表 (L1)的起始位置。 CR3的值是每个进程上下文的一部分, 每次上下文切换时, CR3的值都会被恢复。
下图展示了其地址翻译概况。
在这里插入图片描述

2. PTE细节

1. 第一二三级页表

在这里插入图片描述
P=1时,要求地址字段包含一个40位的物理页号,它指向一个适合的页表的基址。

2. 第四级页表

在这里插入图片描述
P=1时,要求地址指向物理内存中某一页的基址。
上面两种页表都要求物理页4KB对齐。

3.常见属性

1. 权限控制位

PTE有三个权限位,控制对页的访问。

  1. R/W
    确定也得内容是否可写
  2. U/S
    确定用户模式下能否访问该页
  3. XD (禁止执行位)
    是在64位系统中引入的,可以用来禁止从某些内存页取指令。这是一个重要的新特性,通过限制只能执行只读代码段,使得操作系统内核降低了缓冲区溢出攻击的风险。
2. 内核缺页处理程序相关的位

当MMU翻译每一个虚拟地址时,它还会更新另外两个内核缺页处理程序会用到的位。

  1. A位
    每次访问一个页时,MMU都会设置A位,称为引用位(reference bit)。内核可以用这个引用位来实现它的页替换算法。
  2. D位
    每次对一个页进行了写之后,MMU都会设置D位,又称修改位或脏位。修改位告诉内核在复制替换页之前是否必须写回牺牲页。

内核可以通过调用一条特殊的内核模式指令来清除引用位或修改位。

3. 虚拟地址翻译成物理地址

在这里插入图片描述
36位VPN被划分成四个9位的片,每个片被用作到一个页表的偏移量。CR3寄存器包含L1页表的物理地址。VPN 1提供到一个L1 PTE的偏移量,这个PTE包含L2页表的基地址。VPN2提供到一个L2 PTE 的偏移量,以此类推。

在对地址翻译的讨论中,我们描述了一个顺序的两个步骤的过程,1)MMU将虚拟地址翻译成物理地址,2)将物理地址传送到L1高速缓存。然而,实际的硬件实现使用了一个灵活的技巧,允许这些步骤部分重叠,因此也就加速了对L1高速缓存的访问。
当CPU需要翻译一个虚拟地址时,它就发送VPN到MMU,发送VPO到高速L1缓存。当MMU向TLB请求一个页表条目时, L1高速缓存正忙着利用VPO位查找相应的组, 并读出这个组里的8个标记和相应的数据字。当MMU从TLB得到PPN时, 缓存已经准备好试着把这个PPN与这8个标记中的一个进行匹配了。

2、Linux虚拟内存系统

Linux为每个进程维护了一个单独的虚拟地址空间, 形式如图9-26所示。
在这里插入图片描述
内核虚拟内存的某些区域被映射到所有进程共享的物理页面。例如, 每个进程共享内核的代码和全局数据结构。

1. Linux虚拟内存区域的组织方式

Linux将虚拟内存组织成一些区域(也叫做段)的集合。一个区域(area)就是**已经存在着的(已分配的)**虚拟内存的连续片(chunk), 这些页是以某种方式相关联的。例如,代码段、数据段、堆、共享库段, 以及用户栈都是不同的区域。
区域的概念很重要, 因为它允许虚拟地址空间有间隙。

内核为系统中的每个进程维护一个单独的任务结构(源代码中的task_struct)。任务结构中的元素包含或者指向内核运行该进程所需要的所有信息(例如, PID、指向用户栈的指针、可执行目标文件的名字, 以及程序计数器)。
在这里插入图片描述
其中的mm_struct描述了关于虚拟内存的当前状态。我们看他其中的两个字段。

  1. pgd
    指向第一级页表的基址,当内核运行这个进程时, 就将pgd存放在CR3控制寄存器中。
  2. mmap
    指向一个vm_area_structs(区域结构)的链表, 其中每个vm_area_structs都描述了当前虚拟地址空间的一个区域。一个区域具体可以描述如下
    在这里插入图片描述

2. Linux缺页异常处理

虚拟地址A导致的缺页会进行如下流程
在这里插入图片描述

  1. 对A的合法性进行判断
    也就是A是否是属于某一个区域的。缺页处理程序会搜索区域结构的链表,把A和每个区域的vm_start和vm_end进行比较。如果不合法就报段错误。也就是上图中的①

因为一个进程可以创建任意数量的新的虚拟内存区域(使用mmap函数),所以Linux不会顺序搜索,而是使用其他的数据结构进行搜索。

  1. 对A进行的内存访问的合法性进行判断
    也即进程是否可以写、读这个区域。如果不合法就会触发保护异常。如上图②
  2. 此时就是正常的缺页
    选择一个牺牲页面,如果这个牺牲页面被修改过,那么就将它交换出去,换入新的页面并更新页表。当缺页处理程序返回时,CPU重新启动引起缺页的指令,这条指令将再次发送A到MMU。这次,MMU就能正常地翻译A, 而不会再产生缺页中断了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值