13

gettimeofdayこのページによると、x86-86 の syscall です(gettimeofdayボックス内を検索するだけです)。

int gettimeofday(struct timeval *tv, struct timezone *tz);

2 つのポインターを準備して関連する を呼び出すだけで、逆アセンブリは十分に簡単だと思いましたsyscallが、その逆アセンブリはさらに多くのことを行っています。

(gdb) disas gettimeofday
Dump of assembler code for function gettimeofday:
0x00000034f408c2d0 <gettimeofday+0>: sub    $0x8,%rsp
0x00000034f408c2d4 <gettimeofday+4>: mov    $0xffffffffff600000,%rax
0x00000034f408c2db <gettimeofday+11>: callq  *%rax
0x00000034f408c2dd <gettimeofday+13>: cmp    $0xfffff001,%eax
0x00000034f408c2e2 <gettimeofday+18>: jae    0x34f408c2e9 <gettimeofday+25>
0x00000034f408c2e4 <gettimeofday+20>: add    $0x8,%rsp
0x00000034f408c2e8 <gettimeofday+24>: retq   
0x00000034f408c2e9 <gettimeofday+25>: mov    0x2c4cb8(%rip),%rcx        # 0x34f4350fa8 <free+3356736>
0x00000034f408c2f0 <gettimeofday+32>: xor    %edx,%edx
0x00000034f408c2f2 <gettimeofday+34>: sub    %rax,%rdx
0x00000034f408c2f5 <gettimeofday+37>: mov    %edx,%fs:(%rcx)
0x00000034f408c2f8 <gettimeofday+40>: or     $0xffffffffffffffff,%rax
0x00000034f408c2fc <gettimeofday+44>: jmp    0x34f408c2e4 <gettimeofday+20>
End of assembler dump. 

そして、私はまったく見えませんsyscall

誰がそれがどのように機能するか説明できますか?

4

2 に答える 2

15

gettimeofday()vsyscallLinux では、および/またはと呼ばれるものvdsoです。したがって、次の 2 行が表示されます。

0x00000034f408c2d4 : mov $0xffffffffff600000,%rax
0x00000034f408c2db : callq *%rax

あなたの分解で。アドレス0xffffffffff600000は vsyscall ページ (x86_64 上) です。

このメカニズムは、カーネルによって作成された特定のコード ページをユーザー メモリにマップするため、ユーザー/カーネル コンテキスト スイッチのオーバーヘッドなしで、"通常の" 関数呼び出しとしていくつかの "syscall" を実行できます。実際の実装はここにあります

于 2011-09-01T10:28:52.813 に答える