请解释和之间x86
的区别?它有点令人困惑,因为大多数时候 32 位程序在 x86 上运行......x32
x64
x86
x32
4 回答
Hans 和 DarkDust 的回答涵盖了 i386/i686 和 amd64/x86_64,因此重新审视它们是没有意义的。这个答案将集中在 X32 上,并提供一些在 X32 移植后学到的信息。
x32 是用于 amd64/x86_64 CPU 的 ABI,使用 32 位整数、长整数和指针。这个想法是将 32 位数据类型的较小内存和缓存占用空间与较大的 x86_64 寄存器集相结合。(参考:Debian X32 端口页面)。
x32 最多可减少约 30% 的内存使用量和最多约 40% 的速度增加。该架构的用例是:
- vserver 托管(内存绑定)
- 上网本/平板电脑(低内存,性能)
- 科学任务(绩效)
x32 是最近添加的。它需要内核支持(3.4 及更高版本)、发行版支持(见下文)、libc 支持(2.11 或更高版本)和 GCC 4.8 及更高版本(改进的地址大小前缀支持)。
对于发行版,它在 Ubuntu 13.04 或 Fedora 17 中可用。内核支持只要求指针在 0x00000000 到 0xffffffff 的范围内。来自System V 应用程序二进制接口,AMD64(使用 LP64 和 ILP32 编程模型),第 10.4 节,p。132(它唯一的句子):
10.4 内核支持
内核应该将系统调用返回的堆栈和地址限制在 0x00000000 到 0xffffffff 之间。
使用支持启动内核时,必须使用syscall.x32=y
选项。构建内核时,您必须包含该CONFIG_X86_X32=y
选项。(参考:Debian X32 端口页面和X32 System V 应用程序二进制接口)。
以下是在 Debian 人员在测试后向我们报告了一些错误后,我通过最近的移植了解到的一些内容:
- 系统很像X86
- 预处理器定义
__x86_64__
(和朋友)和__ILP32__
,但不是__i386__
/__i686__
(和朋友) - 您不能
__ILP32__
单独使用,因为它会在 Clang 和 Sun Studio 下意外显示 - 与堆栈交互时,必须使用 64 位指令
pushq
和popq
- 从 32 位数据类型填充/配置寄存器后,您可以对它们执行 64 位操作,例如
adcq
- 小心出现在高 32 位上的 0 扩展。
如果您正在寻找测试平台,那么您可以使用 Debian 8 或更高版本。他们在Debian X32 Port的 wiki 页面包含所有信息。3 秒游:(1)启动时在内核中启用 X32;(2) 用于debootstrap
安装X32 chroot 环境,(3)chroot debian-x32
进入环境并测试您的软件。
x86 是指 PC 中使用的 Intel 处理器架构。型号是 8088(8086 的 8 位总线版本,用于第一台 IBM PC)、8086、286、386、486。之后他们切换到名称而不是数字以阻止 AMD 复制处理器名称。奔腾等,从来没有Hexium :)。
x64 是支持 64 位代码的 x86 指令集扩展的体系结构名称。由 AMD 发明,后来在英特尔无法让自己的 64 位架构具有竞争力时被英特尔复制,安腾的表现并不好。它的其他名称是 x86_64,AMD 的原始名称,常用于开源工具。还有amd64,AMD的下一个名字,常用在微软工具中。英特尔自己的名称(EM64T 和“英特尔 64”)从未流行起来。
x32 是一个与硬件无关的模糊术语。它往往被用来表示“32 位”或“32 位指针体系结构”,Linux 有一个同名的 ABI。
x86
表示 Intel 80x86 兼容。这曾经包括 8086,一个仅 16 位的处理器。如今,它大致意味着任何具有 32 位 Intel 兼容指令集的 CPU(通常是从 Pentium 开始的任何 CPU)。永远不要阅读x32
被使用。
x64
表示x86
兼容但也具有 64 位模式的 CPU(通常是指 AMD 引入的 64 位指令集;英特尔关于 64 位模式的想法完全愚蠢,幸运的是英特尔承认了这一点,现在使用 AMD 变体)。
所以大多数时候你可以这样简化:x86
在 32 位模式下x64
与 Intel 兼容,在 64 位模式下与 Intel 兼容。
由于 64 位版本是一种x86
架构,因此首先被称为x86-64
,这将是最合适的名称,IMO。此外,x32
是一件事(如前所述)——然而,'x64' 不是它的延续,所以(理论上)误导(即使很多人会知道你在说什么),因此应该只被认为是营销的东西,而不是“官方”架构(同样,IMO——显然,其他人不同意)。