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

Linux内核装载和启动一个可执行程序 程  序 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000       首先,我们需要了解,什么是可执行程序。可执行程序是一种可以被计算机识别的程序,是源代码经过预处理、编译、链接等步骤后形成的程序,大体关系如下图所示。                               阅读详情

“郭孟琦(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”


以下都是梦话,感觉是快坚持不住了!


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

从刚学C语言开始就知道程序 通过 编译 汇编  链接 产生最终生成一个exe可执行文件,但是到底exe是怎么运行的?实际上并没有给出答案。在这里根据计组所学的东西我认为肯定是什么机制修改了ip从而使cpu开始执行程序中的指令。


这周课里我知道了可执行文件实际上也是一种ELF文件,也是具有一定的文件格式,通过readelf和objdump工具可以分析其内部结构。


readelf -h 反映了头信息,这里显示了该程序的入口地址(0x8048d0a)


objdump则反映了section的size和offset,对helloword而言其执行语句都在.text段,当然还有很多很多的段,这里不具体分析了。

有意思的是可以看出入口地址(0x8048d0a)就指向.text段中的内容。

在大致了解了一个可执行程序的本质后,开始正式探究Linux内核如何装载和启动一个可执行程序。

首先linux是通过execve系统调用来执行一个程序的。因此用gdb追踪了sys_execve。具体使用了老师提供的menu。

在代码中首先fork了一个子进程,并且在子进程中调用了execlp来执行helloworld

在sys_execve出设置断点发现执行过程为

do_execve -> do_execve_common ->  exec_binprm

在这里开始对elf文件进行解析
search_binary_handler符合寻找文件格式对应的解析模块。


对于ELF格式的可执行文件fmt->load_binary(bprm);执行的应该是load_elf_binary

因此在load_elf_binary处设置断点

追踪发现了

start_thread(regs, elf_entry, bprm->p);

而elf_entry就在前边的

elf_entry = load_elf_interp(&loc->interp_elf_ex,
					    interpreter,
				            &interp_map_addr,
				            load_bias);

或者

elf_entry = loc->elf_ex.e_entry;

赋值,这2句取决于是否有动态链接器。当然在helloworld中是使用了后者,也就是elf文件中的入口地址(0x8048d0a)(应该就是main函数)


这样堆栈sp和ip的变化就都是在

start_thread(regs, elf_entry, bprm->p);

198start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
199{
200	set_user_gs(regs, 0);
201	regs->fs		= 0;
202	regs->ds		= __USER_DS;
203	regs->es		= __USER_DS;
204	regs->ss		= __USER_DS;
205	regs->cs		= __USER_CS;
206	regs->ip		= new_ip;
207	regs->sp		= new_sp;
208	regs->flags		= X86_EFLAGS_IF;
209	/*
210	 * force it to the iret return path by making it look as if there was
211	 * some work pending.
212	 */
213	set_thread_flag(TIF_NOTIFY_RESUME);
214}

中发生了变化,用老师的话说就是 蝴蝶已经变成周公了。

返回用户态后新的eip开始执行helloword了。


补充一下新的sp又是谁呢?

根据参数他是bprm->p

实际上bprm是在 do_execve_common()中

分配新的进程地址空间

	bprm = kzalloc(sizeof(*bprm), GFP_KERNEL);


而p
unsigned long p; /* current top of mem */
应该是栈底


我对“Linux内核装载和启动一个可执行程序”的理解可以用一个流程图来表示


Linux内核分析:实验七--Linux内核如何装载和启动一个可执行程序 刘畅 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000写在前面本次实验着力分析Linux内核装载和启动一个可执行程序的过程,其中包括可执行文件格式的分析、可执行文件的装载和链接的过程,并通过GDB跟踪execve系统调用来梳理Linux系统加载可执行程序的过程。可执行文件的格式分析相对于其它文件 阅读详情

相关推荐

实战解析:在.NET中实现Dify API流式请求与响应的完整方案

本文详细解析了在.NET应用中对接Dify API时实现流式请求与响应的完整方案。针对传统后端“接收完才返回”的痛点,文章提供了基于ASP.NET Core的实战代码,通过配置HttpCompletionOption.ResponseHeadersRead和手动Flush响应流,构建高效的中转管道,确保AI回复能够像ChatGPT一样实时逐字推送到前端,显著提升用户体验。

weixin_29267307的博客 296

Linux内核装载和启动一个可执行文件

1.可执行文件是怎么来的?(以C语言为例) C代码(.c) - 经过编译器预处理,编译成汇编代码(.asm) - 汇编器,生成目标代码(.o) - 链接器,链接成可执行文件(.out) - OS将可执行文件加载到内存里执行 From C to running program [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N33VsNJZ-1634015070346)(https://raw.githubusercontent.com/Toyakoyo2018/picBed/m

weixin_44501390的博客 1446

银河麒麟V10SP1实战:5步搞定AD域登录(附Samba+Winbind配置详解)

本文提供银河麒麟V10 SP1操作系统无缝集成Windows AD域的实战指南。文章深入解析了Samba、Winbind与Kerberos三大核心组件的协作原理,并详细阐述了从环境准备、软件包安装、配置文件定制到执行加域及排错的全流程。特别针对2403等新版本提供了关键配置差异与避坑要点,旨在帮助企业运维人员实现高效、稳定的域环境登录与管理。

weixin_29269441的博客 289

linux的init进程pid,Linux系统下init进程的前世今生

Linux系统中的init进程(pid=1)是除了idle进程(pid=0,也就是init_task)之外另一个比较特殊的进程,它是Linux内核开始建立起进程概念时第一个通过kernel_thread产生的进程,其开始在内核态执行,然后通过一个系统调用,开始执行用户空间的/sbin/init程序,期间Linux内核也经历了从内核态到用户态的特权级转变,/sbin/init极有可能产生出了shel...

weixin_42360905的博客 2092

7.7 数据分析助手:用AI洞察业务数据价值

摘要:AI数据分析助手构建指南 本文介绍了如何构建AI数据分析助手,帮助企业从业务数据中提取价值。系统包含四大核心模块:自然语言理解模块解析用户查询意图,查询规划模块转换为SQL语句,数据可视化模块生成图表,以及洞察生成模块提供深度分析。文章通过销售数据分析助手案例,展示了从数据库准备到自然语言处理的完整实现流程,包括示例代码和系统架构图。该解决方案可降低数据分析门槛,让业务人员直接参与数据探索,提升决策效率。

yonggeit的博客 4092

西门子Simotion运动控制

SIMOTION

rjimhcd的博客 3023

Linux内核分析之简析加载和启动一个可执行程序

SA16225055冯金明    原创作品转载请注明出处  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验内容 实验要求: 理解编译链接的过程和ELF可执行文件的格式编程使用exec* 库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态

Kimi_ming的博客 955

[VCS]门级仿真及SDF反标

摘要:门级仿真在STA工具普及后仍是验证的重要环节,主要用于检查SDC完备性、异步电路时序、网表完整性及为功耗分析提供波形。门级仿真分为不带时序反标的前仿和带SDF反标的后仿,后仿需加载SDF文件提供精确延时信息。VCS提供多种仿真选项控制时序检查行为,SDF反标可通过命令或系统函数实现。后仿需特别注意关闭notimingcheck选项以确保时序检查有效性,并建议检查SDF反标报告和波形验证延时一致性。

元直的博客 9788

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

----------Linux内核如何装载和启动一个可执行程序------------        这次实验是要分析Linux内核是如何装载和启动一个可执行程序的。这个实验可以说有点意思。为什么这样说呢?倒不是这次实验有多难,而是这次涉及到的背后的知识其实一门非常有趣又古老的学问。        让我们一起来看看!每次我们写好了一段代码,最后都生成一个C文件(后缀名.c),我

NaiveOrange的博客 1143

笔试题-2023-加特兰-数字IC设计【纯净题目版】

笔试题-2023-加特兰-数字IC设计【纯净题目版】

w0shishabi的博客 2248

libVLC 视频抓图

libVLC 中通过libvlc_video_take_snapshot核心接口来截图。以下是VLC播放器中使用的截图界面,我们仿照这个做一个界面。首先,你需要初始化 libVLC 实例和媒体播放器对象。1. 初始化 libVLC 和媒体播放器。菜单添加action,并响应槽函数。生成目录下snap.png。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 1939

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

实验七:Linux内核如何装载和启动一个可执行程序 姓名:王朝宪 学号:20135114 注:原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 可执行文件的创建 C代码(.c) - 经过编译器预处理,编译成汇编代码(.asm) - 汇编器,生成目标代码(.o) - 链接器,链接...

weixin_30659829的博客 115

YOLOv11的嗅觉传感器数据关联-(特殊场景下的气味-视觉联合分析)

摘要 本文探讨了YOLOv11与嗅觉传感器融合的多模态感知技术。通过分析YOLOv11的架构特性与嗅觉传感器的数据特点,提出了三种融合策略:数据级、特征级和决策级融合。系统采用硬件同步方案实现时空对齐,包含视觉采集模块、嗅觉传感模块和边缘计算单元。环境配置基于Python 3.9和PyTorch 2.0,支持实时多模态数据处理。该技术可应用于环境监测、工业检测等场景,突破单一视觉感知的局限性。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 625

linux 带ifdef运行程序_Linux内核如何装载和启动一个可执行程序

郑斌+ 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000实验要求:理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节;​编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式,详细内容参考本周第二节...

weixin_39631932的博客 194

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

2015108 李泽源 Linux内核如何装载和启动一个可执行程序 理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节; 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式,详细内容参考本周第二节; 使用gdb跟踪分析一个execve系统调用内核处理函数sys_execv...

weixin_34405332的博客 202

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

学习Linux 内核如何装载和启动一个可执行程序ELF文件格式概述ELF文件三种类型ELF文件结构编程使用 exec*库函数加载一个可执行文件小demo-尝试execve的功能(exec族)可执行程序运行时动态链接可执行程序装载时动态链接 ELF文件格式 概述 目标文件是编译器生成的文件,"目标"指目标平台,常见的有x86,arm等,决定编译器使用机器指令集,手机就常用arm架构。目标文件一般叫ABI(应用程序二进制接口),目标文件和目标平台应该兼容比如x86汇编只能在x86架构平台下执行,不能在arm架构

weixin_44240981的博客 1428
上一篇: 分析Linux内核创建一个新进程的过程
下一篇: 理解进程调度时机跟踪分析进程调度与进程切换的过程
oCoreCode
博客等级 码龄14年 1粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值