【问题标题】:x86 and x64 share instruction set?x86 和 x64 共享指令集?
【发布时间】:2016-04-21 15:33:54
【问题描述】:
我不知道 32 位应用程序如何在 64 位操作系统上运行。
我的理解是 32bit/64bit 是指寄存器大小。指令集应该不同,因为它们具有不同大小的寄存器。
但我知道有 x86-64 指令集是 x86 指令集的 64 位版本。
我们可以在 64 位操作系统上运行 32 位应用程序的原因是因为 x86-64 吗?
如果是这样,为什么 32 位应用程序有时在 64 位窗口中不兼容?为什么我们需要WOW64? (有时我们会被要求选择安装哪个版本。)
x64 指令集是否有除 x86-64 之外的任何其他指令集?有人告诉我 x64 只是为了扩展内存范围,他们拥有的指令集是相同的。这是正确的吗?
【问题讨论】:
标签:
architecture
64-bit
cpu
32-bit
cpu-architecture
【解决方案1】:
我们可以在 64 位操作系统上运行 32 位应用程序的原因是因为
x86-64?
大部分情况下是的。但是让我简单解释一下,32 位/64 位实际上并不一定指的是寄存器大小,因为问题是您在说哪个寄存器(类型)?更准确地说,32 位/64 位指的是地址总线的宽度(即可以寻址多少内存),或者换句话说,C 中指针的大小。然后,32/64 位(间接地)指字长也就是机器的基本“整数”类型的大小。无论如何,32 位/64 位必须对可寻址内存做更多的事情,但也与字大小 (sizeof(int)) 以及寄存器大小有关。
所以,回到问题。许多 32 位二进制文件仍然可以在 64 位系统上运行。是的,因为“新”x86-64 仅扩展了原始 x86 ISA(当然还有更多说明)。因此,您的旧 32 位二进制文件(由 x86 指令组成)可能仍可在新系统中运行。
如果是这样,为什么 32 位应用程序有时与 64 位不兼容
视窗?为什么我们需要WOW64? (有时我们被要求选择哪个
要安装的版本。)
是的,在许多情况下旧的 x86 32 位二进制/应用程序无法在新的 64 位系统中运行。例如,您的二进制文件可能包含(出于某种原因)不再受支持的一个或多个指令(有关示例,请参见this)。或者,如果您的二进制/应用程序特别需要使用新系统中不存在的 32 位库。在这种情况下,您的系统会抱怨您无法运行这个 32 位应用程序。
x64指令集除了x86-64还有其他指令集吗?
有人告诉我 x64 只是为了扩展内存范围和
他们拥有的指令集是相同的。这是正确的吗?
首先,Intel64、AMD64、x86-64、x64 几乎(或多或少)指的是同一个东西!
是的,x86-64 指令集非常庞大,并且会定期接收扩展(想想 MMX、SSE、AVX 等)。每个扩展就像一个迷你指令集。在 Wikipedia 上查找 x86 指令集,您应该会获得大量信息。
【解决方案2】:
x86 处理器具有多种模式,支持基本 x86 指令集的不同变体。它们都支持 16 位“实模式”,实现了只能寻址 1MB 的原始 8086 分段内存模型。 IIRC,它们还可以支持 286 寻址模式,这是分段内存模型的一种变体。它们支持 386 保护模式,将寄存器扩展到 32 位。到目前为止,它们基本上实现了相同的指令集 (ISA),但具有一些额外的指令前缀和更改指令字大小的默认解释的能力(算术和内存指令可以默认为 16 位或 32 位,然后是前缀将选择非默认含义)。这称为“传统模式”。
64 位扩展(x86-64 或 x64)不完全向后兼容。重新分配了许多单字节指令操作码以表示新的“REX”前缀,该前缀允许指定更宽(64 位)的寄存器并指定更多的寄存器。为了使用这个指令集,处理器以另一种称为“长模式”的模式运行。
现在,当您的 64 位操作系统内核在 64 位模式下运行,并且操作系统上下文切换到用户进程时,它可以同时更改模式。因此,您可以保持在 64 位模式以运行 64 位进程,也可以切换到旧版 32 位模式以运行 32 位进程。当 32 位进程进行操作系统调用时,CPU 会自动切换回 64 位模式以运行内核代码。64 位内核必须专门设计以利用这种模式切换功能。
查看https://en.wikipedia.org/wiki/X86-64#Operating_modes了解更多详情。