进程装载过程分析(execve系统调用分析)

最近一段时间在学习linux内核,这里将进程启动的过程的一些心得体会记录一下。

1、进程启动

  linux环境下我们启动一个程序一般都是通过shell拉起来的。或者通过一个程序调用exec系列函数进行进程替换的。

  其实这两种方式实质是一样的,shell拉起也是调用的exec系列函数;所以我们就以第二种方式用代码来分析整个装载过程。

2、程序代码

  首先我们来看下我们的实例程序代码。

  为了好跟踪内核代码,所以这里通过qemu模拟了linux和文件系统。上左图为主进程,主进程fork了一个子进程,子进程最后调用exec*将自己替换为hello进程(),

  hello进程代码为右图。

3、 内核代码走读

  其实这里主要就是跟踪exec* 系统调用在内核中的执行,exec*系列函数都是execve的封装例程,execve系统调用最终对应的系统调用处理函数为sys_execve。

  

  sys_execve——> do_execve——>do_execve_common调用过程,do_execve_common 里面的实际上就是在组装 struct linux_binprm结构体。

  其主要调用exec_binprm

最终找到elf的加载函数,开始正式按照elf格式进行加载。

,通过上图,可以看到“current_pt_regs”这个就是将当期进程的寄存器堆取出来(eax、ebx……)。

然后“elf_entry”这个就是新的进程的入口,也就是这里是在准备新进程的堆栈信息、执行环境,实际上start_thread就是将原来的进程的堆栈信息全给替换为了新的进程的堆栈.

4、调试跟踪

如上图可以看到在start_thread函数中将新的进程的入口函数加载到堆栈中了,而进程入口就是进行elf文件中的entry point address.于是当进程返回用户空间时,就从新的进程入口开始执行了,于是进程就被替换成新的进程了——偷梁换柱

5、总结

  其实我们上面只分析了进程为静态链接的情况。如果是动态链接,老进程的堆栈入口将不是elf文件的开始。二手ld动态加载器,如下图代码所示:

我们进程的加载都是通过exec系统调用在内核中通过堆栈的替换 来偷梁换柱完成的。可以比喻为当一个人走进一个房间后(内核),等他出来时他的灵魂已经被换成另一个人了。

原文地址:https://www.cnblogs.com/tjyuanxi/p/9313253.html

时间: 2024-10-17 01:06:04

进程装载过程分析(execve系统调用分析)的相关文章

Linux进程启动过程分析do_execve(可执行程序的加载和运行)

日期 内核版本 架构 作者 GitHub CSDN 2016-06-06 Linux-4.5 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度-之-进程的描述 execve系统调用 execve系统调用 我们前面提到了, fork, vfork等复制出来的进程是父进程的一个副本, 那么如何我们想加载新的程序, 可以通过execve来加载和启动新的程序. x86架构下, 其实还实现了一个新的exec的系统调用叫做execveat(自linux-3.

Chromium的Plugin进程启动过程分析

前面我们分析了Chromium的Render进程和GPU进程的启动过程,它们都是由Browser进程启动的.在Chromium中,还有一类进程是由Browser进程启动的,它们就是Plugin进程.顾名思义,Plugin进程是用来运行浏览器插件的.浏览器插件的作用是扩展网页功能,它们由第三方开发,安全性和稳定性都无法得到保证,因此运行在独立的进程中.本文接下来就详细分析Plugin进程的启动过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在Chro

从整理上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

一.首先我们来看看进程控制块PCB也就是task_struct,(源码) 选出task_struct中几个关键的参数进行分析 struct task_struct {volatile long state; //进程状态 /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; //进程内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 /* per process flags, defined

第一次作业:Linux 2.6.32的进程模型与调度器分析

1.前言 本文分析的是Linux 2.6.32版的进程模型以及调度器分析.在线查看 源码下载 本文主要讨论以下几个问题: 什么是进程?进程是如何产生的?进程都有那些? 在操作系统中,进程是如何被管理以及它们是怎样被调用的? 2.进程模型 2.1进程的概念 在我的理解中,一个程序就相当于一个进程,程序的启动意味着产生了一个新的进程,程序的关闭也就意味着一个进程的消亡. 那么专业定义应该是: 在计算中,进程是正在执行的计算机程序的一个实例. 它包含程序代码及其当前活动. 根据操作系统(OS),一个进

Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)

execve系统调用 execve系统调用 我们前面提到了, fork, vfork等复制出来的进程是父进程的一个副本, 那么如何我们想加载新的程序, 可以通过execve来加载和启动新的程序. x86架构下, 其实还实现了一个新的exec的系统调用叫做execveat(自linux-3.19后进入内核) syscalls,x86: Add execveat() system call exec()函数族 exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,

通过系统调用分析system_call中断处理过程

罗冲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 实验准备 1.1 环境准备 下载linux3.18.6的源代码. 按照http://mooc.study.163.com/learn/USTC-1000029000?tid=2001214000#/learn/content?type=detail&id=2001400011给出步骤进行编译 # 下载内核源代码编

Chromium的GPU进程启动过程分析

Chromium除了有Browser进程和Render进程,还有GPU进程.GPU进程负责Chromium的GPU操作,例如Render进程通过GPU进程离屏渲染网页,Browser进程也是通过GPU进程将离屏渲染好的网页显示在屏幕上.Chromium之所以将GPU操作运行在独立进程中,是考虑到稳定性问题.毕竟GPU操作是硬件相关操作,硬件的差异性会引发一定的不稳性.本文分析GPU进程的启动过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! GPU进程

Linux 进程信息收集与行为分析

0x00 分析方法 1)基本信息收集 对于一个进程的分析,首先可以通过ps,lsof等命令了解程序的一些基本信息.这个阶段可以搜集进程开放了哪些端口,使用了哪些句柄,程序的运行状态. 2)获取程序组成二进制文件 下一阶段可以思考程序由哪些程序文件组成,通过ps命令可以找到程序的启动文件路径,通过进程的maps文件,可以查看进程加载了哪些so文件. 这一步可以得到程序的所有二进制代码,作为IDA与gdb的分析输入. 3)数据作为切入点,数据流跟踪 进程信息的搜集与程序代码分析都比较零散,无法很好的

Linux下java进程CPU占用率高分析方法

Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1. 通过top命令找到可疑进程PID top - 09:37:18 up 70 days, 16:29, 2 users, load average: 1.13, 1.04, 0.97 Tasks: 105 total, 1 running