
規則があることは知っていますが、このようにではなく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
私は読むここの後の引数は、、(またはx64の場合は、、、)ですrdx
が、esi
edi
ebp
rsi
rdi
rbp
Wikipedia の呼び出し規約のページ、 しかし整数80hWindows でもこの規則が使用されているようですね?
rax
この慣例的な名前は何ですか。Linuxカーネルソースのどこで定義されていますか?また、を呼び出すときに手順を解決するテーブルはどこにありますかint 0x80
? の場合syscall
、sys_write
rax=1
答え1
あなたの質問は多くのトピックに及んでいますので、私はそれらすべてに答えるように努めます。
SYSENTER
システムコールの呼び出し方法を表す単一の標準的な用語があるかどうかはわかりませんが、システムコールの呼び出し方法(またはではなく割り込み0x80SYSCALL
)についてはさらにわかりません。x86-64では、文書化されたを使用するシステム コール インターフェイスはSYSCALL
、System V x86-64 ABI で説明されていますが、これは参考情報であり、規範的ではありません。同様に、これを「i386 Linux カーネル ABI」(「i386」を、使用しているアーキテクチャに置き換えてください) と呼べば、ほとんどの人が何について話しているのか理解できるでしょうが、「カーネル ABI」には別の意味があり (カーネル モジュールのコンテキストで)、これも割り込み 0x80 に限定されないため、混乱を招く可能性があります。実際には、ほとんどの人は、特に進化する可能性があるため、このレベルの詳細まで気にする必要はありません。
SYSCALL
あなたが言及したように、割り込み 0x80 などだけでなく、独自の微妙な点を導入し、現在 x86 のすべてのシステム コールの推奨エントリ ポイントとなっている vDSO もあります... もちろん、これは特定の呼び出し規約を参照する用語が存在しないことを意味するものではありませんが、それがそれほど役立つかどうかはわかりません。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 が関係し、デバイス ドライバーはほとんどの場合、異なるインターフェイスを使用します)。