深圳企业网站开发费用html代码中标签的书写不区分大小写
深圳企业网站开发费用,html代码中标签的书写不区分大小写,公司logo查询,网站转移码文章目录 一、简介二、vdso2.1 用户态2.2 内核态2.3 内核源码解析 参考资料 一、简介
Linux中的vdso#xff08;Virtual Dynamic Shared Object#xff09;是一种特殊的动态共享对象#xff0c;它在用户空间和内核空间之间提供了一种高效的接口。vdso机制的目的是减少用户空… 文章目录 一、简介二、vdso2.1 用户态2.2 内核态2.3 内核源码解析 参考资料 一、简介
Linux中的vdsoVirtual Dynamic Shared Object是一种特殊的动态共享对象它在用户空间和内核空间之间提供了一种高效的接口。vdso机制的目的是减少用户空间程序与内核之间频繁的上下文切换开销提高系统性能。
“vDSO”虚拟动态共享对象是一个小型的共享库内核会自动将其映射到所有用户空间应用程序的地址空间中。应用程序通常无需关注这些细节因为vDSO最常由C库调用。这样可以以正常方式编码使用标准函数而C库会负责使用通过vDSO可用的任何功能。
vDSO的存在是为什么内核提供了一些系统调用用户空间代码经常使用这些调用以至于这些调用可能主导整体性能。这既是由于调用的频率又是由于从用户空间退出并进入内核所产生的上下文切换开销。
vdso包含一组特定的函数这些函数在用户空间中执行但其实现是由内核提供的。用户空间程序可以通过调用这些函数来访问一些系统功能而无需陷入内核态。
vdso的一个重要用途是实现系统调用的快速路径。当用户空间程序执行系统调用时通常需要进行一次上下文切换将控制权从用户态切换到内核态。然而某些系统调用是非常频繁且开销较小的这种上下文切换的开销可能会成为性能瓶颈。vdso提供了一个快速路径通过在用户空间中执行特定的系统调用函数避免了不必要的上下文切换从而提高了系统调用的性能。
在Linux中vdso通常以linux-vdso.so.X的形式存在于/proc/self/maps中并且被映射到每个进程的地址空间中。这样用户空间程序可以直接调用vdso中的函数而无需显式加载和链接vdso库。
总结来说vdso是Linux中用于优化系统调用性能的一种机制它提供了一组在用户空间执行的特定系统调用函数以减少用户态和内核态之间的上下文切换开销并提高系统性能。
备注 vdso只包括了几个特定的系统调用
clock_gettime
gettimeofday
getcpu
time
clock_getres比如gettimeofday 一个经常被使用的系统调用是gettimeofday(2)。这个系统调用既可以被用户空间应用程序直接调用也可以被C库间接调用。想象一下时间戳、定时循环或轮询所有这些都经常需要知道当前的时间。这些信息也不是机密的任何特权模式root或非特权用户的应用程序都会得到相同的答案。因此内核会安排将回答这个问题所需的信息放置在进程可以访问的内存中。现在调用gettimeofday(2)变成了一个普通的函数调用和几次内存访问。
二、vdso
2.1 用户态
# ldd /usr/bin/lslinux-vdso.so.1 (0x00007ffca7b40000)......# cat /proc/1/maps
55637a23d000-55637a26f000 r--p 00000000 08:05 59514907 /usr/lib/systemd/systemd
55637a26f000-55637a32d000 r-xp 00032000 08:05 59514907 /usr/lib/systemd/systemd
55637a32d000-55637a383000 r--p 000f0000 08:05 59514907 /usr/lib/systemd/systemd
55637a383000-55637a3c9000 r--p 00145000 08:05 59514907 /usr/lib/systemd/systemd
55637a3c9000-55637a3ca000 rw-p 0018b000 08:05 59514907 /usr/lib/systemd/systemd
55637c14a000-55637c416000 rw-p 00000000 00:00 0 [heap]......7f008b2bf000-7f008b2c0000 rw-p 00000000 00:00 0
7ffd3bc40000-7ffd3bd42000 rw-p 00000000 00:00 0 [stack]
7ffd3bd4f000-7ffd3bd53000 r--p 00000000 00:00 0 [vvar]
7ffd3bd53000-7ffd3bd55000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]其中
7ffd3bd53000-7ffd3bd55000 r-xp 00000000 00:00 0 [vdso]可以看到vdso内存大小0x2000 4096 * 2即两个虚拟页面的大小。
vdso的起始虚拟地址在进程1是0x7ffd3bd53000转化为十进制即140725607280640将这段内存dump到文件中
# dd if/proc/1/mem of/tmp/linux-vdso.so skip140725607280640 ibs1 count8192
dd: /proc/1/mem: cannot skip to specified offset
81920 records in
160 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.00971912 s, 843 kB/s由于vDSO是一个完整的ELF镜像可以对其进行符号查找
# objdump -T /tmp/linux-vdso.so/tmp/linux-vdso.so: file format elf64-x86-64DYNAMIC SYMBOL TABLE:
0000000000000a10 w DF .text 0000000000000413 LINUX_2.6 clock_gettime
0000000000000690 g DF .text 0000000000000348 LINUX_2.6 __vdso_gettimeofday
0000000000000e30 w DF .text 0000000000000060 LINUX_2.6 clock_getres
0000000000000e30 g DF .text 0000000000000060 LINUX_2.6 __vdso_clock_getres
0000000000000690 w DF .text 0000000000000348 LINUX_2.6 gettimeofday
00000000000009e0 g DF .text 0000000000000029 LINUX_2.6 __vdso_time
0000000000000ec0 g DF .text 000000000000009c LINUX_2.6 __vdso_sgx_enter_enclave
00000000000009e0 w DF .text 0000000000000029 LINUX_2.6 time
0000000000000a10 g DF .text 0000000000000413 LINUX_2.6 __vdso_clock_gettime
0000000000000000 g DO *ABS* 0000000000000000 LINUX_2.6 LINUX_2.6
0000000000000e90 g DF .text 0000000000000025 LINUX_2.6 __vdso_getcpu
0000000000000e90 w DF .text 0000000000000025 LINUX_2.6 getcp2.2 内核态
vDSO 会向用户提供的 syscall
// linux-5.13/arch/x86/entry/vdso/vdso.lds.S/** This controls what userland symbols we export from the vDSO.*/
VERSION {LINUX_2.6 {global:clock_gettime;__vdso_clock_gettime;gettimeofday;__vdso_gettimeofday;getcpu;__vdso_getcpu;time;__vdso_time;clock_getres;__vdso_clock_getres;__vdso_sgx_enter_enclave;local: *;};
}即
__vdso_clock_gettime
__vdso_gettimeofday
__vdso_getcpu
__vdso_time
__vdso_clock_getres
__vdso_sgx_enter_enclave通常vDSO遵循将所有符号以“_vdso”或“_kernel”作为前缀的命名约定以便将它们与其他标准符号区分开。例如“gettimeofday”函数的名称是“__vdso_gettimeofday”。
可以看到用户态vdso虚拟地址内容一样。
2.3 内核源码解析
内核具体源码解析请参考 https://tinylab.org/riscv-syscall-part4-vdso-implementation/ https://www.bookstack.cn/read/linux-insides-zh/SysCall-linux-syscall-3.md https://zhuanlan.zhihu.com/p/611286101
参考资料
Linux 5.13 https://man7.org/linux/man-pages/man7/vdso.7.html https://blog.rustforever.top/2022/02/10/linux/syscall/vdso/ https://zhuanlan.zhihu.com/p/620578643 https://cloud.tencent.com/developer/article/1517837
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88165.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!