web-dev-qa-db-ja.com

Linuxシステムのコール番号がx86とx86_64で異なるのはなぜですか?

システムコールインターフェイスが低レベルで実装されているため、「汎用」コードではなく、アーキテクチャ/プラットフォームに依存していることを知っています。

しかし、Linux 32ビットx86カーネルのシステムコールに、同様のアーキテクチャであるLinux 64ビットx86_64で同じ番号が保持されない理由が明確にわかりませんか?この決定の動機/理由は何ですか?

私の最初の推測では、背景の理由は、32ビットアプリケーションをx86_64システムで実行可能に保つためであり、システムコール番号への適切なオフセットを介して、システムはユーザー空間が32ビットまたは64ビットであることを認識します。それぞれ。ただし、これは当てはまりません。少なくとも私には、read()がx86_64のシステムコール番号0であることは、この考えに合わせることができないようです。

別の推測では、システムコール番号を変更するとセキュリティ/強化の背景が生じる可能性があり、私自身は確認できませんでした。

アーキテクチャに依存するコード部分の実装の課題を知らないので、私はシステムコール番号の変更方法が必要ないように思えるとき(16ビットレジスタでも大部分より多くを格納するため)現在、すべての呼び出しを表す〜346の数値)、互換性を損なう以外の何かを実現するのに役立ちます(ライブラリー、libcを介してシステムコールを使用すると軽減されます)。

35

他のどのアーキテクチャとも一致しない特定の番号付けの背後にある理由について[実際にはx86_64アーキテクチャの一部である「x32」を除く]:Linuxカーネルでのx86_64サポートのごく初期の頃は、深刻な下位互換性の制約により、すべてのシステムコールの番号が変更されました キャッシュラインの使用レベルで最適化するため

これらの選択の具体的な根拠を知るのに十分なカーネル開発については知りませんが、これらのすべてで番号を付け直す選択の背後にsomeロジックがあるようです既存のアーキテクチャからリストを単にコピーして未使用のものを削除するのではなく、特定の番号。順序は、それらが呼び出される頻度に基づいている可能性があります。読み取り/書き込み/開く/閉じるが前にあります。終了とフォークは「基本的な」ように見えるかもしれませんが、プロセスごとに1回だけ呼び出されます。

同じキャッシュライン内で一緒に一般的に使用されるシステムコールを維持することについて何かが起こっている可能性もあります(これらの値は単なる整数ですが、カーネルのテーブルにはそれぞれに関数ポインターがあり、8つのシステムコールの各グループが占有します。そのテーブルの64バイトのキャッシュ行)

34
Random832

「AMD64 Linuxではシステムコール番号が異なるのはなぜですか?」という質問の その回答 を参照してください。スタックオーバーフロー。

要約すると、互換性のために、システムコールリストは安定していて、大きくなるだけです。 x86 64アーキテクチャが登場したとき、ABI(引数の受け渡し、戻り値)が異なっていたため、カーネル開発者は待望の変更をもたらす機会を得ました。

15
xhienne