Operating system 页面错误-操作系统如何在辅助存储中搜索页面?

Operating system 页面错误-操作系统如何在辅助存储中搜索页面?,operating-system,paging,page-tables,Operating System,Paging,Page Tables,我的问题是,当出现页面错误且所需页面不在RAM中时,在此之后,操作系统如何知道在整个辅助内存中查找给定页面以将其带到RAM中?那么,逻辑地址是辅助内存存储的地址,还是所需的辅助存储地址存储在页表本身或其他方式中? 我觉得我可能在这里遗漏了一些非常基本的东西,但这个疑问出现在我的脑海中,快速的谷歌搜索并没有提供任何答案 我的问题是,当出现页面错误且所需页面不在RAM中时,在此之后,操作系统如何知道在整个辅助内存中查找给定页面以将其带到RAM中 如果有50种不同的操作系统,平均每个系统支持10种不同

我的问题是,当出现页面错误且所需页面不在RAM中时,在此之后,操作系统如何知道在整个辅助内存中查找给定页面以将其带到RAM中?那么,逻辑地址是辅助内存存储的地址,还是所需的辅助存储地址存储在页表本身或其他方式中? 我觉得我可能在这里遗漏了一些非常基本的东西,但这个疑问出现在我的脑海中,快速的谷歌搜索并没有提供任何答案

我的问题是,当出现页面错误且所需页面不在RAM中时,在此之后,操作系统如何知道在整个辅助内存中查找给定页面以将其带到RAM中

如果有50种不同的操作系统,平均每个系统支持10种不同的体系结构,那么最多会有500种不同的答案;其中一个答案是“所有软件都使用物理地址,没有虚拟内存,也没有辅助内存”,另一个答案是“虚拟地址是磁盘上的一个位置,RAM只是用作磁盘缓存来加速它”(请参阅)

对于在最典型的体系结构上运行的最典型的现代操作系统;如果您计算出内核需要知道的关于每个虚拟页面的所有信息(例如,页面伪装成什么、页面实际是什么、磁盘上的位置(如果有)、RAM中的位置(如果有)、跟踪“最近使用最少”的信息、跟踪“写拷贝数”的信息等);然后,您可以将所有信息分散到多个不同的数据结构中,以便:

  • 有些数据结构是CPU本身使用/需要的,有些则不是
  • 相同的信息可能同时存在于2个或多个数据结构中,也可能不存在
  • 有些数据结构的每个虚拟页面都有一个条目,有些数据结构的多个页面的每个范围都有一个条目
  • 有些数据结构是数组/表,有些是树,有些是表的树,还有一些是其他的
  • 有些人使用“虚拟地址”或“虚拟页码”作为查找信息的键;还有一些人使用其他东西(例如PowerPC和安腾上的倒页表使用“物理地址”作为索引,因为使用您试图查找的内容作为索引是您可能做的最不明智的事情,所以为什么不呢?)
  • 有些数据结构可能在内核中,有些可能不在内核中(例如,L4微内核通过“抽象层次地址空间”模型纯粹在用户空间中管理虚拟内存映射)
一般而言;关于页面数据在(每个不同的?)辅助内存(如果有辅助内存)中的位置的信息将存储在一个或多个事物中的一个或多个位置

请注意,当页面错误发生时,页面错误处理程序通常需要做出多个决策;可能首先要弄清楚是什么导致了访问(一个进程,内核本身?)以及访问应该被允许还是被拒绝,然后弄清楚该怎么做(发送
SIGSEGV
?内核死机吗?将数据提取到CPU的TLB中?使CPU的TLB中的陈旧数据无效?写时复制克隆吗?从交换空间提取数据吗?从文件提取数据?),因此页面错误处理程序最终会从(可能)多个不同的位置找到多个不同的数据段

一个具体的例子

对于我的操作系统设计(基于异步消息传递并使用微内核);微内核足够小,可以针对特定体系结构进行定制设计和优化(不考虑可移植性)。操作系统设计用于分布式系统,因此共享内存(和
fork()
)不受支持(您不希望页面错误处理程序必须通过拥挤的网络连接从远程计算机获取数据才能执行“写时复制”);并且“写时复制”的唯一情况是内存映射文件,其中页面由一个或多个进程和(本地)VFS缓存共享

对于64位80x86,CPU需要一个由4级表(页表、页目录、页目录指针表和页映射4级)组成的树,为了提高效率(减少内存消耗和缓存未命中等),我尽可能多地使用这些表

对于页表条目(如果使用2个MiB页,则为页目录条目);如果页不存在,则有63位被CPU忽略,操作系统可将其用于自己的目的;如果页存在,则(取决于CPU支持的功能)操作系统至少有9位可用于其自身目的,CPU使用的标志(例如,“读、写、不执行”标志)可用于增加操作系统自身的信息

当一个页面不存在时,63位被分为2个字段-一个8位字段用于跟踪页面的虚拟类型(如果它应该像RAM一样工作,如果它应该是可执行的,如果它应该使用“写回”缓存等),以及一个55位的“where”字段。如果“where”中的最高位字段设置页面被发送到交换空间,其他54位为“交换空间句柄”(允许交换空间的最大值为“2**54*4 KiB”);如果“where”字段中的最高位为空,则其他54位为“内存映射文件句柄”。如果因“not present”而发生页面错误页,页错误处理程序使用8位字段来确定访问是应该被允许还是被拒绝(或者如果已经有另一个线程访问了它,它已经被处理),然后(如果应该允许访问),页错误处理程序告诉调度程序将线程置于“等待页”状态,并将页标记为“正在获取”(以便属于sam的其他线程