Skip to content

方法Method

按需分页与缺页处理

Demand paging · Page fault handling · Lazy page allocation

依据合法区域与访问种类分类故障,完成零页分配、文件换入或拒绝访问,并保持失败时的映射和数据不变量。

形式陈述 ​

按需分页把“允许使用一段虚地址”和“已经为它建立驻留页”分开。内核保留区域记录[start,end), backing, permissions;backing可为匿名零页、文件范围或已保存的换出页。页表描述硬件当前能直接访问什么,区域记录描述内核是否有权、依据什么内容修复一次未满足的访问。

OS-16缺页处理输入为(ASID, faultVA, access, savedPC),由陷阱入口提供。处理按以下顺序进行:

  1. 查区域:地址不属于合法区域,或动作违反区域权限,拒绝访问
  2. 重查PTE:可能已有其他处理者修复;若已有满足权限的映射,只需保证翻译状态一致后重试
  3. 匿名未驻留页取得空闲页并完整清零;文件页取得指定文件偏移内容;换出页取回自己的已保存内容
  4. 只有内容完整、所有权成立,才安装PTE并完成必要翻译失效;恢复原PC重试故障指令
  5. 分配或读入失败则释放尚未发布的资源,报告失败,不安装半初始化映射

对于驻留但只读的写故障,还要查软件元数据:若该区域本来可写而PTE被标为COW,可交写时复制处理;只读代码不是COW。OS-16的权限失败最终终止本次访问,是否结束进程由上层错误政策决定。

直觉

保留一千页而只触及其中两页,可以先只为两页付物理内存成本。代价是第一次真正访问要暂停并请求内核完成准备;“分配虚地址成功”不意味着未来任意页面都一定能拿到物理资源。

页故障的共同点是硬件此刻不能完成访问,原因却很多。未用过的合法匿名页、被换出的数据、写时复制和野指针都可走同一个入口;服务它们的合法动作并不相同。

例子与边界

一次合法补页和一次拒绝 ​

P保留[0x1300,0x1400)为匿名可读写区,PTE不驻留。PC=0x1040执行向0x1305存1。硬件报告写故障且尚未写任何数据,内核把地址向下取整为0x1300,分配PFN0x60,清零256B,安装U,R,W,present,失效该VPN旧翻译后重试PC=0x1040。最后物理0x6005为1,其余255B为0,PC才向后推进。

紧接着P向0x1000写2;该页是PFN0x40的U,R,X代码页,区域权限也不允许写。内核拒绝,PFN0x40内容不变、空闲页数量不变、PC不会以“写已完成”的方式继续。若处理程序对所有故障一律分配零页,就会把代码破坏或把非法地址悄悄变合法。

清零是在关闭信息泄漏 ​

若PFN0x60以前属于Q且含密文密钥、聊天文本或任意旧字节,直接映给P会泄漏Q的残留数据。即使P这次只写一个字节,其余255B也马上可被它读取。因此清零必须发生在用户可访问之前;不能把清零当成可延期到后台的美化工作。

文件缺页不能用零页替代有效内容。若映射文件偏移512处,内核必须从该文件范围取回正确字节;如果I/O失败,返回全零并称成功会悄悄改变程序语义。合法区域只证明请求允许,不证明内容已取到。

推论与应用

一般安全论证有三个发布条件:区域授权正确、页内容对应backing、页框没有不受控的其他写者。发布前的工作不可被用户观察;发布后硬件权限接管每次访问。失败分支没有发布PTE,因此不会把未初始化或错误文件内容暴露出去。

缺页可能需要分配、清零、页表页建立、I/O和调度等待。零填充至少处理B字节,文件或换入还含设备成本;不能用一次TLB miss的几次内存读取估算它。现代系统常区分不需磁盘I/O与需I/O的fault计数,但具体计数接口应按系统文档解释。

两线程并发对同页缺页时,需要页级“正在载入”状态或锁:若都读入不同页并无保护发布,会泄漏页框甚至覆盖新写。本单元单核主线将一次fault修复作为受保护阶段;若阶段等待I/O而让别的线程运行,必须重新检查映射,不能仅凭最初检查继续安装。

参考资料
关系图谱6 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组