x86汇编中的地址是虚拟的还是物理的?

时间:2017-01-02 15:43:21

标签: assembly operating-system

假设我们有一些x86指令,如

mov eax, [ebx]

[ebx]的值是某个地址0x123456789

此地址0x123456789是否指虚拟或实际地址?

如果是虚拟的话,它会在执行进程的进程虚拟地址空间,还是内核虚拟地址空间?

阅读What Every Programmer Should Know About Memory,它指出“虚拟地址空间由内存实现 CPU的管理单元(MMU)“。

那么是否存在独立于操作系统的CPU虚拟地址空间?除了内核虚拟地址空间之外,为什么还需要它?如果没有操作系统,CPU如何执行虚拟到物理转换?

2 个答案:

答案 0 :(得分:6)

在x86架构中,只需查看地址值,即可通过虚拟地址告知物理地址。

在您的示例 1 中, 0x123456789 只是一个地址。
如果启用了paging,则程序执行的每次内存访问都使用虚拟地址 如果未启用分页,则使用的地址为物理 2

然而,由于所有主要操作系统都使用分页,因此每个程序都使用虚拟地址。

  

那么是否存在独立于操作系统的CPU虚拟地址空间?

CPU是通用芯片,它只为正在运行的软件提供功能 操作系统可以使用或不使用,CPU不会使用任何特殊含义。

这就像询问邮政系统是否独立于发件人/收件人一样 是的,它是独立的,因为它并不特别关心谁是邮件的人,但它是发送者/接收者使系统有用/活着。
因此,操作系统使用CPU提供的转换功能,无论如何它都需要。

  

除了内核虚拟地址空间之外,为什么还需要它?

我不知道什么是内核虚拟地址空间"在这种情况下,但通常操作系统无法跟踪程序执行的所有内存访问 所以它需要硬件支持(读取:特定的CPU功能。读取:分页)来转换它们的访问。

  

如果没有操作系统,CPU如何执行虚拟到物理转换?

它执行添加,IO或任何其他操作的方式相同:它根据结果/行为获取指令,执行指令并更改其状态(包括从虚拟到物理的转换映射)。

将这些指令作为编译OS内核,JTAG调试器或宇宙射线大雨的结果,很少有问题。

1 在您的示例中,EBX必须为 0x123456789

2 请注意,虚拟地址可以是逻辑地址(选择器:偏移量)或线性地址(转换后)。没有分页术语"物理地址"实际上并没有使用,而是地址只是逻辑(段:偏移)或线性。在上面的上下文中" physical"意味着"不会接受MMU翻译"。

答案 1 :(得分:1)

您正在描述记忆翻译的鸡和蛋问题。此问题仅发生在页表转换中。

执行用户模式汇编指令时,始终使用逻辑地址。

在场景后面,您的逻辑地址需要转换为物理地址。这是使用页表完成的。操作系统定义执行映射的表。将在您的进程中加载​​系统寄存器,以告知这些页表的位置。

页面表的地址是物理的还是逻辑/虚拟的?

如果它们是虚拟的,则可以将大型页面表分页到辅助存储。但是你得到了我上面提到的鸡和蛋的问题。如果页表是虚拟的,那么页表如何获得虚拟/逻辑地址?

该问题以多种系统特定方式处理。最简单的是处理器定义两个页表;一个用于系统空间,一个用于用户空间。系统页表始终是物理地址。用户页面表是虚拟(逻辑)地址,它们使用系统页面表将自身映射到物理地址。

  

"虚拟地址空间由CPU"的内存管理单元(MMU)实现。

这不准确并且具有误导性。 MMU将LOGICAL地址转换为PHYSiCAL地址,并在无法执行此操作时引发异常。

OPERATING SYSTEM实现虚拟地址空间。如果MMU无法转换逻辑地址,则会引发异常。操作系统异常处理程序必须通过从二级存储加载数据来确定是否可以虚拟处理内存访问。

  

那么是否存在独立于操作系统的CPU虚拟地址空间?

没有操作系统,虚拟地址空间就不存在。

  

如果没有操作系统,CPU如何执行虚拟到物理转换?

CPU(MMU)不进行虚拟翻译。它对物理翻译有逻辑作用。