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

Col*_*lin 4 assembly operating-system

假设我们有一些x86指令

mov eax, [ebx]

而值[ebx]是一些地址0x123456789.

此地址0x123456789是指虚拟地址还是物理地址?

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

阅读每个程序员应该了解的内存,它指出"虚拟地址空间由CPU的内存管理单元(MMU)实现".

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

Mar*_*oom 7

在x86架构中,只需查看地址值,就无法从虚拟地址中分辨出物理地址.

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

但是,由于所有主要OS都使用分页,因此每个程序都使用虚拟地址.


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

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

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

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

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

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

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

由于这些指令是编译OS内核,JTAG调试器或宇宙射线大雨的结果,所以很少.


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

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