OS开发-页面错误处理和磁盘驱动程序

问题描述 投票:0回答:1

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

对于处理页面错误,我知道我需要某种磁盘驱动器才能替换物理内存中的帧。但是,我无法在网上找到任何有关此内容的信息,并且我能找到的所有教程都具有简单的页面错误处理功能,该功能仅能打印出页面错误的原因,而我也想加载正确的页面/框架,如果由于页面不在内存中而引发了错误。

任何人都可以提供帮助或任何在线参考吗?

driver paging disk osdev page-fault
1个回答
0
投票

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

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

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

注意:

  • 您将需要一些方案来将页面发送到交换空间,并且在某些情况下(内存耗尽),您可能需要发送一些页面以将空间交换到可用的RAM,而您需要从交换空间中获取页面。为此,您可能需要以不同的方式处理某些事情,以更好地处理“交换颠簸”情况(例如,使系统实用程序和GUI之类的进程保持响应能力,并且仍然可以用来杀死其他进程)

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.