2022-2023-1 20222804《Linux内核原理与分析》第八周作业

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

一、实验步骤

1、跟踪分析一个execve系统调用内核处理函数,根据以下代码更新menu

cd ~/LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git
cd menu 
mv test_exec.c test.c
make rootfs

结果展示:
在这里插入图片描述
2、打开menu中的新的test.c文件,查看更新后的exec函数,可以发现exec函数就是一个简单的程序,并且在子进程中执行了hello
在这里插入图片描述在这里插入图片描述

3、再次打开一个终端界面,进行gdb调试
输入以下指令:

cd LinuxKernel
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s

在这里插入图片描述
4、再次打开一个终端界面,进行gdb调试
输入以下指令:

cd LinuxKernel
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s

在这里插入图片描述5、查看hello(ELF文件)的头部信息
输入以下命令,查看hello文件的头部信息:

readelf -h hello

在这里插入图片描述

二、ELF目标文件格式

(一)定义

   ELF (Executable and Linkable Format)即可执行的和可链接的格式,是一个目标文件格式的标准。ELF格式的文件用于存储Linux程序。ELF是一种对象文件的格式,用于定义不同类型的对象文件中都有什么内容、以什么样的格式放这些内容。ELF首部会描绘整个文件的组织结构,它还包括很多节(sections, 是在ELF文件里用以装载内容数据的最小容器),这些节有些是系统定义好的,有些是用户在文件中通过.section命令自定义的,链接器会将多个输入目标文件中相同的节合并。

(二)文件类型

ELF文件的3种类型:可重定位文件、可执行文件、共享目标文件

1.可重定位文件:这种一般是中间文件,还需要继续处理。由汇编器和编译器创建,一个源代码文件会生成一个可重定位文件。文件中保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件、静态库文件或者共享目标文件(即动态库文件)。
2.可执行文件:一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析(除了运行时解析的共享库符号)的文件,文件中保存着一个用来执行的程序。
3.共享目标文件:共享库,是指可以被可执行文件或其他库文件使用的目标文件,例如标准C的库文件libc.so。可以简单理解为没有主函数main的“可执行”文件,只有一堆函数可供其他可执行文件调用。

(三)程序装载中fork与execve的区别和联系
1.他们都是比较特殊的系统调用
2.fork在陷入内核态后有两次返回,第一次返回到原来父进程的位置继续向下执行,第二次是在子进程返回,这次会返回到ret_from_fork,之后正常返回用户态。
3.execve在执行时陷入内核态,在内核中调用execve加载的可执行文件把当前进程的可执行程序给覆盖了,当其返回时,返回的已经不是原来的那个可执行程序了,而是新的程序,返回的是新的可执行程序执行的起点,即main函数的大致位置(一般地址为0x8048xxx,由编译器设定)。
ELF可执行文件总是被映射到0x8048000这个地址。

三、总结

程序是以可执行文件的形式放到磁盘上的,可执行文件既包括执行函数的目标代码,也包括这些函数所使用的数据。当装入一个程序的时候,用户可以提供影响程序执行方式的环境变量和命令行参数两种信息。
当execve()终止时,系统调用的代码不复存在,要执行的新成效已经被映射到进程的地址空间。这样程序就可以成功运行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值