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

8
假设我们有一些x86指令,例如
mov eax,[ebx]
并且[ebx]的值是某个地址0x123456789。
这个地址0x123456789是虚拟地址还是物理地址?
如果是虚拟地址,那么它会在执行进程的进程虚拟地址空间中还是内核虚拟地址空间中?
阅读What Every Programmer Should Know About Memory,它指出“虚拟地址空间由CPU的内存管理单元(MMU)实现”。
因此,是否存在与操作系统无关的CPU虚拟地址空间?为什么需要除内核虚拟地址空间之外的这个?CPU如何执行虚拟到物理的转换而没有操作系统的帮助?

1
是的,它是虚拟的并且是每个进程的。没有操作系统,你的程序就处于控制状态,并且必须初始化很多东西,包括内存管理(如果你切换到保护模式)。在16位实模式下,你有分段的物理内存。 - Jester
1
在CPU切换到“保护”模式之前,地址是真实的物理地址。之后,MMU被涉及。操作系统的重要工作之一是管理MMU,因此没有操作系统,CPU确实会非常困惑。 - Pointy
请注意,“内核”虚拟地址空间就是CPU的MMU驱动的虚拟地址空间;它们并不是两个不同的地址空间。 - Pointy
1
这是关于编程的内容,翻译成中文:这就是虚拟和物理之间的区别,使得指令不知道。如果它们通过指令中的某些位知道了,那么你就不一定需要虚拟和物理的区别,而是在每个指令中指定它。当然,你仍然可以有权限,只是会占用更多的指令空间。 - old_timer
2个回答

8
在x86架构中,仅凭地址值无法区分物理地址和虚拟地址。
在您的示例中10x123456789只是一个地址。
如果启用了分页,则程序执行的每个内存访问都使用虚拟地址。
如果未启用分页,则使用的地址是物理地址2
然而,由于所有主要操作系统都使用分页,因此每个程序都使用虚拟地址。

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

CPU是一种通用的芯片,它仅为运行的软件提供功能。
操作系统可以使用它们也可以不使用,CPU不会给任何使用者带来特殊的含义。
这就像询问邮政系统是否独立于发送者/收件人一样。
是的,它是独立的,因为它并不特别关心谁邮寄给谁,但是发送者/收件人使系统有用/活跃。
因此,操作系统使用CPU提供的翻译功能,以任何方式进行操作。

为什么需要这个,除了内核虚拟地址空间?

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

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

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

这些指令是OS内核、JTAG调试器或宇宙射线重雨编译的结果,都没有太大影响。

1在您的示例中,应该是EBX而不是0x123456789

2请注意,虚拟地址可以是逻辑地址(选择器:偏移量)或线性地址(经过转换后)。如果没有分页,则实际上不会使用术语“物理地址”,而是将地址视为逻辑(段:偏移量)或线性。在上下文中,“物理”意味着“不会经过MMU翻译”。


1
你在描述内存翻译的鸡和蛋问题。这个问题仅在页面表翻译中出现。
当您执行用户模式汇编指令时,您始终使用逻辑地址。
在幕后,您的逻辑地址需要转换为物理地址。这是使用页面表完成的。操作系统定义了执行映射的表。将加载有您的进程的系统寄存器告诉这些页面表的位置。
页面表的地址是物理还是逻辑/虚拟的?
如果它们是虚拟的,大的页面表可以分页到辅助存储器中。但是,那么您就会遇到我上面提到的鸡和蛋问题。如果页面表是虚拟的,那么页面表如何获取虚拟/逻辑地址?
许多系统都以特定的方式处理该问题。最简单的方法是处理器定义两个页面表;一个用于系统空间,一个用于用户空间。系统页面表始终是物理地址。用户页面表是虚拟(逻辑)地址,使用系统页面表将自己映射到物理地址。
引用:“由CPU的内存管理单元(MMU)实现虚拟地址空间”。
那不够精确,且具有误导性。内存管理单元将逻辑地址转换为物理地址,并在无法执行此操作时引发异常。
操作系统实现虚拟地址空间。如果MMU无法转换逻辑地址,则引发异常。操作系统异常处理程序必须确定是否可以通过从辅助存储加载数据来虚拟处理内存访问。

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

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

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

CPU(MMU)不进行虚拟转换。它执行逻辑到物理的转换。

如果MMU不执行虚拟到物理地址的转换,您能否谈谈如何进行虚拟到物理地址的转换? - gaganso
1
这是由操作系统完成的。如果CPU无法执行逻辑地址转换,则会触发页面错误(或其他类型的异常)。页面错误处理程序进行虚拟翻译,并确定虚拟页面在二级存储器中的位置。操作系统设置一个逻辑页面,将虚拟页面加载到具有物理映射的逻辑页面中,然后重新启动导致故障的指令。 - user3344003

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接