「int 0x80」の背後にある呼び出し規則は何ですか?

「int 0x80」の背後にある呼び出し規則は何ですか?

ルールがあることはわかりますが、このように代わりに呼び出すときにsyscall前に出てくる呼び出しルールを何と呼びますか?int 80syscall

mov  rax,4     ; system call number (sys_write)
mov  rbx,1     ; file descriptor (stdout)
mov  rcx,hello ; message to write
mov  rdx,12    ; message length
int  0x80      ; call kernel

私は読んだここ後の引数rdxesi、、、(またはx64の場合、、、 )ediであり、これに関する文書はありません。ebprsirdirbpWikipediaの呼び出しルールページ、しかし整数80時間Windowsもこのルールを使用していることを示すようです。

この契約の名前は何ですか? Linuxカーネルのソースコードでその定義をどこで見ることができますか?そして、rax呼び出し時に解析手順のテーブルはどこにありますかint 0x80syscallについてはsys_writeはいrax=1

答え1

あなたの質問は多くのトピックをカバーしており、すべてのトピックに対処するよう努めます。

  1. SYSENTERシステムコールを呼び出す特定の方法(または代わりに割り込み0x80)はもちろん、システムコールの呼び出し方法に関する単一の標準用語があるかどうかはわかりませんSYSCALL。 x86-64ではファイルに書き込む使用されるシステムコールインターフェイスはSystem V x86-64 ABIに記載されていますが、SYSCALLこれは標準ではなく情報提供用です。同様に、「i386 LinuxカーネルABI」(「i386」をあなたが言うアーキテクチャに置き換える)と呼ぶと、ほとんどの人が何を言っているのか理解するでしょうが、「カーネルABI」のために混乱する可能性があります。 (カーネルモジュールの文脈では)別の意味を持ち、これは割り込み0x80に限定されません。

    実際、ほとんどの人はとにかくこの詳細レベルに興味を持ってはいけません。特に割り込み0x80SYSCALLなどが進化できるからです。そして、vDSOは独自の微妙さを導入し、x86のすべてのシステムコールに対して好ましいエントリポイントです。今…もちろん、特定の呼び出し規則を指す用語があるわけではないという意味ではありませんが、それがそれほど役に立つかどうかはわかりません。

  2. Windowsはシステムコールインターフェイス0x2Eによる割り込みの使用もサポートしていますが、「呼び出しルール」は次のとおりです。とても違う:パラメータがスタックにプッシュされ、要求されたシステムコールがEAXによって提供され、EBXはスタックのパラメータを指します。

  3. 現在、x86カーネルはシステムコールインターフェースを定義しています。arch/x86/entry:entry_32.Si386インターフェイスが含まれています。entry_64.Sx86-32およびx86-64インターフェース、entry_64_compat.S32ビットx86-64インターフェース(逆互換用)syscalls/syscall_32.tbli386システムコールテーブル、syscalls/syscall_64.tblx86-32 および x86-64 システムコールテーブル。

    このファイルのコメントは、インタフェース、特にパラメータの渡し方を文書化します。 32ビットコールの場合、EAXにはシステムコール番号が含まれており、そのパラメータはEBX、ECX、EDX、ESI、EDI、およびEBPにあります(パラメータ自体はパラメータSYSENTER0x80へのユーザスタックへのポインタ)、64ビットコールの場合、RAXには、パラメータがRDI、RSI、RDX、R10、R8、およびR9にあるシステムコール番号が含まれています。システムコールの登録と順序がIntel 32ビットから64ビットに変更されたのはなぜですか?)。図と一緒に良い要約があります。calling.h

参考までに、履歴比較では、通常、次のようなMS-DOS呼び出しインターフェイスを参照します。割り込み0x21;また、多重化された割り込みも含みます。0x2F、これ拡張可能なメカニズムシステムサービスを追加するために使用されます(通常はTSRに関連し、デバイスドライバはほとんど異なるインターフェイスを使用します)。

関連情報