首页 技术 正文
技术 2022年11月6日
0 收藏 997 点赞 376 浏览 1656 个字

Linux内核如何装载和启动一个可执行程序

一、ELF可执行文件格式

  • ELF格式分类:
  可重定位文件:用来和其他object文件一起创建可执行文件和共享文件  可执行文件:指出应该从哪里开始执行  共享文件:主要是.so文件,用来被链接编辑器和动态链接器链接
  (1)对ELF头的描述告诉系统如何创建一个进程的内存映像,section头表包含了描述文件sections的信息。当创建或增加一个进程映像时,理论上它会把程序段拷贝到虚拟内存中某个段  (2)ELF文件的头部规定了许多与二进制兼容性相关的信息。所以在加载ELF文件的时候,必须先加载头部,分析ELF的具体信息  (3)entry代表刚加载过新的可执行文件之后的程序的入口地址,头部后是代码和数据,进程的地址空间是4G,上面的1G是内核用,下面的3G是程序使用。默认的ELF头加载地址是0x8048000
  • 静态链接的ELF可执行文件和进程的地址空间:

1.可执行文件加载到内存

   加载效果:将代码段数据加载到内存中,再把数据加载到内存,默认从0x8048000地址开始加载   启动一个刚加载过可执行文件的进程时,可执行文件加载到内存之后执行的第一条代码地址   一般静态链接会将所有代码放在一个代码段,而动态链接的进程会有多个代码段

2.流程

  (1) 分析头部  (2) 查看是否需要动态链接。如果是静态链接的ELF文件,那么直接加载文件即可。如果是动态链接的可执行文件,那么需要加载的是动态链接器  (3) 装载文件,为其准备进程映像  (4) 为新的代码段设定寄存器以及堆栈信息

二、实验内容

更新menu后用test.c覆盖test_exec.c,然后打开test.c(shitf+G 直接到文件尾的快捷键)

可以看到添加了exec命令,执行一个程序的功能。

其函数内容为

int Exec(int argc, char * argv[])
{
int pid;
/* fork another process */
pid = fork();
if (pid<0)
{
/* error occurred */
fprintf(stderr,"Fork Failed!");
exit(-1);
}
else if (pid==0)
{
/* child process */
execlp("/bin/ls","ls",NULL);
}
else
{
/* parent process */
/* parent will wait for the child to complete*/
wait(NULL);
printf("Child Complete!");
exit(0);
}
}

由于在Makefile中做了修改。编译的时候执行了hello.c

并把init 和 hello 放到了rootfs.img目录下,所以在执行exec命令的时候就相当于自动了加载了hello这个程序

下面是通过gdb进行跟踪分析

设置b sys_execve ,b load_elf_binary 断点

可以先停在sys_execve然后设置其他断点

new_ip是返回到用户态的第一条指令的地址

此时可以通过po new_ip和新窗口的 readelf -h helloc查看入口地址是否一致

可以看到hello的入口地址和new_ip的值都是0x8048d0a 。说明对hello程序链接到了执行程序中。

三、总结

在创建一个新的用户态堆栈的时候,实际上是把命令行参数的内容和环境变量的内容通过指针的方式传递到系统调用的内核处理函数的,内核处理函数在创建一个新的可执行堆栈的时候会将

命令行参数的内容和环境变量的内容拷贝到用户态堆栈里面来初始化新的可执行程序执行的上下文环境,先函数调用参数传递,在系统调用参数传递

shell程序 -> execve -> sys_execve
  • sys_execve的内部处理过程 ( 装载和启动一个可执行程序依次调用以下函数):
sys_execve() -> do_execve() -> do_execve_common() -> exec_binprm() -> search_binary_handler() -> load_elf_binary() -> start_thread()
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,114
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,586
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,432
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,203
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,838
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,924