2019-2020-1 20199304《Linux内核原理与分析》第八周作业
第七章 Linux内核如何装载和启动一个可执行程序
一、知识点
1、ELF(Executable and Linkable Format)概述:
- “目标文件”指编译器生成的文件,“目标”指类似x86或x64的目标平台,它决定编译器使用的机器指令集。
- “目标文件”也叫ABI,它和“目标平台”是二进制兼容的。
- 最古老的目标文件格式是a.out,后来发展为COFF格式,现在linux常用的格式为ELF。
- ELF(Executable and Linkable Format)即可执行并可链接的格式,是一个目标文件格式的标准。
- ELF是一种对象文件的格式,用于定义不同类型的对象文件中都有什么内容,以什么样的格式放这些内容。
- ELF在首部会描绘整个文件的组织结构,还包括了很多系统定义的以及用户自定义的节。
2、ELF可执行和可链接文件,其包含了以下三类:
- 可重定位文件(Relocatable File):保存着代码和适当的数据,用来和其它的目标文件一起来创建一个可执行文件、静态库文件或者是一个共享目标文件(主要是.o文件)
- 可执行文件(Executable File):保存着一个用来执行的程序,一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析(除了运行时解析的共享库符号)的文件。
- 共享目标文件(Shared Object File):保存着代码和合适的数据,用来被两个链接器链接。第一个是链接编辑器(静态链接),可以和其它的可重定位和共享目标文件来创建其它的object。第二个是动态链接器,联合一个可执行文件和其它的共享目标文件来创建一个进程映象。
3、ELF文件由4部分组成:
- ELF头(ELF header)
- ELF Header在文件最开描述了该文件的组织情况, 他的其他部分主要说明了其他文件内容的位置、大小等信息。
- 节头表基本定义了整个ELF文件的组成,可以说是整个ELF就是由若干个节(Section)组成的。
- 程序头表(Program header table)
- 段头(Program Header)表示和创建进程相关的,描述了连续的几个节在文件的位置,大小以及它被放进内存后的大小和位置,告诉系统如何创建进程映象,可执行文件加载器就可以按这个说明将可执行文件搬到内存中。
- p_type 当前描述的段类型
- p_offset 段在文件中的偏移
- p_vaddr 段在内存中的虚拟地址
- p_paddr 在物理内存定位相关的系统中,此项为物理地址保留
- p_filesz 段在文件中的长度
- p_memsz 段在内存中的长度
- p_align 确定段在文件及内存中如何对齐
- 节(Section)
- 节头表(Section header table)
- 节头表是由Section Header组成的表,包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称,节区大小这类信息。
- sh_name 节名,是在字符串中的索引
- sh_addr 该节对应的虚拟地址
- sh_offset 该节在文件中的位置
- h_size 该节的大小
- sh_link 与该节连接的其他节
- sh_addralign 对齐方式
- 注:实际上,一个文件中不一定包含全部内容,而且他们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息有ELF头中的各项值来决定。

4、ELF文件的作用:
ELF文件参与程序链接(建立一个程序)和程序的执行(运行一个文件)。
- 如果用于编译和链接(可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。
- 如果用于加载执行(可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。
- 如果是共享文件,则两者都含有。
5、fork和execve区别与联系:
fork():
- 子进程复制父进程的所有进程内存到其内存地址空间中。父、子进程的“数据段”,“堆栈段”和“代码段”完全相同,即子进程中的每一个字节都和父进程一样。
- 子进程的当前工作目录、umask掩码值和父进程相同,fork()之前父进程打开的文件描述符,在子进程中同样打开,并且都指向相同的文件表项。
- 子进程拥有自己的进程ID。
exec():
- 进程调用exec()后,将在同一块进程内存里用一个新程序来代替调用exec()的那个进程,新程序代替当前进程映像,当前进程的“数据段”,“堆栈段”和“代码段”背新程序改写。
- 新程序会保持调用exec()进程的ID不变。
- 调用exec()之前打开打开的描述字继续打开(好像有什么参数可以令打开的描述字在新程序中关闭)
二、实验
1.删除menu目录,克隆一个新的menu目录,然后用test_exec.c将test.c覆盖。
cd LinuxKernel
rm menu -rf
git clone https://github.com/mengning/menu.git

2.用test_exec.c将test.c覆盖,重新编译
mv test_exec.c test.c
make rootfs

3.查看test.c文件,可以看到新增加了exec系统调用。


4.在QEMU中执行exec命令。


5.冻结内核,启动GDB调试。

6.启动gdb,通过端口1234建立连接,在sys_exec、load_elf_binary、start_thread处设置断点。



7.退出调试状态,输入readelf -h hello可以查看hello的EIF头部。

总结
通过本实验,我了解到了ELF文件的类型。并且了解到在Linux中,一个程序的执行是做为一个新的进程,使用execve系统调用完成的。
程序从源代码到可执行文件的步骤:预处理、编译、汇编、衔接--以hello.c为例。
-预处理: gcc -E hello.c -o hello.i -m32
-编译:gcc -S hello.i -o hello.s -m32
-汇编:gcc -c hello.s -o hello.o -m32
-默认衔接(动态库):gcc hello.o -o hello -m32
-衔接静态库:gcc hello.o -o hello.static -m32 -static
2019-2020-1 20199304《Linux内核原理与分析》第八周作业的更多相关文章
- 2019-2020-1 20199329《Linux内核原理与分析》第九周作业
<Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2017-2018-1 20179215《Linux内核原理与分析》第二周作业
20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...
- 2019-2020-1 20209313《Linux内核原理与分析》第二周作业
2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 《Linux内核原理与分析》第一周作业 20189210
实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...
- 2018-2019-1 20189221《Linux内核原理与分析》第二周作业
读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- 学习笔记23_AspMVC项目
*创建AspMVC项目 (1)会自动创建App_Data文件夹,是用户不能访问和下载的.一般用户能访问那些文件夹,可以在IIS中配置. (2)App_Start文件夹,用于放置与程序有关的配置文件. ...
- TCP/IP协议第一卷第一章
1.链路层 链路层有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节.把链路层地址和网络层地址联系起来 ...
- 「2019.7.22 考试」AC和WA0一步之遥
这卷子还是答的挺惨的. 第一题5min写完了,自认为AC(其实WA了80),第二题推了半天CRT的公式老出错结果发现是程序打错了.第三题打模拟150行结果数组没开够,开大就是0->60的转变.状 ...
- 用Vsftpd服务传输文件(铺垫篇)
文件传输协议 文件传输协议(FTP,File Transfer Protocol),即能够让用户在互联网中上传.下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件传输则需要F ...
- 使用springcloud开发测试问题总结
使用springcloud开发测试 如下描述的问题,没有指明是linux部署的,都是在windows开发环境上部署验证发现的. Issue1配置客户端不使用配置中心 问题描述: 配置客户端使用配置中心 ...
- 易初大数据 2019年10月20日 spss习题 王庆超
一.选择题 1.有关spss数据字典的说法,正确的是:D A.SPSS数据集的数据字典可以复制到其他数据集中 B.SPSS数据集的数据字典是不能复制的 C.SPSS的数据字典可以通过“复制”和“黏贴” ...
- php [poolwww] seemsbusy (youmayneedto increasepm.start_servers, or pm.min/max_spare_servers)错误解决方法
php [poolwww] seemsbusy (youmayneedto increasepm.start_servers, or pm.min/max_spare_servers)错误解决方法修改 ...
- JavaScript文档对象模型(DOM)——DOM核心操作
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言(HTML或XML)的标准编程接口. W3C已经定义了一系列DOM接口,通过这些DOM接口可 ...
- 那些年用过的UI开发平台
屈指算来,在我不长也不能算短的职业生涯中,接触了数代 的UI技术: MFC (Microsoft Foundation Class)- Win32上最强大的Class Library,没有之一.VS唯 ...
- Swoole跟thinkphp5结合开发WebSocket在线聊天通讯系统
ThinkPHP使用Swoole需要安装 think-swoole Composer包,前提系统已经安装好了Swoole PECL 拓展* tp5的项目根目录下执行composer命令安装think- ...