第四章内核编译和调试
实验4-1:通过QEMU调试ARM64 Linux内核
1.实验目的
(一)在Linux主机上确保安装了aarch64-linux-gnu-gcc 和 QEMU 工具包
查看aarch64-linux-gnu-gcc版本
aarch64-linux-gnu-gcc -v
以下内容在Ubuntu系统下安装64bit的交叉编译工具
查看哪些版本可以安装
sudo apt-cache search aarch64
安装一个gcc开头的10版本的支持64bit ARM linux的交叉编译工具;
sudo apt-get install gcc-5-aarch64-linux-gnu
然后再安装一个没有版本号的gcc-aarch64-linux-gnu;
sudo apt-get install gcc-aarch64-linux-gnu
以上步骤是安装支持ARM64位系统的交叉编译工具,
安装之后,用aarch64-linux-gnu-gcc -v可以查看里边的版本信息,里边有host是什么,target是什么。
随后安装qemu:
sudo dnf install qemu
具体操作参照链接:https://blog.csdn.net/liucw900716/article/details/105291594
(二)调试阶段
下载linux内核(本实验使用编译的内核是Linux2.6 30)
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.tar.bz2
tar –jxvf linux2.6.30.tar.bz2 cdlinux-2.6.30
下面我们需要编译自己的内核,产生image文件bzImage和内核ELF文件vmlinux
make menuconfig make
编译后会在./arch/x86/boot/ 下生成bzImage文件:
注:编译时间很长,由于我没有对内核进行裁剪,以后编译时可以参考:
http://lamp.linux.gov.cn/Linux/kernel_options.html来对配置文件进行裁剪,对不需要的模块要进行裁剪,可以采用先剪裁几个模块后进行编译,没有错误后再进行裁剪编译,最大程度上上保持内核配置的正确性,在这方面必须要加强,不能拿来个内核全都编译,这样时间和空间都是种浪费。
运行qemu,启动调试模式
qemu –S–kernel arch/x86/boot/bzImage –had ubuntu9.10_32.img –append “root=dev/had”
系统跳出一个黑显示界面,无任何内容,此时通过ctrl+alt+1与ctrl+alt+2可以切换,ctrl+alt+2是qemu控制台,ctrl+alt+1是屏幕输出。
现在我切换到qemu控制台(ctrl+alt+2)
(qemu)gdbserver 1234
此时需要另打开一个终端,进入linux2.6.30源码目录下:
gdbvmlinux (gdb)target remote localhost:1234
(三)调试编译
这时就可以正常使用gdb编译内核了
设置断点break start_kernel,停在linux内核的第一个c程序之上:
首先编译一个c程序
启动GDB开始接管Linux内核的运行
在断点处暂停,并使用GDB命令来调试内核
![](https://img2022.cnblogs.com/blog/1812780/202201/1812780-20220122191129135-57692950.png)
![](https://img2022.cnblogs.com/blog/1812780/202201/1812780-20220122191610701-621978242.png)
随后运行run_debian_arm64.sh脚本即可进入系统。
遇到的问题及解决办法
在运行的过程可能会出现kernel panic的问题,这个是因为系统没有找到rootfs,在vda磁盘里没有找找到ext4的根文件系统。
我查找了一部分网站,找到的解决办法是:修改kernel command line,把“root=/dev/vda”改成“root=/dev/vdb”。再根据实际情况来调整上述command line。
成功进入系统之后可以通过“fdisk -l”命令可以查看磁盘情况。
需要格式化vda磁盘,用于swap分区。最后使用free命令来验证即可