x86和x64共享指令集?

时间:2016-01-15 22:56:46

标签: architecture 64-bit cpu 32-bit cpu-architecture

我不知道32位应用程序如何在64位操作系统上运行。

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

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

  1. 我们可以在64位操作系统上运行32位应用程序是因为x86-64吗?

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

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

2 个答案:

答案 0 :(得分:2)

  

我们可以在64位操作系统上运行32位应用程序是因为   x86-64?

大部分都是的。但让我简单解释一下,32bit / 64bit实际上并不一定是指寄存器大小,因为问题是你在说哪个寄存器(类型)?更准确地说,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位应用程序。

  

除x86-64外,x64指令集是否还有其他指令集?   有人告诉我x64只是为了扩展内存范围而已   他们的指令集完全相同。这是对的吗?

首先,Intel64,AMD64,x86-64,x64几乎(或多或少)指的是同一件事! 是的,x86-64指令集是巨大的,并定期接收扩展(想想MMX,SSE,AVX ......等)。每个扩展都像一个迷你指令集。在维基百科上查找x86指令集,您应该获得大量信息。

答案 1 :(得分:0)

x86处理器具有多种模式,支持基本x86指令集的不同变体。它们都支持16位“实模式”,它实现了原始的8086分段内存模型,只能达到1MB。 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了解详情。