Linux 内核如何装载和启动一个可执行程
一、实验过程
使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve
cd LinuxKernel
rm menu -rf //将menu目录删除
git clone http://github.com/mengning/menu.git //利用git命令克隆一个新的menu目录
cd menu
mv test_exec.c test.c //用test_exec.c覆盖test.c
make rootfs //重新编译
可以看到test.c中增加了exec函数,执行exec指令,显示如下:
返回LinuxKernel目录下,使用qemu命令冻结系统执行,进行调试
cd ..
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
水平分割一个窗口,启动gdb加载内核,连接到target 1234,并添加断点在sys_execve和load_elf_binary和start_thread处:
gdb
(gdb) file linux-3.18.6/vmlinux
(gdb) target remote:1234
b sys_execve
b load_elf_binary
b start_thread
继续执行
第三个断点start_thread处,可以看到修改了eip的值
二、实验理解
ELF的主要作用是作为一种可执行文件格式,用于存储程序的二进制代码、数据和其他相关信息,以便操作系统能够正确加载和执行这些程序。具体而言,ELF的作用包括:
-
可执行文件格式: ELF定义了可执行文件的结构,包括头部、节表和节区,以及与程序执行相关的信息。这使得操作系统能够理解和执行不同类型的程序。
-
共享库支持: ELF支持共享库,允许多个程序共享同一份库代码。这提高了系统资源的利用率,减小了可执行文件的大小,并简化了软件更新和维护过程。
-
动态链接: ELF支持动态链接,允许程序在运行时动态加载和链接共享库,而不是在编译时静态链接。这提高了灵活性,并允许共享库的更新和替换,而无需重新编译整个程序。
-
符号表: ELF文件包含符号表,记录了程序中使用的变量、函数等符号的信息。这对于调试和符号解析非常重要。
总体而言,ELF提供了一个灵活、可扩展且跨平台的文件格式,使得在Linux系统上运行的程序能够有效地利用系统资源,并与其他程序和库协同工作。
三、实验总结
本周主要学习了编译链接的过程和ELF可执行文件格式,对Linux内核装载和启动一个可执行程序。