【发布时间】:2015-11-18 22:35:48
【问题描述】:
我正在研究操作系统,我有一个问题。 虚拟地址是否总是转换为物理地址?如果是,为什么?
【问题讨论】:
标签: operating-system virtualization
我正在研究操作系统,我有一个问题。 虚拟地址是否总是转换为物理地址?如果是,为什么?
【问题讨论】:
标签: operating-system virtualization
否。
你可以看到这类似于物理内存。如果您的 CPU 可以寻址 64 GiB 的内存(与 x86 和 PAE 一样),您是否需要安装 64 GiB 的内存?没有。
如果你有一个 (x86) 指令寻址内存,比如
mov eax, [1234h]
试图访问 虚拟地址 1234h = 0x1234 的双字。现在,大致会发生以下情况:
检查页表是否为0x1234寻址的页面定义了相应的页框。
如果不是,则会引发页面错误。在这种情况下,虚拟地址 0x1234不会转换为物理地址。
如果是,MMU 从虚拟地址计算物理地址并返回位于那里的双字。执行流程正常进行。
毕竟,并非所有页面都必须映射到页框,即物理内存。这种情况由 page fault 指示,由 page fault 处理程序处理。
您还应该阅读 this 了解分页的工作原理。
【讨论】:
尽管这里的学生(他们显然有同样无用的教科书)提出了许多关于页表的问题,但答案是否定的。
当您访问内存位置时,遵循的基本过程是:
找到页表对应的页表项。 如果系统使用嵌套页表,这里会出现多次查找。
检查表条目是否存在。 (是的,糟糕教科书的读者,页表不必跨越整个逻辑地址空间)。 如果该地址没有页表条目,CPU 触发器通常会触发陷阱。
检查页表条目。它是否引用映射到地址空间的页面。 如果没有,CPU 通常会触发陷阱。 通常,地址空间中的第一页有一个页表条目,而没有映射到它的页,以便应用程序可以捕获对 NULL 指针的引用。
检查页表条目。页面是否映射到内存?
如果没有,CPU 会触发页面 FAULT(不是陷阱)。 CPU 通过查找内存在磁盘上的存储位置、将其加载到物理内存并更新页表条目以使其指向该物理内存位置来响应故障。 CPU 重新启动导致陷阱的指令。
另一个步骤(不是您的问题的一部分)是 CPU 检查页表以确保访问模式(例如内核/用户/.. .).
在这个过程中有几个地方可以触发异常(故障或陷阱)。
【讨论】: