姓名:倪群
学号:SA12226209
班级:嵌入式一班
实验题目:进程的创建与可执行程序的加载
实验环境:ubuntu12.04
gcc编译工具链 Geany
实验内容:
fork()和exec()函数(这里代指exec函数族)的作用分别是为当前父进程生成一个子进程以及在执行一个新进程以替换当前进程执行内容和上下文环境。
其中fork()函数会通过创建一系列子进程需要的数据结构(包括task_struct),并根据参数设置,初始化各个数据结构的内容,函数返回时,子进程返回0,父进程返回子进程的PID,之后父进程继续执行原代码,子进程会在合适的时机开始运行,并也运行父进程的代码。
exec()函数会首先确认系统可以解析并执行这个可执行程序,如果格式可识别,则按照格式对应解析函数进行执行。如果是ELF文件(Linux系统中常见的可执行程序格式),则执行过程中,会根据文件的段头部表,依次对程序以及动态链接程序的代码段、数据段进行内存映射,并修改内核态堆栈中eip、esp寄存器的值,使其分别指向程序的入口点以及新的用户态堆栈顶。
在动态链接的程序运行时,会在其加载过程中,针对各个链接的数据(GOT表中)、函数(PLT表、GOT表中)的表项信息进行链接数据与函数的内存映射,并对GOT表中的内容进行重定位,确定其最终绝对地址,之后便将链接器跳转到.text代码正文,开始正常执行程序。
附录1.fork()函数与exec()函数运行示例。
fork函数的作用是在程序运行中创建出当前运行的进程的子进程,而exec函