linux – 为什么time.h中的time()没有syscall到sys_time?

前端之家收集整理的这篇文章主要介绍了linux – 为什么time.h中的time()没有syscall到sys_time?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我写了一个非常简单的程序,调用time()来说明使用了strace,但是我遇到了问题; time()调用似乎并没有实际产生系统调用

我最终进入了GDB中的time()函数,现在我比以前更加困惑.从time()函数的反汇编:

0x7ffff7ffad90 <time>:  push   rbp
0x7ffff7ffad91 <time+1>:    test   rdi,rdi
0x7ffff7ffad94 <time+4>:    mov    rax,QWORD PTR [rip+0xffffffffffffd30d]        # 0x7ffff7ff80a8
0x7ffff7ffad9b <time+11>:   mov    rbp,rsp
0x7ffff7ffad9e <time+14>:   je     0x7ffff7ffada3 <time+19>
0x7ffff7ffada0 <time+16>:   mov    QWORD PTR [rdi],rax
0x7ffff7ffada3 <time+19>:   pop    rbp
0x7ffff7ffada4 <time+20>:   ret@H_502_5@ 
 

如果它不调用内核,该函数如何实际获取当前时间?它的流程是:

>序幕
>从(0x7ffff7ffad94 0xffffffffffffd30d)(0x7ffff7ff80a8)获取一些值并将其放入rax(要返回)
>检查rdi(第一个参数)是否为空
>如果没有将值放在rax(返回值)中
>结语

这与time()的功能有关;如果参数为null,它只返回值,但如果不是,它也将它放在参数中.我的问题是,它在哪里得到时间价值?地址0x7ffff7ff80a8有什么神奇之处,没有系统调用怎么做呢?

我正在使用GCC 6.3.0和Ubuntu GLIBC 2.24-9ubuntu2.2.

解决方法

阅读 time(7).可能您对 time(2)的呼叫使用 vdso(7)(可能是 clock_gettime(2)或__vdso_time).如果使用 vdso(7),

When tracing systems calls with 07005,symbols (system calls)
that are exported by the vDSO will not appear in the trace output.

细节可以是内核和libc特定的(当然还有特定于体系结构).

对于类似的vDSO原因,strace日期不显示任何与时间相关的系统调用.

vDSO是一个非常方便的功能.由于它,定时调用(例如clock_gettime(2) ……)非常快(我的i5-4690S大约40纳秒). AFAIU,没有context switch(或内核mode过渡的用户)正在发生.

所以你的0x7ffff7ff80a8可能位于vDSO中(并且内核确保它包含当前时间).您可以使用proc(5)(例如reading显示程序中的/ proc / self / maps)或使用ldd(1)进行检查.

原文链接:https://www.f2er.com/linux/394921.html

猜你在找的Linux相关文章