この質問に触発されて
GDB を強制的に逆アセンブルするにはどうすればよいですか?
そしてこれに関連する
Linuxで実際にシステムコールはどのように発生しますか? 実際のカーネルルーチンが呼び出されるまで、呼び出しが実行されるとどうなりますか?
この質問に触発されて
GDB を強制的に逆アセンブルするにはどうすればよいですか?
そしてこれに関連する
Linuxで実際にシステムコールはどのように発生しますか? 実際のカーネルルーチンが呼び出されるまで、呼び出しが実行されるとどうなりますか?
x86 について話していると仮定します。
INT 0x80
割り込みが発生します。私はこれに少し錆びているかもしれません、それは数年です...
与えられた答えは正しいですが、カーネルモードに入るメカニズムが他にもあることを追加したいと思います。最近のすべてのカーネルは、すべてのプロセスのアドレス空間に「vsyscall」ページをマップします。これには、最も効率的なシステムコール トラップ メソッドが含まれています。
たとえば、通常の 32 ビット システムでは、以下を含めることができます。
0xffffe000: int $0x80
0xffffe002: ret
しかし、私の64ビットシステムでは、syscall/sysenter命令を使用してより効率的な方法にアクセスできます
0xffffe000: push %ecx
0xffffe001: push %edx
0xffffe002: push %ebp
0xffffe003: mov %esp,%ebp
0xffffe005: sysenter
0xffffe007: nop
0xffffe008: nop
0xffffe009: nop
0xffffe00a: nop
0xffffe00b: nop
0xffffe00c: nop
0xffffe00d: nop
0xffffe00e: jmp 0xffffe003
0xffffe010: pop %ebp
0xffffe011: pop %edx
0xffffe012: pop %ecx
0xffffe013: ret
この vsyscall ページには、コンテキスト スイッチなしで実行できるいくつかのシステム コールもマップされています。特定のgettimeofday、time、およびgetcpuがそこにマッピングされていることは知っていますが、 getpidもそこに収まると思います。
これは、Linuxのシステムコールはどのように実装されていますか?ですでに回答されています。
「syscall」という用語の使用法が異なるため、おそらくこの質問とは一致しませんでした。
基本的には非常に単純です。メモリのどこかに、各システムコール番号と対応するハンドラのアドレスが格納されているテーブルがあります ( http://lxr.linux.no/linux+v2.6.30/arch/x86/kernel/syscall_table_32を参照)。 .S (x86 バージョンの場合)
次に、INT 0x80 割り込みハンドラーは、レジスターから引数を取得し、それらを (カーネル) スタックに置き、適切な syscall ハンドラーを呼び出します。