2020-2021-1 202029325 《Linux内核原理与分析》第四周作业

跟踪分析Linux内核的启动过程

下面的实验步骤是在自己的虚拟机中做的。

1.下载内核源码

代码如下:

mkdir LinuxKernel
cd LinuxKernel
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6.tar
cd linux-3.18.6


将compiler-gcc5.h复制重命名为compiler-gcc9.h后放入该文件夹中

make i386_defcongig
make

2.制作根文件系统

代码如下:

mkdir rootfs
git clone https://github.com/mengning/menu.git
cd menu
gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd ../rootfs
cp ../menu/init ./
find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img

3.启动linux内核和Mennuos

自己环境中没有安装qemu,使用代码安装:
sudo apt-get install qemu
安装后,仍然发现没找不到qemu,查阅资料后找到问题可能是qemu版本问题,重新安装qemu,问题解决:
sudo apt-get install qemu-system-i386

然后使用图形化界面的虚拟机启动

cd LinuxKernel/
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu


重新配置编译Linux内核

make menuconfig
make

4.使用gdb跟踪调试Linux内核的启动过程

在配置好的qemu中启动内核使用如下命令:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
使用gdb跟踪调试内核是使用-S,-s两个参数,-s是在1234端口上创建了一个gdb-server,可以打开另一个窗口把带有符号表的内核镜像加载进来,然后连接gdb server,设置断点进行跟踪。
打开另一个串口使用gdb,使用如下命令:

file linux-3.18.6/vmlinux
target remote:1234
break start_kernel

加载内核并通过端口1234进行调试,在内核开始的start_kernel函数入口处设置断点,如下图:

找到内核启动的起点start_kernel函数所在的main.c,观察start_kernel函数中的init_task变量,相当于之前分析mykernel时的第一个PCB,另外rest_init,内核启动完成后,有一个call_cpu_idle,当系统没有进程需要执行时就调用idle进程,rest_init是0号进程,它创建了1号进程init和其他的一些服务进程。断点rest_init如下图所示:

下面演示gdb跟踪过程(直到运行到rest_init):







posted @ 2020-11-01 20:44  20209325葛耀东  阅读(50)  评论(0编辑  收藏  举报