【发布时间】:2023-04-09 16:49:01
【问题描述】:
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。
谁能解释它是如何工作的?
【问题讨论】:
-
您看到系统调用站点的最后一列了吗? (顺便说一句,很棒的网站)定义 - 链接到 kernel/time.c:101 - lxr.free-electrons.com/source/kernel/time.c#L101 。还是您在寻找其他东西?
-
最后一行是OS的实现,我不需要知道,只要跟着调用方就行了。
标签: linux assembly x86-64 system-calls vdso