x32 ABI

x32 ABIはアプリケーションバイナリインターフェース(ABI)であり、 Linuxカーネルのインターフェースの一つです。x32 ABIは、IntelおよびAMDの64ビットハードウェア上で32ビット整数、long、ポインタ(ILP32 )を提供します。このABIにより、プログラムはx86-64命令セットの利点( CPUレジスタ数の増加、浮動小数点演算性能の向上、位置独立コードの高速化、共有ライブラリ、レジスタ経由の関数パラメータの受け渡し、システムコール命令の高速化)を活用しながら、32ビットポインタを使用することで64ビットポインタのオーバーヘッドを回避できます。[ 1 ] [ 2 ] [ 3 ]

詳細

x32 ABI はプログラムを4 GiB の仮想アドレス空間に制限しますが、ポインタを小さくすることでプログラムのメモリフットプリントも削減します。これにより、キャッシュに多くのコードデータを収めることができ、実行速度を向上させることができます。[ 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 ]また、x32 ABI の利点を示すアプリケーション ベンチマークもいくつかあります。[ 6 ] [ 7 ]

ABI比較
特徴 i386 ABI x32 ABI x86-64 ABI
ポインタ4バイト 8バイト
プロセスあたりの最大メモリ4ギガバイト 128 TiB
整数レジスタ6 (写真) 15
FPレジスタ8 16
64ビット演算 いいえ はい
浮動小数点演算 x87南南東
呼び出し規約メモリレジスター
PICプロローグ 2~3の指示 なし

歴史

ILP32モードでコンパイルされたプログラムが大部分を占め、64ビットCPU命令への主要なアクセスも持つユーザー空間を実行することは、特に「古典的なRISC」チップの分野では珍しいことではありません。例えば、SolarisオペレーティングシステムはSPARCとx86-64の両方でこれを実現しています。Linuxでは、DebianもILP32ユーザー空間を提供しています。その根本的な理由は、 LP64コードがx86-64の場合と同様に、やや「高価」であることです[ 8 ]。この点において、x32 ABIはILP32-on-64ビットの概念をx86-64プラットフォームに拡張しています。

2003年にAthlon 64が発売されて以来、多くの人が32ビットポインターを備えたx86-64 ABIの利点について議論してきましたが、特に2008年にはDonald Knuthが議論しました。 [ 9 ] 2011年8月27日にHans Peter AnvinがLinuxカーネルのメーリングリストでHJ Luと共にx32 ABIに取り組んでいることを発表しましたが、その時まで、このようなモードの実装に向けた目立った進展はほとんどありませんでした。[ 10 ]

同日、リーナス・トーバルズは、 x32 ABIで32ビットの時間値を使用すると将来的に問題が発生する可能性があるという懸念を表明した。[ 11 ] [ 12 ]これは、32ビットの時間値を使用すると、2038年に時間値がオーバーフローする可能性があるためである。[ 11 ] [ 12 ]この要請を受けて、x32 ABIの開発者は時間値を64ビットに変更した。[ 13 ]

2011年9月7日に開催されたLinux Plumbers Conferenceでのプレゼンテーションでは、x32 ABIについて説明されました。[ 2 ]

x32 ABIはLinuxカーネル3.4リリースに統合され、GNU Cライブラリバージョン2.16でサポートが追加された。[ 14 ]

2018年12月にはx32 ABIを廃止するかどうかの議論がありましたが、2023年4月時点で廃止は行われておらず、[ 15 ] 2024年5月には新たな展開が見られました。[ 16 ]

採択

Linuxディストリビューション詳細情報
デビアンX32 ポート
ジェンツーabi_x86_x32use-flags によるマルチライブラリ
ヨクトプロジェクトX32 ABI
T2 SDEx86-64 2021年10月22日アーカイブWayback Machine

参考文献

  1. ^ a b Thorsten Leemhuis (2011年9月13日). 「Kernel Log: x32 ABIは64ビットの欠点を回避」 . www.h-online.com. 2011年10月28日時点のオリジナルよりアーカイブ。 2011年11月1日閲覧
  2. ^ a b c「x32 - x86-64用のネイティブ32ビットABI」 . linuxplumbersconf.org . 2012年6月12日閲覧
  3. ^ a b c "x32-abi" . Google Sites . 2011年11月1日閲覧。
  4. ^ 「181.mcf SPEC CPU2000ベンチマーク記述ファイル」 Standard Performance Evaluation Corporation. 1999年10月14日. 2011年11月1日閲覧
  5. ^ HJ Lu; H. ピーター・アンビン;ミリンド・ギルカール (2011 年 9 月)。「X32 - X86-64 のネイティブ 32 ビット ABI」
  6. ^ Rauschmayr, Nathalie; Streit, Achim (2013). 「LHCアプリケーションにおけるx32-ABIの評価」 . Procedia Computer Science . 18 : 2233–2240 . doi : 10.1016/j.procs.2013.05.394 .
  7. ^ 「過小評価されているx32-ABIを活用するアプリケーション」 www.sempria.de 20235月22日閲覧
  8. ^ Tony Bourke (2004年1月22日). 「64ビットバイナリは本当に32ビットバイナリより遅いのか?」2014年3月25日閲覧
  9. ^ Donald Knuth (2008年2月). 「最近のニュース: 64ビットポインタに関する炎上」 . 2008年11月4日時点のオリジナルよりアーカイブ2012年5月15日閲覧。
  10. ^ H. Peter Anvin (2011年8月27日). 「RFD: x32 ABI システムコール番号」 . 2012年5月15日閲覧
  11. ^ a b Jonathan Corbet (2011年8月29日). 「x32 システムコール ABI」 . LWN.net . 2011年11月1日閲覧。
  12. ^ a b Linus Torvalds (2011年8月26日). 「Re: RFD: x32 ABI システムコール番号」 . LWN.net . 2016年2月26日閲覧。
  13. ^ Lu, HJ (2011-11-24). 「X32 プロジェクトのステータスアップデート」 . libc-alpha (メーリングリスト) . 2019年10月17日閲覧。
  14. ^ O'Donell, Carlos (2012年6月30日). 「GNU Cライブラリバージョン2.16が利用可能になりました」 . libc-alpha (メーリングリスト) . 2016年12月27日閲覧
  15. ^ 「アップストリームLinux x32サポートを廃止することは可能か?」 LKML . 2019年3月13日閲覧
  16. ^ 「6.10マージウィンドウの前半」 LWN 20245月17日閲覧