x86 和 x64 共享指令集?

x86 and x64 share instruction set?

我不知道 32 位应用程序如何在 64 位 OS 上 运行。

我的理解是32bit/64bit指的是寄存器大小。指令集应该不同,因为它们具有不同大小的寄存器。

但我知道x86-64指令集是x86指令集的64位版本

  1. 我们之所以可以运行 32bit application on 64bit OS是因为x86-64吗?

  2. 如果是这样,为什么 32 位应用程序有时与 64 位不兼容 windows?为什么我们需要 WOW64? (有时我们会被要求选择要安装的版本。)

  3. x64指令集除了x86-64还有其他指令集吗?有人告诉我 x64 只是为了扩展内存范围,他们拥有的指令集是相同的。这是正确的吗?

Is the reason we can run 32bit application on 64bit OS is because of the x86-64?

大部分情况下是的。但让我简要解释一下,32 位/64 位实际上不一定指的是寄存器大小,因为问题是您在谈论哪种寄存器(类型)?更准确地说,32 位/64 位指的是地址总线的宽度(即可以寻址多少内存),或者换句话说,C 中指针的大小。然后,32/64 位将(间接)指代单词大小也就是机器基本 'integer' 类型的大小。无论如何,32 位/64 位必须对可寻址内存做更多的事情,但也与字大小 (sizeof(int)) 和寄存器大小有关。 那么,回到问题。许多 32 位二进制文​​件在 64 位系统上仍然可以 运行。是的,因为 "new" x86-64 仅扩展了原始的 x86 ISA(当然还有更多指令)。因此,您的旧 32 位二进制文​​件(由 x86 指令组成)在新系统中可能仍然 运行nable。

If so, why are 32bit applications sometimes not compatible in 64bit windows? Why do we need WOW64? (Sometimes we are asked to choose which version to install.)

是的,在很多情况下,旧的 x86 32 位 binary/application 将无法在新的 64 位系统中 运行 启用。例如,您的二进制文件可能包含一条或多条指令(出于某种原因)不再受支持(有关示例,请参见 )。或者,如果您的 binary/application 特别需要使用新系统中不存在的 32 位库。在那种情况下,您的系统会抱怨您不能 运行 这个 32 位应用程序。

Does x64 instruction set have any other instruction set except x86-64? Some people told me x64 is just to extend memory range and the instruction set they have is identical. Is this correct?

首先,Intel64、AMD64、x86-64、x64 几乎(或多或少)指的是同一个东西! 是的,x86-64 指令集非常庞大并且会定期接收扩展(想想 MMX、SSE、AVX 等)。每个扩展就像一个迷你指令集。在维基百科上查找 x86 指令集,您应该可以获得大量信息。

x86 处理器有多种模式,支持基本 x86 指令集的不同变体。它们都支持 16 位 "real mode",实现了只能寻址 1MB 的原始 8086 分段内存模型。 IIRC,它们还可以支持 286 寻址模式,这是分段内存模型的一种变体。它们支持 386 保护模式,将寄存器扩展到 32 位。到目前为止,它们基本上实现了相同的指令集 (ISA),但有一些额外的指令前缀和更改指令字大小的默认解释的能力(算术和内存指令可以默认为 16 位或 32 位,然后是前缀将 select non-default 的意思)。这叫做"legacy mode."

64 位扩展(x86-64 或 x64)不完全向后兼容。许多 single-byte 指令操作码被重新分配以表示新的 "REX" 前缀,允许指定更宽的(64 位)寄存器和指定更多的寄存器。要使用此指令集,处理器 运行 处于另一种称为 "long mode."

的模式

现在,当您在 64 位模式下拥有 64 位操作系统内核 运行ning 并且 OS 上下文切换到用户进程时,它可以同时更改模式时间。因此,您可以保持 64 位模式以 运行 64 位进程,或者您可以切换到旧版 32 位模式以 运行 32 位进程。当 32 位进程进行操作系统调用时,CPU 自动切换回 64 位模式到 运行 内核代码 64 位内核必须经过专门设计才能利用此模式切换能力。

查看 https://en.wikipedia.org/wiki/X86-64#Operating_modes 了解更多详情。