linux vdso与vsyscall相关内容总结

2024-08-22 04:38

本文主要是介绍linux vdso与vsyscall相关内容总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇blog里,简单分析了64位linux下系统调用的执行过程,其中还剩下两点内容:vdso与vsyscall。vdso的全称是虚拟动态共享库(virtual dynamic shared library),而vsyscall的全称是虚拟系统调用(virtual system call)。关于 vdso与vsyscall的介绍,请见以下这篇blog,内容上这篇blog分析的非常好,并且是以x86-64位的linux最为实例进行讲解,但这个系列blog是直接从源码出发,我现在分析内核或glibc的思路是从现象出发,层层深入,所以在思路上有些冲突。

https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-3.html

 在推荐另一篇blog:http://www.lenky.info/archives/2013/02/2199

同样是对64位linux的系统调用机制进行研究,但其中的某些实验我没有能够复现。

好,言归正传。

先来看vdso与vsyscall的出现原因:由于进行系统调用时,操作系统要由用户态切换到内核态,而这一操作是非常浪费时间的操作,无论采用早期的int 0x80/iret中断,还是sysenter/sysexit指令,再到syscall/sysexit指令。另一方面,某些系统调用并不会向内核提交参数,而仅仅只是从内核里请求读取某个数据,例如gettimeofday(),内核在处理这部分系统调用时可以把系统当前时间写在一个固定的位置,而应用程序直接从该位置简单读取即可,无需发起系统调用。内核与用户态程序之间进行数据交互的方法就是mmap。但由于vsyscall采用固定地址映射的方式,所以存在一定的安全隐患,这一方式便被vdso所改进,vdso的随机映射在一定程度上缓解了安全威胁。虽然有了vdso,但从历史兼容性上来讲,vsyscall不能就此完全抛弃,否则将导致一些陈旧的(特别是静态连接的)应用程序无法执行,因此现在在我的3.19内核上,将同时看到vdso和vsyscal。

举个简单的例子:

cat /proc/self/maps
00400000-0040c000 r-xp 00000000 08:08 2883607                            /bin/cat
0060b000-0060c000 r--p 0000b000 08:08 2883607                            /bin/cat
0060c000-0060d000 rw-p 0000c000 08:08 2883607                            /bin/cat
01778000-01799000 rw-p 00000000 00:00 0                                  [heap]
7eff551eb000-7eff558cd000 r--p 00000000 08:08 401027                     /usr/lib/locale/locale-archive
7eff558cd000-7eff55a8d000 r-xp 00000000 08:08 3412306                    /lib/x86_64-linux-gnu/libc-2.21.so
7eff55a8d000-7eff55c8d000 ---p 001c0000 08:08 3412306                    /lib/x86_64-linux-gnu/libc-2.21.so
7eff55c8d000-7eff55c91000 r--p 001c0000 08:08 3412306                    /lib/x86_64-linux-gnu/libc-2.21.so
7eff55c91000-7eff55c93000 rw-p 001c4000 08:08 3412306                    /lib/x86_64-linux-gnu/libc-2.21.so
7eff55c93000-7eff55c97000 rw-p 00000000 00:00 0 
7eff55c97000-7eff55cbb000 r-xp 00000000 08:08 3412278                    /lib/x86_64-linux-gnu/ld-2.21.so
7eff55e78000-7eff55e9d000 rw-p 00000000 00:00 0 
7eff55eb8000-7eff55eba000 rw-p 00000000 00:00 0 
7eff55eba000-7eff55ebb000 r--p 00023000 08:08 3412278                    /lib/x86_64-linux-gnu/ld-2.21.so
7eff55ebb000-7eff55ebc000 rw-p 00024000 08:08 3412278                    /lib/x86_64-linux-gnu/ld-2.21.so
7eff55ebc000-7eff55ebd000 rw-p 00000000 00:00 0 
7ffc08293000-7ffc082b4000 rw-p 00000000 00:00 0                          [stack]
7ffc082e4000-7ffc082e6000 r--p 00000000 00:00 0                          [vvar]
7ffc082e6000-7ffc082e8000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
此处可以清晰的看到在进程空间里同时存在vdso与vsyscall,我曾试着将这两个文件转储出来,不过还没有成功。

所以我也就没有办法从现象出发对源码进行分析。

此处还要提一个函数名为__kernel_vsyscall,名字和vsyscall很像,不过正好相反,这个函数是与vdso相关的函数。根据《深入理解linux内核》,__kernel_vsyscall是为兼容int 0x80与sysenter两种系统调用触发方式,而存在的函数。但在x64上不再需要__kernel_vsyscall,因为它只有一种调用方式,即syscall指令。


这篇关于linux vdso与vsyscall相关内容总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095260

相关文章

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

Linux grep 命令的使用指南

《Linuxgrep命令的使用指南》本文给大家介绍Linuxgrep命令的使用指南,包括基础搜索语法、实践指南,感兴趣的朋友跟随小编一起看看吧... 目录linux grep 命令全面使用指南一、基础搜索语法1. 基本文本搜索2. 多文件搜索二、常用选项详解1. 输出控制选项2. 上下文控制选项三、正则表达

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到