x32 ABI

From HandWiki

The x32 ABI is an application binary interface (ABI) and one of the interfaces of the Linux kernel. The x32 ABI provides 32-bit integers, long and pointers (ILP32) on Intel and AMD 64-bit hardware. The ABI allows programs to take advantage of the benefits of x86-64 instruction set (larger number of CPU registers, better floating-point performance, faster position-independent code, shared libraries, function parameters passed via registers, faster syscall instruction) while using 32-bit pointers and thus avoiding the overhead of 64-bit pointers.[1][2][3]

Details

Though the x32 ABI limits the program to a virtual address space of 4 GiB, it also decreases the memory footprint of the program by making pointers smaller. This can allow it to run faster by fitting more code and more data into cache.[1][2][3] The best results during testing were with the 181.mcf SPEC CPU 2000 benchmark, in which the x32 ABI version was 40% faster than the x86-64 version.[3][4] On average, x32 is 5–8% faster on the SPEC CPU integer benchmarks compared to x86-64. There is no speed advantage over x86-64 in the SPEC CPU floating-point benchmarks.[5] There are also some application benchmarks that demonstrate the advantages of the x32 ABI.[6] [7]

ABI comparison
Feature i386 ABI x32 ABI x86-64 ABI
Pointers 4 bytes 8 bytes
Max. memory per process 4 GiB 128 TiB
Integer registers 6 (PIC) 15
FP registers 8 16
64-bit arithmetic No Yes
Floating-point arithmetic x87 SSE
Calling convention Memory Registers
PIC prologue 2–3 instructions None

History

Running a userspace that consists mostly of programs compiled in ILP32 mode and which also have principal access to 64-bit CPU instructions has not been uncommon, especially in the field of "classic RISC" chips. For example, the Solaris operating system does so for both SPARC and x86-64. On the Linux side, Debian also ships an ILP32 userspace. The underlying reason is the somewhat "more expensive" nature of LP64 code,[8] just like it has been shown for x86-64. In that regard, the x32 ABI extends the ILP32-on-64bit concept to the x86-64 platform.

Several people had discussed the benefits of an x86-64 ABI with 32-bit pointers in the years since the Athlon 64's release in 2003, notably Donald Knuth in 2008.[9] There was little publicly visible progress towards implementing such a mode until August 27, 2011, when Hans Peter Anvin announced to the Linux kernel mailing list that he and H. J. Lu had been working on the x32 ABI.[10]

That same day, Linus Torvalds replied with a concern that the use of 32-bit time values in the x32 ABI could cause problems in the future.[11][12] This is because the use of 32-bit time values would cause the time values to overflow in the year 2038.[11][12] Following this request, the developers of the x32 ABI changed the time values to 64-bit.[13]

A presentation at the Linux Plumbers Conference on September 7, 2011, covered the x32 ABI.[2]

The x32 ABI was merged into the Linux kernel for the 3.4 release with support being added to the GNU C Library in version 2.16.[14]

In December 2018 there was discussion as to whether to deprecate the x32 ABI, which has not happened as of April 2023.[15]

Adoption

Linux distribution More information
Debian X32 Port
Gentoo Multilib via abi_x86_x32 use-flags
Yocto Project X32 ABI
T2 SDE x86-64

References

  1. 1.0 1.1 Thorsten Leemhuis (2011-09-13). "Kernel Log: x32 ABI gets around 64-bit drawbacks". www.h-online.com. http://www.h-online.com/open/features/Kernel-Log-x32-ABI-gets-around-64-bit-drawbacks-1342061.html. 
  2. 2.0 2.1 2.2 "x32 - a native 32-bit ABI for x86-64". linuxplumbersconf.org. http://linuxplumbersconf.org/2011/ocw/sessions/531. 
  3. 3.0 3.1 3.2 "x32-abi". Google Sites. http://sites.google.com/site/x32abi/. 
  4. "181.mcf SPEC CPU2000 Benchmark Description File". Standard Performance Evaluation Corporation. 1999-10-14. http://www.spec.org/cpu2000/CINT2000/181.mcf/docs/181.mcf.html. 
  5. H. J. Lu; H. Peter Anvin; Milind Girkar (September 2011). "X32 - A Native 32bit ABI For X86-64". http://www.linuxplumbersconf.net/2011/ocw//system/presentations/531/original/x32-LPC-2011-0906.pptx. 
  6. Rauschmayr, Nathalie; Streit, Achim (2013). "Evaluation of x32-ABI in the Context of LHC Applications". Procedia Computer Science 18: 2233–2240. doi:10.1016/j.procs.2013.05.394. https://doi.org/10.1016/j.procs.2013.05.394. 
  7. "Applications that Profit from the Underrated x32-ABI". https://www.sempria.de/hop/x32-ABI. Retrieved 22 May 2023. 
  8. Tony Bourke (2004-01-22). "Are 64-bit Binaries Really Slower than 32-bit Binaries?". http://www.osnews.com/story/5768/Are_64-bit_Binaries_Really_Slower_than_32-bit_Binaries_. 
  9. Donald Knuth (February 2008). "Recent News: A Flame About 64-bit Pointers". https://web.archive.org/web/20081104104512/http://www-cs-faculty.stanford.edu:80/~knuth/news08.html. 
  10. H. Peter Anvin (27 August 2011). "RFD: x32 ABI system call numbers". https://lkml.org/lkml/2011/8/26/415. 
  11. 11.0 11.1 Jonathan Corbet (2011-08-29). "The x32 system call ABI". LWN.net. https://lwn.net/Articles/456731/. 
  12. 12.0 12.1 Linus Torvalds (2011-08-26). "Re: RFD: x32 ABI system call numbers". LWN.net. https://lwn.net/Articles/456750/. 
  13. Lu, H. J. (2011-11-24). "X32 project status update". libc-alpha (Mailing list). Retrieved 2019-10-17.
  14. O'Donell, Carlos (30 June 2012). "The GNU C Library version 2.16 is now available". libc-alpha (Mailing list). Retrieved 27 December 2016.
  15. "Can we drop upstream Linux x32 support?". https://lkml.org/lkml/2018/12/10/1145. 

External links