View text source at Wikipedia
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]
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]
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 |
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] Neither it has happened as of May 2024, and even more, it got some new development.[16]
Linux distribution | More information |
---|---|
Debian | X32 Port |
Gentoo | Multilib via abi_x86_x32 use-flags
|
Yocto Project | X32 ABI |
T2 SDE | x86-64 |