Linux 内核如何装载和启动一个可执行程序

news/2024/11/17 18:48:37/文章来源:https://www.cnblogs.com/20202215zxp/p/18550889

张晓攀+原创作品转载请注明出处+《Linux内核分析》MOOC课程https://mooc.study.163.com/course/1000029000

实验七——Linux 内核如何装载和启动一个可执行程序

一、实验过程

1.从github上下载相关代码

2.然后用test_exec.c 替换test.c,再重新编译生成根文件系统

3.启动调试内核

4.再开一个shell,打开gdb,并加载符号表,连接到端口1234

5.设置断点进行调试

然后在menu界面中输入命令:exec ,触发了断点

发现程序第一个断点停在了sys_execve处:

按s,单步执行,发现接下来会运行do_execve:

按c继续执行,发现接下来停在了load_elf_binary处:

按c继续执行,发现接下来停在了start_thread处,这时使用命令:
po new_ip 查看new_ip的值,它等于0x8048d0a,再另外打开一个shell,使用命令readelf -h hello查看hello的elf头,可以看到elf头中的程序入口点地址正是0x8048d0a

按s,单步执行,可以看到在start_thread中对进程栈的修改。

二、实验总结

在 Linux 系统中,装载和启动一个可执行程序涉及几个关键步骤。

1. 用户空间调用

用户在终端输入命令或通过系统调用(如 execve())启动可执行程序。该调用向内核发出请求以装载并运行指定程序。

2. 查找可执行文件

内核根据用户提供的路径或环境变量(如 $PATH),定位到文件系统中的目标可执行文件。

3. 检查文件格式

内核通过文件头检查程序格式(如 ELF、a.out 等)。ELF(Executable and Linkable Format)是现代 Linux 系统中最常用的格式。

4. 创建新进程环境

  • 分配内存:内核为新进程分配内存空间,包括代码段、数据段、堆和栈。
  • 加载二进制文件:将可执行文件的内容(如代码段和数据段)装载到分配的内存中。
  • 初始化堆栈:为新进程设置用户堆栈,并初始化参数(如命令行参数和环境变量)。

5. 设置新进程上下文

  • 初始化寄存器:设置 CPU 寄存器,特别是程序计数器(PC)指向程序入口点。
  • 设置内存映射:使用 mmap 机制将动态库(如 libc)和其他需要的共享库映射到进程地址空间。
  • 处理文件描述符:继承或设置文件描述符(标准输入、输出、错误)。

6. 开始执行

内核通过系统调用返回到用户态,启动新进程。此时,程序从入口点(通常是 _start)开始执行。

7. 动态链接器(若适用)

如果程序依赖共享库,动态链接器(ld.so)会在程序运行前装载和链接这些库。

相关子系统

  • VFS(虚拟文件系统):用于查找和读取可执行文件。
  • 内存管理:分配和管理进程所需的内存。
  • 进程管理:创建新进程,并管理其生命周期。

这些步骤确保从用户发起程序运行请求到程序实际执行之间的无缝过渡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835463.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现

java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现@目录背景说明前言Runtime.exec()常见的几种陷阱以及避免方法陷阱1:IllegalThreadStateException陷阱2:Runtime.exec()可能hang住,甚至死锁陷阱3:不同平台上,命令的兼容性陷阱4:错把Runtime.exec()的…

昆工891数据库系统原理强化课程

--昆工昆明理工大学、计算机技术、人工智能、软件工程、网络空间安全、891计算机专业核心综合、计算机系统结构、计算机软件与理论、网络与信息安全、计算机应用技术、综合程序设计、通信工程、817信号与系统、信号与信息处理、通信与信息系统

第7篇Scrum博客

1.站立式会议 1.1 会议照片1.2 会议内容 昨天已完成的工作: 昨天已基本实现用条形图,折线图,饼图展示数据界面功能。 今天计划完成的工作项目模块 需要实现的功能 负责人 预计用时主界面模块 整合代码,查漏补缺 王伊若 5h主界面模块 主界面设计 王伊若 2h主界面模块 查询界…

Ant Design Vue组件安装

https://www.antdv.com/docs/vue/getting-started-cn

书生共学大模型实战营L1G6000 XTuner微调

任务描述:使用XTuner微调InternLM2-Chat-7B实现自己的小助手认知 该任务分为数据集处理、微调训练、合并部署三个环节。数据处理:主要是将目标json文件中的字段替换为和自己用户名相关的字段,这里我们将“尖米”替换为“科研狗1031”:微调训练:采用教程中的XTuner框架,在…

request to https://registry.npm.taobao.org/ant-design-vue failed, reason: certificate has expire

一、原因分析 其实早在 2021 年,淘宝就发文称,npm 淘宝镜像已经从 http://registry.npm.taobao.org 切换到了 http://registry.npmmirror.com。旧域名也将于 2022 年 5 月 31 日停止服务(直到 HTTPS 证书到期才真正不能用了)2024年1 月 22 日,淘宝原镜像域名(http…

【学校训练记录】11月个人训练赛4个人题解

A题意可以理解为在a,b的范围内如果一个数是某个整数的立方,求与其距离为k的范围内有几个整数的平方数,我们可以对于每个立方数求出其数量,注意边界问题 #include <bits/stdc++.h> #define int long long using namespace std;int a, b, k; void solve(){cin >>…

第六篇Scrum博客

1.站立式会议 1.1 会议照片1.2 会议内容 昨天已完成的工作: 已经完成了账目的查询界面功能,按日期、备注以及收入支出查询等功能。 今天计划完成的工作项目模块 需要实现的功能 负责人 预计用时主界面模块 协助他人完成工作 王伊若 2h主界面模块 分类报告界面 王伊若 3h主界面…

学校个人训练记录

A题意可以理解为在a,b的范围内如果一个数是某个整数的立方,求与其距离为k的范围内有几个整数的平方数,我们可以对于每个立方数求出其数量,注意边界问题 #include <bits/stdc++.h> #define int long long using namespace std;int a, b, k; void solve(){cin >>…

Scrum 冲刺博客-day2

一、每天会议 昨天完成的任务与今天计划完成任务成员 昨天已完成任务 今天计划完成任务董雯霖 组织会议,确立各自工作 用户注册页面陈金星 参会,发表意见 用户登录页面邱列圻 参会,发表意见 用户模块的接口开发李嘉远 参会,发表意见 页面测试詹洛熙 参会,发表意见 接口测试…

第4篇Scrum冲刺博客

1.站立式会议 1.1 会议照片1.2 会议内容 昨天已完成的工作: 已初步完成主界面设计和数据库编写记录 今天计划完成的工作项目模块 需要实现的功能 负责人 预计用时数据库模块 数据库记录的备份、恢复和退出 王伊若 2h主界面模块 账目记录的增删改功能及界面 王伊若 6h主界面模块…