x32 ABI
x32 ABI(英語:)是一种ABI及Linux内核接口之一。它允许程序得到x86-64的优点(较大的CPU寄存器号码,更佳的浮点性能,更快的地址无关代码共享库,通过寄存器传递函数参数,更快的系统调用指令),而使用32位指针,从而避免了对64位指针的开销。[1][2][3]
细节
尽管x32 ABI限制了程序的虚拟地址为4 GB,它也减小了程序的内存占用量,且在某些情况下,能使它运行得更快[1][2][3]。在181.mcf SPEC CPU 2000基准测试中,x32 ABI版本比x86-64版本最多能快40%[3][4]。一般而言,x32在SPEC CPU整数基准比x86-64快5-8%。在SPEC CPU浮点基准上,x86-64则毫无速度优势[5]。
特性 | i386 | x32 | x86-64 |
---|---|---|---|
进程最大内存 | 4 GiB | 128 TiB | |
整数寄存器 | 6 (PIC) | 16 | |
浮点寄存器 | 8 | 16 | |
指针 | 4位 | 8位 | |
64位元运算 | 否 | 是 | |
浮点数 | x87 | SSE | |
调用约定 | 内存 | 寄存器 | |
PIC序言 | 2-3 insn | 无 |
历史
大多数情况下执行以ILP32模式编译的程序,但又能使用主要的64位CPU指令,这样的用户空间并非少见,特别是在“经典RISC”芯片领域中。例如,Solaris操作系统在SPARC和x86-64上就是这么做的。而对于Linux,SPARC和PowerPC上的Linux发行版,如Aurora SPARC Linux和Debian,也有ILP32用户空间。根本原因是LP64代码“更贵”[6],正如上文x86-64所述。就这方面而言,x32是“64位ILP32”概念在x86-64平台的延伸。
自从2003年Athlon 64发布以来,一些人就在讨论32位指针x86-64 ABI的好处,特别是2008年高德纳的研究[7]。然而,在实现这种模式上,外界并没有看到有显著进展,直至2011年8月27日,汉斯·彼得·昂万在Linux内核邮件列表上宣布,他和H·J·鲁一直在x32-ABI上努力[8]。
就在同一天,林纳斯·托瓦兹回应道,在x32 ABI中使用32位时间值,将来可能会导致问题[9][10]。这是因为,使用32位时间值,将导致时间值在2038年溢出[9][10]。根据这一要求,x32 ABI的开发者将时间值变为了64位[11]。
2011年9月7日一个Linux Plumbers Conference上的演讲提及了x32 ABI[2]。
x32 ABI于Linux 3.4起合并入内核,GNU C 函式庫 2.16中添加了相应支持。
参考
- Thorsten Leemhuis. . www.h-online.com. 2011-09-13 [2011-11-01]. (原始内容存档于2011-10-28).
- . linuxplumbersconf.org. [2012-06-12]. (原始内容存档于2012-05-05).
- . Google Sites. [2011-11-01]. (原始内容存档于2011-10-30).
- . Standard Performance Evaluation Corporation. 1999-10-14 [2011-11-01]. (原始内容存档于2018-09-08).
- H.J. Lu, H Peter Anvin, Milind Girkar. . September 2011 [2015-02-16]. (原始内容存档于2017-03-11).
- Tony Bourke. . 2004-01-22 [2014-03-25]. (原始内容存档于2018-04-16).
- Donald Knuth. . February 2008 [15 May 2012]. (原始内容存档于2012-09-26).
- H. Peter Anvin. . 27 August 2011 [15 May 2012]. (原始内容存档于2012-09-26).
- Jonathan Corbet. . LWN.net. 2011-08-29 [2011-11-01]. (原始内容存档于2022-05-07).
- Linus Torvalds. . LWN.net. 2011-08-26 [2011-11-01]. (原始内容存档于2017-12-01).
- H.J. Lu. . 2011-11-24 [2015-02-16]. (原始内容存档于2015-09-24).