3

Linux (RedHat Enterprise 8) で syscall を実装しようとしていますが、その動作について少し混乱しています。私が理解していることから、syscall番号をeaxに、パラメーターをebx、ecx、edxなどに配置するラッパーをユーザーモードで実装し、適切なsyscallを呼び出すint 0x80を呼び出します。私の質問は、syscall は通常の C 関数のように記述されているため、どのレジスタにどのパラメータが含まれているかをどのように知るのでしょうか? それは慣例ですか、それともメカニズムはありますか? もしそうなら、どこでどのようにそれを行いますか?

編集: これは宿題です。私は、これを実行できるシステムコール マクロがあることを知っています。

4

1 に答える 1

4

Linux Journalの記事から、2 ページの下部

システム コール インターフェイスは排他的にレジスタ パラメータ化されるため、1 つのシステム コールで最大 6 つのパラメータを使用できます。%eax はシステムコール番号です。%ebx、%ecx、%edx、%esi、%edi、および %ebp は、param0-5 として使用される 6 つの汎用レジスタです。%esp は、カーネルがリング 0 (つまり、カーネル モード) に入るときにカーネルによって上書きされるため、使用できません。

あなたの c コードはシステム コールを行っているように見えるかもしれませんが、実際には libc の関数を呼び出しています。その関数は、すべての引数が正しいレジスタにあることを確認してから、割り込みを行います。

于 2010-03-22T21:51:43.550 に答える