【linux内核装载elf过程简介】
2011-05-26 10:20
741 查看
在用户层,bash进程会调用fork()创建一个新的进程,然后新的进程调用execve系统调用执行指定的elf文件,原先的bash进程等待刚才启动的新进程结束。然后等待用户输入命令。
int execve(const char *filename,char *const argv[],char *const envp[]);
参数分别是被执行的程序文件名,执行参数和环境变量。
glibc对execve进行了包装,提供了execl(),execlp(),execle(),execvp()等不同形式的API,但最终都会调用execve()。
1、进入系统调用后,linux内核开始真正的装载工作。在内核中,系统调用相应的入口是sys_execve(),定义在arch/i386/kernel/process.c。
2、进行一些参数的检查赋值以后就调用do_execve()。首先检查被执行的文件,找到文件就读取128个字节,比对magic number来判断文件的格式(./a.out,elf,脚本等)。
3、do_execve() 调用search_binary_handle()搜索和匹配合适的可执行文件装载处理过程,比如elf的函数是load_elf_binary(),定义在fs/binfmt_elf.c。
a、检查ELF可执行文件的有效性,比如magic number,段的数量。
b、寻找.interp段,设置动态连接器的路径。
c、根据elf可执行文件程序头表的描述,对elf文件进行映射。
d、初始化elf进程环境,比如启动时edx的地址是DT_FINI的地址。
f、将系统调用的返回地址修改为elf可执行文件的入口点,这个入口点取决于程序的链接方式,对于静态链接的elf可执行文件,就是e_entry所存的地址。对于动态链接的elf可执行文件就是链接连接器。
4、执行完毕后,load_elf_binary()返回到do_execve(),再返回到sys_execve()。
5、sys_execve()从内核态返回到用户态,同时返回已经更改的程序入口地址。eip直接跳转到elf程序的入口地址,新进程执行。
int execve(const char *filename,char *const argv[],char *const envp[]);
参数分别是被执行的程序文件名,执行参数和环境变量。
glibc对execve进行了包装,提供了execl(),execlp(),execle(),execvp()等不同形式的API,但最终都会调用execve()。
1、进入系统调用后,linux内核开始真正的装载工作。在内核中,系统调用相应的入口是sys_execve(),定义在arch/i386/kernel/process.c。
2、进行一些参数的检查赋值以后就调用do_execve()。首先检查被执行的文件,找到文件就读取128个字节,比对magic number来判断文件的格式(./a.out,elf,脚本等)。
3、do_execve() 调用search_binary_handle()搜索和匹配合适的可执行文件装载处理过程,比如elf的函数是load_elf_binary(),定义在fs/binfmt_elf.c。
a、检查ELF可执行文件的有效性,比如magic number,段的数量。
b、寻找.interp段,设置动态连接器的路径。
c、根据elf可执行文件程序头表的描述,对elf文件进行映射。
d、初始化elf进程环境,比如启动时edx的地址是DT_FINI的地址。
f、将系统调用的返回地址修改为elf可执行文件的入口点,这个入口点取决于程序的链接方式,对于静态链接的elf可执行文件,就是e_entry所存的地址。对于动态链接的elf可执行文件就是链接连接器。
4、执行完毕后,load_elf_binary()返回到do_execve(),再返回到sys_execve()。
5、sys_execve()从内核态返回到用户态,同时返回已经更改的程序入口地址。eip直接跳转到elf程序的入口地址,新进程执行。
相关文章推荐
- Linux操作系统分析(3)- 内核装载ELF的过程总结
- Linux操作系统分析(3)- 内核装载ELF的过程总结
- Linux操作系统分析(3)- 内核装载ELF的过程总结
- 打造自己的专属linux(四):Linux内核编译过程简介
- Linux计算机进程地址空间与内核装载ELF
- 打造自己的专属linux(四):Linux内核编译过程简介
- 浅析Linux计算机进程地址空间与内核装载ELF
- Linux计算机进程地址空间与内核装载ELF
- 浅析Linux计算机进程地址空间与内核装载ELF
- Linux内核中ELF可执行文件的装载/load_elf_binary()函数解析
- 浅析Linux计算机进程地址空间与内核装载ELF
- linux内核装载elf过程简介
- 通过gdb跟踪Linux内核装载和启动可执行程序过程
- 浅析Linux计算机进程地址空间与内核装载ELF
- 通过gdb跟踪Linux内核装载和启动可执行程序过程
- 经典的文章无论如何也要再次转贴(Linux内核编译过程)
- Linux内核编译过程
- Linux 2.6.19.x 内核编译配置选项简介
- Linux 2.6.19.x 内核编译配置选项简介(五)
- linux的标准内核的编译-----分离编译过程中产生的文件