第四章内核编译和调试

实验4-1:通过QEMU调试ARM64 Linux内核

1.实验目的

熟悉如何使用 QEMU 调试 Linux 内核。
本实验调试 ARM64 的处理器。
2.实验步骤

 (一)在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命令来调试内核

 

实验 4-3:添加swap分区
1.实验目的
 熟悉如何在QEMU中添加文件系统的支持
在树莓派OpenEuler中创建一个64MB的镜像(image)。
修改run_debian_arm64.sh文件,增加一个虚拟硬盘

 随后运行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命令来验证即可

 

posted @ 2022-01-13 10:01  张灯结彩,潇潇暮雨  阅读(169)  评论(0编辑  收藏  举报