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中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二