ルールがあることはわかりますが、このように代わりに呼び出すときにsyscall
前に出てくる呼び出しルールを何と呼びますか?int 80
syscall
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
私は読んだここ後の引数rdx
はesi
、、、(またはx64の場合、、、 )edi
であり、これに関する文書はありません。ebp
rsi
rdi
rbp
Wikipediaの呼び出しルールページ、しかし整数80時間Windowsもこのルールを使用していることを示すようです。
この契約の名前は何ですか? Linuxカーネルのソースコードでその定義をどこで見ることができますか?そして、rax
呼び出し時に解析手順のテーブルはどこにありますかint 0x80
?syscall
についてはsys_write
はいrax=1
答え1
あなたの質問は多くのトピックをカバーしており、すべてのトピックに対処するよう努めます。
SYSENTER
システムコールを呼び出す特定の方法(または代わりに割り込み0x80)はもちろん、システムコールの呼び出し方法に関する単一の標準用語があるかどうかはわかりませんSYSCALL
。 x86-64ではファイルに書き込む使用されるシステムコールインターフェイスはSystem V x86-64 ABIに記載されていますが、SYSCALL
これは標準ではなく情報提供用です。同様に、「i386 LinuxカーネルABI」(「i386」をあなたが言うアーキテクチャに置き換える)と呼ぶと、ほとんどの人が何を言っているのか理解するでしょうが、「カーネルABI」のために混乱する可能性があります。 (カーネルモジュールの文脈では)別の意味を持ち、これは割り込み0x80に限定されません。実際、ほとんどの人はとにかくこの詳細レベルに興味を持ってはいけません。特に割り込み0x80
SYSCALL
などが進化できるからです。そして、vDSOは独自の微妙さを導入し、x86のすべてのシステムコールに対して好ましいエントリポイントです。今…もちろん、特定の呼び出し規則を指す用語があるわけではないという意味ではありませんが、それがそれほど役に立つかどうかはわかりません。Windowsはシステムコールインターフェイス0x2Eによる割り込みの使用もサポートしていますが、「呼び出しルール」は次のとおりです。とても違う:パラメータがスタックにプッシュされ、要求されたシステムコールがEAXによって提供され、EBXはスタックのパラメータを指します。
現在、x86カーネルはシステムコールインターフェースを定義しています。
arch/x86/entry
:entry_32.S
i386インターフェイスが含まれています。entry_64.S
x86-32およびx86-64インターフェース、entry_64_compat.S
32ビットx86-64インターフェース(逆互換用)syscalls/syscall_32.tbl
i386システムコールテーブル、syscalls/syscall_64.tbl
x86-32 および x86-64 システムコールテーブル。このファイルのコメントは、インタフェース、特にパラメータの渡し方を文書化します。 32ビットコールの場合、EAXにはシステムコール番号が含まれており、そのパラメータはEBX、ECX、EDX、ESI、EDI、およびEBPにあります(パラメータ自体はパラメータ
SYSENTER
0x80へのユーザスタックへのポインタ)、64ビットコールの場合、RAXには、パラメータがRDI、RSI、RDX、R10、R8、およびR9にあるシステムコール番号が含まれています。システムコールの登録と順序がIntel 32ビットから64ビットに変更されたのはなぜですか?)。図と一緒に良い要約があります。calling.h
。
参考までに、履歴比較では、通常、次のようなMS-DOS呼び出しインターフェイスを参照します。割り込み0x21;また、多重化された割り込みも含みます。0x2F、これ拡張可能なメカニズムシステムサービスを追加するために使用されます(通常はTSRに関連し、デバイスドライバはほとんど異なるインターフェイスを使用します)。