虚拟地址是否总是转换为物理地址

时间:2015-11-17 21:45:51

标签: operating-system virtualization

我正在研究操作系统,我有一个问题。 虚拟地址是否总是转换为物理地址?如果是,为什么?

2 个答案:

答案 0 :(得分:3)

您可以与物理内存类似地看到这一点。如果你的CPU可以像64 GiB的内存一样(如x86和PAE那样),你需要安装64 GiB的内存吗?否。

如果你有一个(x86)指令寻址内存,比如

mov eax, [1234h]

尝试访问虚拟地址 1234h = 0x1234的双字。现在,大致发生以下情况:

  1. 检查页面表是否为0x1234寻址的页面定义了相应的页面框架。

  2. 如果,则会引发页面错误。在这种情况下,虚拟地址0x1234 不会转化为实际地址

  3. 如果,MMU会从虚拟地址计算物理地址并返回位于那里的双字。执行流程正常进行。

  4. 毕竟,并非所有页面都必须映射到页面帧,即物理内存。这种情况由页面错误表示,该错误由页面错误处理程序处理。
    您还应该阅读有关分页工作方式的this

答案 1 :(得分:0)

尽管有很多关于这里学生要求的页面表的问题(显然有相同无用的教科书),答案是否定的。

当您访问内存位置时,遵循的基本过程是:

  1. 从地址中提取逻辑页码。
  2. 找到与页面表对应的页面表项。 如果系统使用嵌套页表,则此处将有多个查找。

  3. 检查是否存在表条目。 (是的,坏教科书的读者,页表不必跨越整个逻辑地址空间)。 如果地址没有页表条目,则CPU触发器通常会触发陷阱。

  4. 检查页表条目。它是否指向映射到地址空间的页面。 如果没有,CPU通常会触发陷阱。 通常,地址空间中的第一页有一个页表条目,没有映射到它的页面,因此应用程序可以捕获对NULL指针的引用。

  5. 检查页表条目。页面是否映射到内存?

  6. 如果没有,CPU会触发页面FAULT(不是陷阱)。 CPU通过查找内存存储在磁盘上的位置,将其加载到物理内存中,以及更新页表条目以使其指向该物理内存位置来响应故障。 CPU重新启动导致陷阱的指令。

    另外一步(不是你的问题的一部分)是CPU检查页表以确保访问模式允许访问的类型(读/写/执行)(例如,kernel / user / .. )。

    此过程中有几个地方可以触发异常(故障或陷阱)。