码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2016-04-09 18:55:23      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

实验目的:

使用gdb跟踪sys_execve内核函数的处理过程,分析exec*函数对应的系统调用处理过程,理解Linux内核如何装载和启动一个可执行程序。

实验步骤:

打开实验楼中的虚拟机,在shell中依次运行以下命令,获取本次实验的代码,并编译运行

cd LinuxKernel

rm menu -rf

git clone https://github.com/mengning/menu.git

cd menu

mv test_exec.c test.c

make rootfs 

代码前停下以便调试:

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 

接下来,我们就可以水平分割一个新的shell窗口出来,依次使用下面的命令启动gdb调试

gdb

(gdb) file linux-3.18.6/vmlinux

(gdb) target remote:1234

并在系统调用sys_execve的入口处设置断点

(gdb) b sys_execve

继续运行程序,在QEMU窗口中输入exec,系统就会停在上面设置的断点处

可以通过设置以下断点

b load_elf_binary

b start_thread

实验截图:

技术分享

技术分享

实验总结:

调用execve()系统调用之后,再调用内核的入口sys_execve()。

当do_execve()读取了这128个字节的文件头部之后,然后调用search_binary_handle()去搜索和匹配合适的可执行文件装载处理过程。

 

当linux内核或程序(例如shell)用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。

当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。

exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。



 

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

标签:

原文地址:http://www.cnblogs.com/kryst4l/p/5372200.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!