深入解析Blog OS项目中的分页机制实现

深入解析Blog OS项目中的分页机制实现

blog_os Writing an OS in Rust blog_os 项目地址: https://gitcode.com/gh_mirrors/bl/blog_os

分页是现代操作系统内存管理的核心技术之一。本文将基于Blog OS项目,详细讲解如何在操作系统中实现分页支持,包括物理页表帧的访问方法、地址转换函数实现以及新映射创建等内容。

分页机制回顾

在x86_64架构中,分页机制通过四级页表实现虚拟地址到物理地址的转换。每个页表项存储的是下一级页表的物理地址,这种设计避免了地址转换的循环依赖问题。

我们的内核运行在虚拟地址上,而页表存储在物理内存中,这带来了一个关键问题:如何从内核访问这些物理页表帧?

页表访问方案比较

1. 恒等映射(Identity Mapping)

原理:将页表帧直接映射到相同地址的虚拟内存。

优点

  • 实现简单直接
  • 访问页表时无需额外转换

缺点

  • 碎片化虚拟地址空间
  • 难以找到连续的大内存区域
  • 新页表创建受限

2. 固定偏移映射

原理:在虚拟地址空间保留特定区域(如10TiB开始)专门用于页表映射。

优点

  • 避免虚拟地址空间碎片化
  • 48位地址空间足够大,可保留专门区域

缺点

  • 创建新页表时仍需建立映射
  • 不支持跨地址空间访问

3. 完整物理内存映射

原理:将全部物理内存映射到虚拟地址空间的保留区域。

优点

  • 可访问任意物理内存
  • 支持跨地址空间操作
  • 使用大页(2MiB)可减少页表占用

缺点

  • 需要额外页表存储映射关系
  • 小内存设备可能面临压力

4. 临时映射

原理:仅在使用时临时映射页表帧。

优点

  • 仅需4KiB物理内存
  • 虚拟地址空间利用率高

缺点

  • 实现复杂
  • 多级页表修改需要重复操作

5. 递归页表

原理:将页表自身的一个条目指向自己,形成递归引用。

优点

  • 无需额外页表
  • 可访问所有级别页表
  • 地址计算规则统一

缺点

  • 概念理解较复杂
  • 地址计算需要特殊处理

地址转换实现

要实现虚拟到物理地址的转换,我们需要遍历页表层次结构:

  1. 从CR3寄存器获取顶级页表物理地址
  2. 通过虚拟地址的各级索引逐级查找
  3. 最终获得目标物理帧地址

关键点在于如何安全访问各级页表。在Blog OS中,我们选择映射完整物理内存的方案,因为它提供了最大的灵活性。

创建新映射

创建新内存映射的步骤:

  1. 找到未使用的物理帧
  2. 根据需要修改各级页表
  3. 设置正确的页表项标志位
  4. 必要时刷新TLB缓存

实现细节

页表项标志位

x86_64架构的页表项包含多个重要标志位:

  • Present:页是否存在于内存
  • Writable:是否可写
  • User accessible:用户模式是否可访问
  • Write-through caching:写透缓存
  • Cache disabled:禁用缓存
  • Accessed:是否被访问过
  • Dirty:是否被修改过
  • Huge page:是否为大页
  • No execute:禁止执行

地址计算

虚拟地址被划分为多个部分用于页表索引:

63-48    47-39   38-30   29-21   20-12   11-0
保留      L4索引  L3索引  L2索引  L1索引  页内偏移

通过这种结构,CPU可以自动完成多级页表查找。

总结

在Blog OS项目中实现分页机制需要考虑多种因素。通过完整映射物理内存的方案,我们获得了灵活的内存访问能力,同时保持了较好的性能。理解各级页表的结构和交互方式是实现健壮内存管理的基础。

分页机制不仅提供安全隔离,还支持高级特性如内存映射文件、写时复制等,是构建现代操作系统的关键技术之一。

blog_os Writing an OS in Rust blog_os 项目地址: https://gitcode.com/gh_mirrors/bl/blog_os

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计纬延

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值