【问题标题】:Does a virtual address always translate to a physical one虚拟地址是否总是转换为物理地址
【发布时间】:2015-11-18 22:35:48
【问题描述】:

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

【问题讨论】:

    标签: operating-system virtualization


    【解决方案1】:

    你可以看到这类似于物理内存。如果您的 CPU 可以寻址 64 GiB 的内存(与 x86 和 PAE 一样),您是否需要安装 64 GiB 的内存?没有。

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

    mov eax, [1234h]
    

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

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

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

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

    毕竟,并非所有页面都必须映射到页框,即物理内存。这种情况由 page fault 指示,由 page fault 处理程序处理。
    您还应该阅读 this 了解分页的工作原理。

    【讨论】:

    • 发生页面错误的常见原因:请求的页面已被移动到磁盘(“分页文件”或“交换分区”)以释放 RAM 以供其他程序使用,或者请求的地址是假的,并没有被映射到任何东西。在后一种情况下,操作系统通常会因“无效页面错误”、“访问冲突”或“分段错误”等错误而终止进程。
    【解决方案2】:

    尽管这里的学生(他们显然有同样无用的教科书)提出了许多关于页表的问题,但答案是否定的。

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

    1. 从地址中提取逻辑页码。
    2. 找到页表对应的页表项。 如果系统使用嵌套页表,这里会出现多次查找。

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

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

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

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

    另一个步骤(不是您的问题的一部分)是 CPU 检查页表以确保访问模式(例如内核/用户/.. .).

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

    【讨论】:

    • 你不应该声称他们显然有相同的无用教科书
    • 这个答案大部分都是好的,除了:“CPU通过查找内存在磁盘上的存储位置,将其加载到物理内存中并更新页表条目来响应故障,以便它指向那个物理内存位置。”实际上,CPU 开始运行操作系统的页面错误处理程序,它(通常)执行这些操作。 CPU 本身没有内置代码用于与磁盘控制器通信以读取页面文件或交换分区。
    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 2017-07-07
    • 2015-01-29
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多