x86,x32和x64架构之间的区别?

get*_*ish 49 architecture 64-bit intel

请解释一下之间的区别x86,x32x64?它有点令人困惑x86,x32因为大多数时候32位程序在x86上运行...

jww*_*jww 29

Hans和DarkDust的回答涵盖了i386/i686和amd64/x86_64,所以重新审视它们是没有意义的.这个答案将集中在X32上,并提供一些X32端口后学到的信息.

x32是使用32位整数,长整数和指针的amd64/x86_64 CPU的ABI.我们的想法是将32位数据类型的较小内存和缓存占用与较大的x86_64寄存器组合.(参考:Debian X32端口页面).

x32可以提供高达约30%的内存使用量减少和高达约40%的速度提升.该体系结构的用例是:

  • 虚拟服务器托管(内存绑定)
  • 上网本/平板电脑(低内存,性能)
  • 科学任务(表现)

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位指令pushqpopq
  • 一旦从32位数据类型填充/配置了寄存器,就可以对它们执行64位操作,例如 adcq
  • 注意在高32位上发生的0扩展.

如果您正在寻找测试平台,那么您可以使用Debian 8或更高版本.他们在Debian X32 Port上的维基页面提供了所有信息.3秒的游览:(1)启动时在内核中启用X32; (2)用于debootstrap安装X32 chroot环境,以及(3)chroot debian-x32进入环境并测试您的软件.

  • “一旦从32位数据类型填充/配置了寄存器,就可以对它们执行64位操作,例如`adcq`”。好的,但这与x86-64完全相同。速度提高主要是针对具有大量指针数据结构的代码。只有某些类型的HPC就是这样。其他科学计算任务需要巨型阵列上的大量内存和大量FP,而x32几乎没有什么区别。代码大小可能比x8​​6-64相似或更差,因为它倾向于需要地址大小前缀。尽管指针操作有时可以避免使用REX前缀。 (2认同)

Han*_*ant 28

x86指的是PC中使用的英特尔处理器架构.型号为8088(8086的8位总线版本,用于第一台IBM PC),8086,286,386,486.之后,他们切换到名称而不是数字,以阻止AMD复制处理器名称.Pentium等,从不是Hexium :).

x64是启用64位代码的x86指令集扩展的体系结构名称.由AMD发明,后来由英特尔抄袭,当他们无法让自己的64位拱门具有竞争力时,Itanium的表现并不好.其他名称是x86_64,AMD的原始名称,常用于开源工具.而amd64,AMD的下一个名字,常用于微软工具.英特尔自己的名字(EM64T和"Intel 64")从未流行过.

x32是一个与硬件无关的模糊术语.它倾向于用于表示"32位"或"32位指针架构",Linux具有该名称的ABI.

  • 你看起来不太对劲.x32确实意味着什么:https://lwn.net/Articles/456731/ (14认同)
  • * 8 位版本的 8086* 有点误导。8088 是 16 位处理器,这意味着它的寄存器是 16 位宽。但是,外部数据总线只有 8 位宽。 (3认同)
  • 8086是16位内部和外部数据总线,8088是16位内部数据总线和8位外部数据总线 (2认同)

Dar*_*ust 8

x86表示Intel 80x86兼容.这曾经包括8086,一个只有16位的处理器.现在它大致意味着任何具有32位Intel兼容指令集的CPU(通常是Pentium以后的任何指令).从不读取x32被使用.

x64是指x86兼容但也具有64位模式的CPU (最常见的是AMD引入的64位指令集;英特尔对64位模式的想法完全是愚蠢的,幸运的是英特尔承认现在是使用AMD的变种).

因此,大多数情况下您可以通过这种方式进行简化:x86英特尔在32位模式下x64兼容,在64位模式下是英特尔兼容.

  • 我认为添加x64也称为x86-64和AMD64是有用的. (7认同)
  • "x64"仅用于Windows世界.在Linux术语中,i386是32位ISA,amd64是64位ISA,也称为x86-64.x86是超集,因此x86-32(i386)和x86-64(amd64)是x86的两种风格.x32不应该用作32位x86的同义词,因为该术语指的是特定且非常不同的内容(请参阅其他答案/注释). (3认同)