郭皓 原创做品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000shell
1.可执行程序是怎么得来的函数
c代码->预处理->汇编代码->汇编器->目标代码->连接成可执行文件->加载到内核执行布局
2.目标文件的格式ELFspa
符号修饰标准、变量内层布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容称为ABI(Application Binary Interface)命令行
常见的ABI格式:3d
3.静态连接的ELF可执行文件和进程的地址空间code
通常静态连接将会把全部代码放在同一个代码段。orm
动态链接的进程会有多个代码段。blog
1.可执行程序的执行环境进程
2.装载时动态连接和运行时动态连接应用举例
1.可执行程序的装载相关关键问题分析
execve与fork是比较特殊的系统调用
execve用它加载的可执行文件把当前的进程覆盖掉,返回以后就不是原来的程序而是新的可执行程序起点
fork函数从ret_ from_fork开始执行而后返回用户态
2.sys_execve内核处理过程
do_execve -> do_execve_common -> exec_binprm
do_execve
do_open_exec(filename)打开要加载的文件
命令行参数,结构体变量copy到bprm结构体中
exce_binprm(bprm),关键代码是寻找能解析当前文件的处理模块
register_binfmt($elf_format)注册这个格式到链表里,而后寻找能处理的模块
ELF可执行文件默认映射到0x8048000这个地址
须要动态连接的可执行文件先加载链接器ld;不然直接把elf文件entry地址赋值给entry便可。
start_thread(regs, elf_entry, bprm->p)会将CPU控制权交给ld来加载依赖库并完成动态连接;对于静态连接的文件elf_entry是新程序执行的起点
3.动态连接的可执行程序的装载
4、实验 Linux内核如何装载和启动一个可执行程序
1.下载新的代码文件
2.运行和gdb跟踪断点