9

この質問に触発されて

GDB を強制的に逆アセンブルするにはどうすればよいですか?

そしてこれに関連する

INT21hとは?

Linuxで実際にシステムコールはどのように発生しますか? 実際のカーネルルーチンが呼び出されるまで、呼び出しが実行されるとどうなりますか?

4

4 に答える 4

8

x86 について話していると仮定します。

  1. システム コールのID がEAX レジスタに格納される
  2. システム コールが必要とするすべての引数は、システム コールによって指定された場所に配置されます。たとえば、一部のシステム コールは、引数が EBX レジスタに存在することを想定しています。他の人は、自分の議論がスタックの一番上にあることを期待するかもしれません.
  3. INT 0x80割り込みが発生します。
  4. Linux カーネルは、EAX レジスタ内の ID によって識別されるシステム コールを処理し、すべての結果を所定の場所に保存します。
  5. 呼び出しコードはすべての結果を利用します。

私はこれに少し錆びているかもしれません、それは数年です...

于 2009-08-07T17:05:36.987 に答える
7

与えられた答えは正しいですが、カーネルモードに入るメカニズムが他にもあることを追加したいと思います。最近のすべてのカーネルは、すべてのプロセスのアドレス空間に「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 ページには、コンテキスト スイッチなしで実行できるいくつかのシステム コールもマップされています。特定のgettimeofdaytime、およびgetcpuがそこにマッピングされていることは知っていますが、 getpidもそこに収まると思います。

于 2009-08-09T23:27:37.873 に答える
4


これは、Linuxのシステムコールはどのように実装されていますか?ですでに回答されています。
「syscall」という用語の使用法が異なるため、おそらくこの質問とは一致しませんでした。

于 2009-08-07T17:20:10.297 に答える
3

基本的には非常に単純です。メモリのどこかに、各システムコール番号と対応するハンドラのアドレスが格納されているテーブルがあります ( http://lxr.linux.no/linux+v2.6.30/arch/x86/kernel/syscall_table_32を参照)。 .S (x86 バージョンの場合)

次に、INT 0x80 割り込みハンドラーは、レジスターから引数を取得し、それらを (カーネル) スタックに置き、適切な syscall ハンドラーを呼び出します。

于 2009-08-07T17:12:28.067 に答える