【问题标题】:OS development - page fault handling and disk driver操作系统开发 - 页面错误处理和磁盘驱动程序
【发布时间】:2020-06-08 14:12:52
【问题描述】:

我目前正在开发一个用于学习目的的微型操作系统(有关代码,请参阅 here),并且我目前正在修补分页和内存管理。

为了处理页面错误,我知道我需要某种磁盘驱动程序来替换物理内存中的帧。但是,我在网上找不到任何相关信息,而且我能找到的所有教程都有一个简单的页面错误处理功能,它只打印页面错误的原因,而我也想加载正确的页面/框架,如果由于页面不存在于内存中,因此引发了错误。

谁能提供一些帮助或任何在线参考?

【问题讨论】:

  • 我真的不明白你所说的“某种磁盘驱动程序”是什么意思,而且你没有告诉我们什么“你找到的教程......打印出页面错误的原因”。
  • 还有……还有什么比 Linux 更好的学习例子?一个简单的谷歌搜索“linux页面错误处理”产生了许多详细的在线文档的链接。
  • @MikeRobinson 据我所知,处理虚拟内存涉及能够将当前未使用的页面换出到磁盘,然后在需要时将它们换回。为此,我需要某种与磁盘“通信”的方式:驱动程序。
  • 无论如何你都需要一个文件系统,而不仅仅是能够交换内存块。
  • 大概您的操作系统已经具有某种 I/O 架构,具有“磁盘驱动程序”和处理异步请求的能力。再一次,Linux 拥有出色的架构理念,随着时间的推移,这些理念已经有所发展。

标签: driver paging disk osdev page-fault


【解决方案1】:

用于页面错误处理程序;首先确定导致页面错误的原因以及如何处理它 - 可能是非法访问(发送信号?核心转储?内核恐慌?),可能是“惰性 TLB 失效”(使 TLB 条目无效并且什么也不做),可能是“写入时复制”(将数据复制到新分配的页面并用新副本替换旧页面并调整页面权限),可能是“从其他地方获取”(交换?内存映射文件?),并且可能是“正在获取”(告诉调度线程需要等待)。

对于“从其他地方获取”;以某种方式将该页面标记为“正在获取”(这样如果同一进程中的其他线程尝试访问该页面,他们知道他们可以简单地等待,并且您最终不会多次获取相同的数据);并创建一个(异步)IO 请求并将其提交给任何对象(文件系统、交换管理器);并告诉调度程序“在虚拟内存管理器说它可以继续之前,不要给这个线程任何 CPU 时间”(可能会导致任务切换)。

当 IO 请求完成时(并中断其他东西);检查状态。如果 IO 请求失败(例如磁盘故障),您将不得不以某种方式处理(将其视为不可恢复的错误/崩溃?)。如果成功,将数据映射到进程(在执行此操作时删除“正在获取”标记),然后告诉调度程序正在等待页面的任何任务/线程现在可以继续(可能导致任务切换)。

注意事项:

  • 您将需要一些方案来将页面发送到交换空间,并且在某些情况下(内存耗尽)您可能需要发送一些页面到交换空间以释放您需要从交换空间获取页面的 RAM .为此,您可能希望以不同的方式处理某些事情以更好地处理“交换抖动”条件(例如,使系统实用程序和 GUI 等进程保持响应并仍可用于杀死其他进程)

  • 您可能需要 IO 优先级 - 例如因此,将数据发送到交换是最高优先级,从交换中获取数据是第二高优先级,其他一切都是较低优先级。这可确保(例如)尝试读取 1234 GiB 文件的不重要后台任务不会导致整个操作系统停止运行。

  • 您可能想要预取 - 例如当一个巨大的进程终止并且您突然发现自己有大量可用 RAM 时,请在需要之前开始从交换空间(按“最重要的优先”顺序?)预取数据。

  • 它的磁盘IO端是完全独立的;并且可能应该在您考虑添加对交换空间或内存映射文件的支持之前进行实施和测试。

【讨论】:

  • 是的,我的问题有点笼统,但我感兴趣的要点是您回答的最后一个问题。我只是在问是否有人可以提供一些文档或类似的东西来在磁盘上读/写。无论如何,谢谢你,绝对是一个很好的答案!
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多