- 下载内核源码,解压并编译
代码如下:
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
- 制作根文件系统
代码如下:
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
- 对内核进行跟踪调试,重新配置编译Linux内核
输入以下命令:
make menuconfig
出现错误:
把缺少的部分安装上:
sudo apt-get install libncurses5-dev
重新配置编译linux内核:
make menuconfig
make
4.使用gdb跟踪调试linux内核的启动过程
启动内核:
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
- -S:使CPU初始化之前冻结起来
- -s:在1234端口上创建了一个gdb-server,然后可以另开一个窗口,用gdb把带有符号表的内核镜像加载进来,再连接gdb-server,设置断点跟踪内核。
如下图所示,内核被冻结。
再打开一个窗口,启动gdb,把内核加载进来,建立连接,指令如下:
file linux-3.18.6/vmlinux
target remote:1234
在start_kernel处设置断点,指令如下:
break start_kernel
查看start_kernel函数:
在rest_init处设置断点,指令如下:
break rest_init
查看rest_init函数: