我不知道在64位操作系统上如何运行32位应用程序。
我的理解是32位/64位指的是注册大小。指令集应该是不同的,因为它们有不同大小的寄存器。
但是我知道有x86-64指令集,这是x86指令集的64位版本。
发布于 2016-01-16 00:34:46
我们之所以能够在64位操作系统上运行32位应用程序是因为x86-64吗?
大多数情况下都是这样。但让我简单地解释一下,32位/64位并不一定实际上是指寄存器大小,因为问题是你指的是哪个寄存器(类型)?更准确地说,32位/64位指地址总线的宽度(即可以寻址多少内存),或者换句话说,是C中指针的大小,然后32/64位将(间接)引用字大小,也就是机器的基本‘整型’类型的大小。无论如何,32位/64位必须对可寻址内存做更多的工作,但也与字大小( size to (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....etc)。每个分机就像一个迷你指令集。查一下维基百科上的x86指令集,你应该会得到大量的信息。
发布于 2016-01-16 14:06:49
x86处理器有多种模式,支持基本x86指令集的不同变体。它们都支持16位的“真实模式”,该模式实现了原来的8086分段内存模型,该模型只能寻址1MB。IIRC,它们还可以支持286寻址模式,这是分段内存模型的一个变体。它们支持386保护模式,将寄存器扩展到32位。到目前为止,它们基本上实现了相同的指令集(ISA),但是有了一些额外的指令前缀和更改指令字大小默认解释的能力(算术和内存指令可以默认为16位或32位,然后前缀将选择非缺省意义)。这被称为“遗留模式”。
64位扩展(x86-64或x64)并不完全向后兼容.重新分配了多个单字节指令操作码以表示新的"REX“前缀,该前缀允许指定更宽(64位)寄存器,并指定更多寄存器。为了使用这个指令集,处理器以另一种模式运行,称为“长模式”。
现在,当64位操作系统内核以64位模式运行,而OS上下文切换到用户进程时,它可以同时改变模式。因此,您可以保持64位模式来运行64位进程,也可以切换到遗留32位模式来运行32位进程。当32位进程进行操作系统调用时,CPU自动切换回64位模式以运行内核代码--64位内核必须专门设计以利用这种模式切换功能。
有关更多细节,请访问modes。
https://stackoverflow.com/questions/34821260
复制相似问题