第七周linux学习

《Linux内核分析》

一、可执行程序是怎么得来的?

编译器预处理(负责把include的文件包含进来及宏替换等工作);编译成汇编代码;编译器编译成目标代码;再链接成可执行文件;操作系统加载到内存中来执行

hello.o和hello文件都是ELF格式的

二、目标文件的格式(ELF可执行可链接)

ABI(应用程序二进制接口)

可重定位主要是.o文件
可执行文件加载的主要工作:可执行文件的格式和进程地址空间的映射。
三、ELF文件默认加载到0x8048000;程序的实际入口是头文件里面的那个地址位置0x8048x00(可执行文件加载到内存中执行的第一句代码);一般静态链接会将所有代码放在一个代码段,动态链接会有多个代码段。
四、可执行程序的执行环境
$ ls -l /usr/bin 列出/usr/bin下的目录信息
Shell本身不限制命令行参数的个数,命令行参数的个数受限于命令自身
例如,int main(int argc, char argv[])
又如, int main(int argc, char 
argv[], char envp[])
Shell会调用execve将命令行参数和环境参数传递给可执行程序的main函数
int execve(const char 
filename,char * const argv[ ],char * const envp[ ]);
命令行参数和环境串都放在用户态堆栈中,先函数调用参数传递,再系统调用参数传递。
五、动态链接分为可执行程序装载是动态链接和运行时动态链接
gcc -shared shlibexample.c -o libshlibexample.so -m32

-L:库对应的接口头文件所在的目录
-l:库名
-ldl:动态加载器
六、子进程是从ret-from-fork开始执行然后返回用户态。
七、当系统调用进入内核中后调用sye-execve,解析可执行文件的格式。之后的调用顺序为:do-execve、do-execve-commom、exex-binprm。Search-binary-handle寻找符合文件格式对应的解析模块(根据文件头部信息)。
八、对于ELF格式的可执行文件fmt->load-binary(bprm),执行的应该是load-elf-binary,其内部是和ELF文件格式解析的部分需要和ELF文件格式标准结合起来阅读。
九、Elf-format和inint-elf-binfmt是观察者模式中的观察者,解析模块是被观察者
十、Load-elf-binary->start-thread,系统调用返回用户态的起点,通过修改内核堆栈中EIP的值作为新程序的起点(int 0x80)。命令行参数和环境变量在栈顶。

十一、总结:在Linux中多进程、多用户、虚拟存储的操作系统出现以后,可执行文件的装载过程变得非常复杂。引入了进程的虚拟地址空间;然后根据操作系统如何为程序的代码、数据、堆、栈在进程地址空间中分配,它们是如何分布的;最后以页映射的方式将程序映射进程虚拟地址空间。 
      动态链接是一种与静态链接程序不同的概念,即一个单一的可执行文件模块被拆分成若干个模块,在程序运行时进行链接的一种方式。然后根据实际例子do_exece()分析了ELF装载的大致过程,中间实现了动态链接。

时间: 2024-08-03 20:28:17

第七周linux学习的相关文章

第七周Java学习总结

第七周Java学习总结: 代码截图: 数据库中遇到的问题: 在下载完MySQL后,解压压缩包,再打开command+r的cmd.exe后使用mysql-5.7.21-winx64\binmysql --initialize-insecure后,出现拒绝访问的情况,在仔细核对后解决了权限的问题. 之后下载xammp,使用老师给的链接发现下载错误,而在百度搜索下载是只有32位,不过下载下来之后并不影响操作. 学习内容 1.MySQL数据库管理系统. 2.链接MySQL数据库. 3.查询操作 4.更新

第七周的学习进度条

  第七周 所花时间(包括上课) 14小时(上课4小时,团队会议3,写博客3,个人任务与编程4)                                                                         代码量(行) 200 博客量(篇) 3 了解到的知识 •用户最需要的东西他们自己往往表达不出来,于是软件团队理解并做出来的东西用户往往不满意,这就是说,我们应该极大注重用户的需求. •用户调研可以帮助我们知道用户的需求,并且方法多种多样,各有优缺点.

第七周linux内核分析

可执行程序的装载 作者 黎静+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 可执行程序是怎么来的 目标文件的格式ELF 静态链接的ELF可执行文件和进程的地址空间 程序的入口 :Entry point address:0x8048300 一般静态链接会将所有代码放在一个代码段 动态链接的进程会有多个代码段 装载可执行程序之前的工作 可执行程序的执行环境 shell命令行.main

第七周 linux如何装载和启动一个可执行文件

潘恒 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验内容 1.预处理.编译和链接 实践 ELF头部在文件的开始,描述文件的总体格式,保存了路线图,描述该文件的组织情况,即生成该文件系统的字的大小和字节顺序 段头部表用来描述ELF可执行文件与连续的存储段之间的映射关系.节头表包含了描述文件节区的信息,每个节区在表中都有一个项,给出节区的名称.节区大小这类心里.用于链接的目标文件(

201521123105 第七周Java学习总结

1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 以下是ArrayList的contains源代码: public boolean contains(Object o) {return indexOf(o) >= 0;}public int indexOf(Object o) {if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)r

第五周linux学习笔记

第五章 系统调用 5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层.该层主要作用有三个. 它为用户空间提供了一种硬件的抽象接口. 系统调用保 证了系统的毡定和安全. 在第 3 章中曾经提到过,每个进程都运行在虚拟系统中,而在用户空间和系统的其余部分提供这样一层公共接口,也是出于这种考虑. 在 Linux 中,系统调用是用户空间访问 内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 5.2 API, POSIX 和 C 库 应用程序通过在用户空间实现的应用编程接口

第六、七周学习进度表

周数 专业学习目标 专业学习时间 代码量 博客发表量 人文方面的学习 知识技能总结    第六周   继续HTML学习       5h    100行         1  做简单的网页   好好学习,天天向上   第七周 继续学习数据结构       5h    100行       1  阅读课外书      继续努力

学习进度条(第七周)

第七周的学习进度条   第七周 所花时间 1700分钟 代码量 3200行 博客量 2篇 了解知识点 一个简单的web管理系统的建立,四则运算的web应用.大数据的学习

Linux 第七周实验 及总结

姬梦馨 原创作品 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linux内核如何装载和启动一个可执行程序 一:1.可执行程序如何产生的? linux系统中,可执行程序一般要经过预处理.编译.汇编.链接.执行等步骤. 编译过程 预处理:gcc –E hello.c –o hello.i; gcc –E调用cpp 生成中间文件 编 译:gcc –S hello.i –o hello.s; gcc –S调