Linux x86_64下进程地址空间布局-vDSO

在上一篇Linux x86_64进程内存空间布局中谈了两个不同参数下的进程运行时内存空间宏观的分布。也许你会注意到这样一个细节,在每个进程的stack以上的地址中,有一段动态变化的映射地址段,比如下面这个进程,映射到vdso。

如果我们用ldd看相应的程序,会发现vdso在磁盘上没有对应的so文件。
不记得曾经在哪里看到大概这样一个问题:

getpid,gettimeofday是不是系统调用?

其实这个问题的答案就和vDSO有关,杂x86_64和i386上,getpid是系统调用,而gettimeofday不是。



vDSO全称是virtual dynamic shared object,是一种内核将一些本身应该是系统调用的直接映射到用户空间,这样对于一些使用比较频繁的系统调用,直接在用户空间调用可以节省开销。如果想详细了解,可以参考这篇文档



下面我们用一段程序验证下:

#include <stdio.h>
#include <sys/time.h>
#include <sys/syscall.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    struct timeval tv;
    int ret;
    if ((ret=gettimeofday(&tv, NULL))<0) {
        fprintf(stderr, "gettimeofday call failed\n");
    }else{
        fprintf(stdout, "seconds:%ld\n", (long int)tv.tv_sec);
    }

    fprintf(stdout, "pid:%d\n", (int)getpid());
    fprintf(stdout, "thread id:%d\n", (int)syscall(SYS_gettid));
    return 0;
}

编译为可执行文件后,我们可以用strace来验证:

strace -o temp ./vdso
grep getpid temp
grep gettimeofday temp
时间: 2024-12-10 10:55:37

Linux x86_64下进程地址空间布局-vDSO的相关文章

Linux x86_64下进程地址空间布局

关于Linux 32位内存下的内存空间布局,可以参考这篇博文Linux下C程序进程地址空间局关于源代码中各种数据类型/代码在elf格式文件以及进程空间中所处的段,在x86_64下和i386下是类似的,本文主要关注vm.legacy_va_layout以及kernel.randomize_va_space参数影响下的进程空间内存宏观布局. 情形一: vm_legacy_va_layout=1 kernel.randomize_va_space=0 此种情况下采用传统内存布局方式,不开启随机化 ca

Linux环境下进程中断的原因

问题描述 Linux环境下进程中断的原因 linux环境下,哪些原因可能造成某进程中断?或者说,代码中哪些不合理的地方可能会引起进程的中断? 解决方案 内存溢出等,程序无法处理的异常都会造成程序进程中断 解决方案二: 中断是一种是一种机制: 看下面的一段汇编代码: .section .data string:.ascii "hello" .section .text .globl _start _start: movl $4,%eax#sys_call_num movl $2,%ebx

【图解】Linux下C程序进程地址空间布局 .

 作者:沧海猎人   出处:http://blog.csdn.net/embedded_hunter  转载请注明出处   嵌入式技术交流QQ群:179012822 我们在学习C程序开发时经常会遇到一些概念:代码段.数据段.BSS段(Block Started by Symbol) .堆(heap)和栈(stack).先看一张教材上的示意图(来源,<UNIX环境高级编程>一书),显示了进程地址空间中典型的存储区域分配情况.            从图中可以看出: 从低地址到高地址分别为:代码段

深入解析Linux系统下的进程切换

  Linux内核下进程切换 Linux切换并没有使用X86CPU的切换方法,Linux切换的实质就是cr3切换(内存空间切换,在switch_mm函数中)+ 寄存器切换(包括EIP,ESP等,均在switch_to函数中).这里我们讲述下switch_to主流程: 1. 在switch_mm函数中将new_task->pgd设置到cr3寄存器中,实现页表切换,由于每个进程3-4G的页表映射机制完全一样(从内核页表中直接复制过来的),故这里虽然切换了pgd,但是并无影响,只是在任务回到用户空 间

linux-Linux系统下进程接收到信号后。。

问题描述 Linux系统下进程接收到信号后.. linux系统下,比如说一个进程给自身发信号,那么当进程接到信号时,是先执行发送语句的下一句,还是先执行信号处理函数? 解决方案 这个问题问的不是很具体. 一个进程给自身发信号(很罕见的情形),那么势必存在一个信号的监听函数listen,也就需要一个信号的处理函数handle. 而一般来说进程发出信号以后很可能有其他的任务要做,不能一直等待接收信号,所以要么采用多线程机制,要么采用异步选择机制. 如果是这样的话,先执行哪个任务就不好说了. 不知道我

Linux 深入理解进程权限_linux shell

Linux 进程权限分析 在linux下,关于文件权限,大部分人接触比较多,也比较熟悉了解.但是对进程权限一般知之甚少.本文总结一下linux系统下进程权限问题和现象. 需要强调的是,本文是linux系统下讨论,因为linux和unix有很多不同的地方,并且各个不同的unix系统也有很多不同. 先开门见山的列出本文讨论对象:ruid(实际用户id: real userid).euid(有效用户用户:effective userid), suid(保存用户id:saved userid).fuid

Linux下进程崩溃时定位源代码位置

前几天领导安排一个小项目,大意是解决这样一个问题: 在Linux系统下,进程可能由于各种原因崩溃,此时我们要找到出问题的源代码在某一个文 件的具体行号,这样调试起来就会方便,高效很多,可能是公司项目要用到,想想挺有意思的,加上自己本身是个Linux狂热者,最终花了两三天解决了这个问 题,当然我的领导我们称之为专家指点了我很多,废话少说,下面是解决问题的思路和步骤以及自己的一些想法   解 决该问题的大体思路是这样的:在Linux下,进程崩溃时内核(也就是我们所谓的操作系统)会向进程发送信号,比如

Linux下进程描述(1)—进程控制块【转】

转自:http://www.cnblogs.com/33debug/p/6705391.html 进程概念介绍    进程是操作系统对运行程序的一种抽象. • 一个正在执行的程序: • 一个正在计算机上执行的程序实例: • 能分配给处理器并由处理器执行的实体: • 一个具有普以下特征的活动单元:一组指令序列的执行.一个当前状态和相关的系统资源集. 内核观点:担当分配系统资源(CPU时间,内存)的实体.进程的两个基本元素:程序代码(可能被执行的其他进程共享).数据集.进程是一种动态描述,但是并不代

linux环境下一个进程最多能有多少个线程

以下是对在linux环境下一个进程最多能有多少个线程进行了介绍,需要的朋友可以过来参考下 默认情况下: 主线程+辅助线程 +<253个自己的线程<=255 含主线程和一个辅助线程,最多255个,即你自己只能生成253个线程. 据说可以设置线程数目: 据说是可以设置的,但本人还没有验证!不知道可否. 在你的shell中键入limit命令,里面有descriptor的数目,就是你的进程可以创建的最大线程数目.可以通过修改内核文件更改该数目.