260618 http://grazia.my
In love with this sugar-dusted magic that rogervivier and YEJI are serving. 💖
https://www.instagram.com/p/DZt0ZrjmFjf/ #예지 #YEJI
原文 #黄礼志
''
Skip to main content
gettimeofday() 的时候,脑子里大概浮现的是一次系统调用:用户态 → 内核态切换,保存寄存器,走中断向量,查内核时间变量,再原路返回。一次调用,两次上下文切换。但在现代 Linux 上,这件事压根没发生。gettimeofday() 时,动态链接器把它解析到了 vDSO 里的函数,而不是 libc 的常规 syscall 封装。于是整件事在用户态就完成了:vDSO 的代码直接读内核映射的只读数据页上的时间值,算出结果返回给你,全程没有 syscall 指令。objdump -d /lib64/libc.so.6 | grep -A 20 clock_gettime 看到它先尝试走 vDSO,失败才走 syscall 的 fallback 路径。也可以 cat /proc/self/maps | grep vdso 看到这段内存就躺在你进程里,地址在栈和 libc 之间。甚至 _start 入口点之前就被映射好了,你没有任何办法拒绝它。arch/x86/entry/vdso/ 和 lib/vdso/ 下,加起来几百行 C,却把时间类系统调用的开销从上千个时钟周期降到了几十个。下次你 strace -c 一个高频调 gettimeofday 的程序却看不到多少 syscall 次数的时候,别疑惑——它根本没进内核。