gpt4 book ai didi

linux - gettimeofday 系统调用如何工作?

转载 作者:行者123 更新时间:2023-12-03 21:45:37 24 4
gpt4 key购买 nike

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()在 Linux 上是所谓的 vsyscall和/或 vdso .因此,您会看到两行:

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

在你的拆解中。地址0xffffffffff600000是 vsyscall 页面(在 x86_64 上)。

该机制将特定的内核创建的代码页映射到用户内存中,以便可以在没有用户/内核上下文切换开销的情况下进行一些“系统调用”,而是作为“普通”函数调用。实际实现是right here .

关于linux - gettimeofday 系统调用如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7266813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com