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

Operating system 当页面错误发生时,操作系统从何处获得所需的磁盘地址?,operating-system,page-fault,Operating System,Page Fault,如果页表条目(PTE)未标记为有效,则表示所需的数据不在内存中,而是在磁盘上。所以现在页面错误发生了,操作系统负责将这一页数据从磁盘加载到内存 我的问题是,操作系统如何知道确切的磁盘地址?您是以依赖于系统的方式询问的。未标记为有效的PTE可能意味着进程地址中根本不存在该地址。系统可能有另一位来指示地址有效,但不存在逻辑到物理的映射 操作系统需要维护一个数据存放位置表 数据可以存在于许多地方。 1.它可能是在任何地方都没有映射的未初始化数据。通过清除物理页面并将其映射到进程地址空间来响应页面错误

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


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

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

操作系统需要维护一个数据存放位置表

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

  • 它可能在页面文件中

  • 有些系统有单独的交换文件

  • 它可能位于可执行文件或共享库文件中


  • 它与虚拟内存寻址相同。
    程序中出现的地址是虚拟地址或程序地址。对于每次内存访问,无论是获取指令还是数据,CPU都必须将虚拟地址转换为实际物理地址。虚拟内存地址可以被视为由两部分组成:页码和页内的偏移量。页码确定包含信息的页面,偏移量指定页面中的哪个字节。偏移量字段的大小是页面大小的对数基数2。

    如果虚拟地址有效,系统将检查页面框架是否可用。如果没有可用的帧,则运行页面替换算法删除页面。

    2014年给出的答案是正确的。处理器只知道该页丢失,或者有时该页的权限不正确(例如,写入只读页)。此时,处理器生成一个“页面错误”异常,内核得到该异常,现在必须处理该异常

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

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

  • 这可能是一个交换到磁盘的页面。同样,内核保存了一个表,其中记录了哪些页面被交换出去,以及该页面现在在交换分区(或交换文件,或其他)中的位置

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

  • 但是,由于您正在寻找可靠的来源,可能需要阅读Linux内核是如何做到这一点的解释,例如:
    .

    一般来说,这取决于。。例如,一个基于Linux的操作系统和当前交换到磁盘的内存页,请参见操作系统设计中的“鸡蛋总是先于鸡”。VMM首先必须知道如何映射内存,然后生成匹配的PTE。所以它总是知道如何维护页面错误。这是否回答了您的问题?