【问题标题】:How do modern OS kernels (UNIX, Windows) distinguish between page faults? [closed]现代操作系统内核(UNIX、Windows)如何区分页面错误? [关闭]
【发布时间】:2016-04-20 02:35:54
【问题描述】:

我试图了解操作系统内核如何处理页面错误。 https://en.wikipedia.org/wiki/Page_fault 上的维基百科文章区分了 Minor、Major 和 Invalid 页面错误。

主要页面错误是指虚拟->真实地址映射尚未出现在主内存中,但真实地址存在于磁盘上,对于此页面错误异常,异常处理程序会搜索磁盘并返回页面框架到主存并进行虚拟->真实地址映射。

无效页面错误是指应用程序尝试访问未映射的地址,例如恶意指针。引发了相同的页面错误异常,但异常处理程序现在决定终止程序,主要是出现 Seg Fault (core dumped) 错误。

我的问题是,内核如何区分这两种类型的页面错误?我希望对此进行深入了解,并希望尽可能将我链接到更详细的文章。请向我寻求任何澄清!

谢谢。

【问题讨论】:

  • 删除了 linux 标签。我宁愿在这个页面上回答这个问题;由于某种原因,这个问题很难得到一个直截了当的答案......

标签: memory-management operating-system kernel


【解决方案1】:

粗略地说,内核有一些表示(当前)进程的virtual address space。它知道每个页面段如何为它处理页面错误。它在物理地址中工作(因此它的地址空间不是用户模式地址空间),但维护一些复杂的数据结构以有效地表示虚拟地址和物理地址(如果有)之间的映射并配置MMU根据这些。

参见例如 Gorman 的书 understanding the Linux virtual memory manager(一些细节可能已经过时)。

另请阅读 GNU Hurd external pager 机制。

page fault 被赋予了发生故障的相关(物理和/或虚拟)地址(例如,MMU 硬件)。请参阅paging web page of osdev,并阅读有关page tables 的信息。内核处理所有页面错误(它为每个页面错误获取相同硬件exception,并带有描述错误的数据 - 包括错误的虚拟地址)并确定它是什么类型的错误。

在 Linux 上,您甚至可以处理(以非便携式、ABI 和处理器特定的方式)SIGSEGV signal。 (因此内核已经收集了它能够提供给您的SIGSEGV 处理程序的所有信息。但请仔细阅读signal(7))。但这通常是不值得的。

还可以查看 Linux 内核源代码的 mm/ subtree

另请阅读广泛的documentation of Intel processors。也许阅读一些关于处理器架构和操作系统的书籍,并研究更简单的架构(如MMIXRISC-V)。

参见Operating Systems : Three Easy Pieces,尤其是它的introduction to paging

【讨论】:

  • 是的,但是假设进程想要将地址移动到寄存器中;此虚拟地址尚未映射到虚拟地址空间中。内核如何知道这个虚拟地址实际上不是恶意地址?
  • 我回答了,但我不确定你到底在问什么。细节很复杂,并且是特定于处理器和操作系统的。阅读操作系统和处理器架构书籍
  • 嗨,Basile,感谢您的回答。我猜我的问题就像先有鸡还是先有蛋的问题。内核如何__italic__(知道)指令请求的虚拟地址实际上确实对应于物理地址,尽管页框尚未加载到内存中?
  • 阅读我给你的所有参考资料......它应该回答你的问题。
【解决方案2】:

我会忽略维基百科文章中的模型。无效页错误,根本不是页错误,而是逻辑内存转换失败。

主要和次要页面错误的概念,恕我直言,令人困惑。事实上,维基百科的文章将两种不同的事情描述为轻微的页面错误。我什至想知道是否有意与文本的阅读方式不同。

我会重新考虑:

  1. 进程访问内存地址。
  2. 内存管理单元尝试使用页表将引用的逻辑页转换为物理页帧。 如果无法进行这样的转换(没有对应的表表项,页表项被标记为无效),则会生成某种访问冲突错误异常(Wiki 文章中的 Invalid Page Fault)。
  3. 如果逻辑页面和物理页面框架之间已经存在直接映射,我们就完成了。
  4. 如果页表显示当前没有逻辑页对应的物理页框,则CPU触发缺页异常。
  5. 页面错误处理程序执行。
  6. 页面错误处理程序必须找到逻辑(现在是虚拟)页面的存储位置。
  7. 在此过程中,页面错误处理程序可能会发现该页面已经位于物理内存中。有多种方式可以发生这种情况。在这种情况下,页面错误处理程序所要做的就是更新页表以引用物理页框并重新启动指令(这是 wiki 文章称为“次要页面错误”的情况之一)。全部完成。
  8. 另一种选择是将虚拟页面存储在磁盘上的页面文件、可执行文件或共享文件中。在这种情况下,处理程序需要分配一个物理页框,将虚拟页从磁盘读入页框,更新页表,然后重新启动指令(wiki 称之为“主要页错误”)。由于磁盘读取,“主要”故障比“次要”故障需要更长的时间来处理。

操作系统的功能之一是跟踪所有虚拟页面的存储位置。用于查找页面的具体机制取决于多种因素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2011-11-17
    • 2020-08-27
    相关资源
    最近更新 更多