Memory 分页/页面错误处理程序-如何使用虚拟地址查找磁盘上的特定内容

Memory 分页/页面错误处理程序-如何使用虚拟地址查找磁盘上的特定内容,memory,memory-management,operating-system,paging,disk,Memory,Memory Management,Operating System,Paging,Disk,分页允许机器在虚拟内存地址空间和真实内存地址空间之间提供一层间接寻址。在给定地址后,MMU遍历页表并确定相应的帧是否在内存中。如果是,则它已找到实际地址,并且可以执行相关指令 但是,如果它不在RAM中呢?当MMU访问页表并看到需要从磁盘获取相应的帧时,会发生什么情况它如何知道它在磁盘中的位置?我们开始使用的虚拟地址如何用于映射磁盘中的特定内容 我怀疑这不是通过软件实现的,因为为磁盘提供某种页面表来映射所有地址空间太昂贵了,因为它会自动将I/O操作的数量增加一倍,并使用大量内存,但还有其他方法吗

分页允许机器在虚拟内存地址空间和真实内存地址空间之间提供一层间接寻址。在给定地址后,MMU遍历页表并确定相应的帧是否在内存中。如果是,则它已找到实际地址,并且可以执行相关指令

但是,如果它不在RAM中呢?当MMU访问页表并看到需要从磁盘获取相应的帧时,会发生什么情况它如何知道它在磁盘中的位置?我们开始使用的虚拟地址如何用于映射磁盘中的特定内容

我怀疑这不是通过软件实现的,因为为磁盘提供某种页面表来映射所有地址空间太昂贵了,因为它会自动将I/O操作的数量增加一倍,并使用大量内存,但还有其他方法吗

谢谢


编辑:MMU除了告诉操作系统获取给定页面外,不会处理磁盘。操作系统中的页面错误处理程序是从磁盘获取内容的程序,但是如何获取呢?

操作系统需要知道数据在哪里。发生页面错误时,内存可能位于多个位置。不经意间:

  • 它可能是根本不在磁盘上的初始化数据(想象一下程序启动)

  • 它可能是静态数据(在某些情况下是动态数据),必须从可执行文件或共享可执行文件加载

  • 它可能必须从一个或多个页面文件中的某个位置加载


  • MMU不处理此问题。它所做的只是触发一个页面错误。操作系统故障处理程序必须识别正在访问的地址,找到所需的页面(从上述来源之一),(必要时释放物理内存),分配一页物理内存,将页面中的数据(如果存在)加载到物理内存中,退出异常处理程序以重新启动导致页面错误的指令。

    MMU只负责将虚拟地址转换为物理地址。它不做磁盘访问或任何事情

    许多操作系统使用的将内存交换到磁盘或将磁盘上的文件映射到虚拟内存地址空间的技巧通常由

  • 在页表中将要交换到磁盘的区域标记为无效,以便在访问时导致页错误
  • 当程序访问该区域时,MMU会引发页面错误,并将控制权返回给操作系统
  • 推断已访问的页面,并将相应的数据从磁盘加载到内存中
  • 将页表中的相应条目标记为有效,并将其指向包含先前加载的数据的内存
  • 在load指令之前将控制权返回到程序,以便重试内存访问
  • 程序现在从现在有效的页面读取非wiser

  • 操作系统在页面表中查找。可能有一个单一的一体式页面表,但更可能有两个,一个用于将虚拟地址映射到真实地址(对于“常驻”页面),另一个用于将所有页面映射到其磁盘地址(或指示页面尚未分配且应清除)。(第二个页表(以及第一个页表)可能还有其他术语,具体取决于操作系统。)请注意,磁盘位置的页表会被频繁引用,即使它是可分页的(有些是,有些不是),也不会为活动进程分页。