当发生页面错误时,操作系统从何处获取所需的磁盘地址?

时间:2014-12-20 11:40:52

标签: operating-system page-fault

当页表条目(PTE)未标记为有效时,表示所需数据不在内存中,而是在磁盘上。所以现在出现页面错误,操作系统负责将这一页数据从磁盘加载到内存。

我的问题是,操作系统如何知道确切的磁盘地址?

3 个答案:

答案 0 :(得分:2)

您以系统相关的方式询问。未标记为有效的PTE可能意味着该进程地址中根本不存在该地址。系统可能有另一个位来指示地址有效但物理映射的逻辑不存在。

操作系统需要维护一个表格,说明数据的放置位置。

数据可以存在于许多地方。 1.它可能是未初始化的数据,在任何地方都没有映射。通过清除物理页面并将其映射到进程地址空间来响应页面错误。

  1. 它可能位于页面文件中。

  2. 某些系统有一个单独的交换文件。

  3. 它可能位于可执行文件或共享库文件中。

答案 1 :(得分:0)

与虚拟内存寻址相同。
程序中显示的地址是虚拟地址或程序地址。对于每次访问存储器(要获取指令或数据),CPU必须将虚拟地址转换为真实的物理地址。虚拟内存地址可以认为由两部分组成:页码和页中的偏移量。页码确定哪个页面包含信息,偏移量指定页面中的哪个字节。 offset字段的大小是页面大小的对数2。
如果虚拟地址有效,则系统检查页面框架是否空闲。如果没有可用的框架,则运行页面替换算法以删除页面。

答案 2 :(得分:0)

2014年给出的答案是正确的。 处理器只知道该页面丢失-有时它具有不正确的权限(例如,写入只读页面)。那时,处理器会生成一个“页面错误”异常,内核会获取该异常,现在必须对其进行处理。

在某些情况下,例如在用户使用空指针时,此页面错误需要一直作为SIGSEGV(“分段违规”)信号一直传递给应用程序。但是,正如您所说,通常,内核应该并且可以处理页面错误。内核在其自己的表(不在页表内部,该表具有由处理器规定的特定格式的结构)中保留有关每个虚拟内存页应包含的信息。以下是内核可以通过查询自己的表来了解有关故障页面的一些内容。这不是详尽的清单。

  1. 这可能是磁盘上的mmap()页面。这种情况包括应用程序对mmap()的显式使用,但在运行可执行文件或使用共享库(也从磁盘映射到共享库)时,也会发生这种情况,因此页面错误也可能在处理器执行指令时发生,而不仅是在读取时和写作。内核会保留这些映射的列表,因此,当出现页面错误时,它可以确定需要读取磁盘上的哪个位置才能获得丢失的页面。因此,它从磁盘读取数据,并在获取数据时将其放入内存中的新页中,并将页表项(PTE)设置为指向该新页中的数据,并恢复应用程序线程-错误指令重试,现在成功。

  2. 这可能是页面已换出到磁盘。再次,内核保留一个表,其中列出了哪些页面已被换出,以及该页面现在位于交换分区(或交换文件或其他文件)中的哪个位置。

  3. 这可能是对“写时复制”页面的写尝试。内核需要制作源页面的副本,并更改​​页面表中的地址以指向新副本,然后允许写入。例如,当您分配较大的内存区域时,它可以指向现有的“零填充”页面,并且只有在您首次写入页面时才分配。在fork()之后的另一个示例是,新进程的页面都是指向原始进程页面的写时复制页面,并且仅在首次写入时(由任一进程)才被实际复制。

但是,由于您正在寻找可靠的资源,也许您想阅读一份解释,特别是Linux内核是如何做到这一点的,例如: https://vistech.net/~champ/online-docs/books/linuxkernel2/060.htm