2020-2021-1 20209310 《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
  1. 制作根文件系统
    代码如下:
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
  1. 对内核进行跟踪调试,重新配置编译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函数:

posted @ 2020-11-01 22:57  我只是飞  阅读(83)  评论(0编辑  收藏  举报