gettimeofday syscall如何工作?

问题描述 投票:10回答:2

[gettimeofday是根据this page的x86-86的系统调用(只需在框中搜索gettimeofday:]

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

我认为反汇编应该很容易,只需准备两个指针并调用相关的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。>>

谁能解释它的工作原理吗?

gettimeofday是根据此页面的x86-86的系统调用(只需在框中搜索gettimeofday):int gettimeofday(struct timeval * tv,struct timezone * tz);我认为拆卸应该很容易...

assembly x86-64 system-calls
2个回答
9
投票

gettimeofday()在Linux上称为vsyscall和/或vdso。因此,您会看到两行:


7
投票

Syscall通常会产生大量开销,并且由于有大量的gettimeofday()调用,因此人们不希望使用syscall。为此,Linux内核可以将一个或两个特殊区域映射到每个程序中,称为vdso和vsyscall。您对gettimeofday()的实现似乎正在使用vsyscall:

© www.soinside.com 2019 - 2024. All rights reserved.