虚拟地址是否总是转换为物理地址
Does a virtual address always translate to a physical one
我正在学习操作系统,我有一个问题。
虚拟地址是否总是转换为物理地址?如果是,为什么?
没有.
你可以看到这类似于物理内存。如果您的 CPU 可以寻址 64 GiB 内存(与 x86 和 PAE 一样),您是否需要安装 64 GiB 内存?编号
如果你有一条 (x86) 指令寻址内存,比如
mov eax, [1234h]
试图访问 虚拟地址 1234h = 0x1234
处的双字。现在,大致发生以下情况:
检查页面table是否为0x1234
寻址的页面定义了相应的页面框架。
如果不是,则会引发页面错误。在这种情况下,虚拟地址 0x1234
不会转换为物理地址 .
如果是,MMU根据虚拟地址和returns位于那里的双字计算物理地址。执行流程正常进行。
毕竟不是所有的页面都必须映射到页框,即物理内存。这种情况由 页面错误 指示,它由 页面错误 处理程序处理。
您还应该阅读 this 了解分页的工作原理。
尽管这里的学生(他们显然拥有同样无用的教科书)提出了很多关于第 table 页的问题,但答案是否定的。
当您访问内存位置时,遵循的基本过程是:
- 从地址中提取逻辑页码。
找到与页面 table 对应的页面 table 条目。
如果系统使用嵌套页面tables,这里会出现多次查找。
检查是否存在 table 条目。 (是的,烂教材的读者,页面table不一定要跨越整个逻辑地址space)。
如果该地址没有页面 table 条目,则 CPU 触发器通常会触发陷阱。
检查页面 table 条目。它是否引用映射到地址 space 的页面。
如果不是,CPU 通常会触发陷阱。
通常,地址 space 中的第一页有一个页 table 条目,但没有页映射到它,以便应用程序可以捕获对 NULL 指针的引用。
检查页面 table 条目。页面是否映射到内存?
如果不是,CPU 会触发页面错误(不是陷阱)。 CPU 通过查找内存在磁盘上的存储位置、将其加载到物理内存并更新页面 table 条目以使其指向该物理内存位置来响应故障。 CPU 重新启动导致陷阱的指令。
另一个步骤(不是您的问题的一部分)是 CPU 检查页面 table 以确保正在尝试的访问类型 (read/write/execute) 是访问允许的模式(例如,kernel/user/ ...)。
这个过程中有几个地方可以触发异常(故障或陷阱)。
我正在学习操作系统,我有一个问题。 虚拟地址是否总是转换为物理地址?如果是,为什么?
没有.
你可以看到这类似于物理内存。如果您的 CPU 可以寻址 64 GiB 内存(与 x86 和 PAE 一样),您是否需要安装 64 GiB 内存?编号
如果你有一条 (x86) 指令寻址内存,比如
mov eax, [1234h]
试图访问 虚拟地址 1234h = 0x1234
处的双字。现在,大致发生以下情况:
检查页面table是否为
0x1234
寻址的页面定义了相应的页面框架。如果不是,则会引发页面错误。在这种情况下,虚拟地址
0x1234
不会转换为物理地址 .如果是,MMU根据虚拟地址和returns位于那里的双字计算物理地址。执行流程正常进行。
毕竟不是所有的页面都必须映射到页框,即物理内存。这种情况由 页面错误 指示,它由 页面错误 处理程序处理。
您还应该阅读 this 了解分页的工作原理。
尽管这里的学生(他们显然拥有同样无用的教科书)提出了很多关于第 table 页的问题,但答案是否定的。
当您访问内存位置时,遵循的基本过程是:
- 从地址中提取逻辑页码。
找到与页面 table 对应的页面 table 条目。 如果系统使用嵌套页面tables,这里会出现多次查找。
检查是否存在 table 条目。 (是的,烂教材的读者,页面table不一定要跨越整个逻辑地址space)。 如果该地址没有页面 table 条目,则 CPU 触发器通常会触发陷阱。
检查页面 table 条目。它是否引用映射到地址 space 的页面。 如果不是,CPU 通常会触发陷阱。 通常,地址 space 中的第一页有一个页 table 条目,但没有页映射到它,以便应用程序可以捕获对 NULL 指针的引用。
检查页面 table 条目。页面是否映射到内存?
如果不是,CPU 会触发页面错误(不是陷阱)。 CPU 通过查找内存在磁盘上的存储位置、将其加载到物理内存并更新页面 table 条目以使其指向该物理内存位置来响应故障。 CPU 重新启动导致陷阱的指令。
另一个步骤(不是您的问题的一部分)是 CPU 检查页面 table 以确保正在尝试的访问类型 (read/write/execute) 是访问允许的模式(例如,kernel/user/ ...)。
这个过程中有几个地方可以触发异常(故障或陷阱)。