文章目录
- 前言
- 一、实验平台介绍
- 二、安装步骤
- 2.1 安装工具
- 2.2 下载仓库
- 2.3 编译内核并制作根文件系统
- 2.4 运行刚才编译好的ARM64版本的Debian系统
- 2.5 在线安装软件包
- 2.6 在QEMU虚拟机和主机之间共享文件
- 三、单步调试ARM64 Linux内核
- 参考资料
前言
最近翻阅笨叔的《奔跑吧Linux内核》卷2,发现了一个非常好用的ARM64的实验平台,这里对部署流程做一个记录。
一、实验平台介绍
该平台使用Debian的根文件系统构造了一个小巧且好用的实验平台,可以在线安装丰富的软件包,如Kdump、Crash、SystemTap等,这个平台具有如下特点:
- 使用“O0"来编译内核。
- 在主机中编译内核。
- 使用QEMU来加载系统。
- 使用GDB单步调试内核和Debian系统。
- 使用ARM64版本的Debian系统的根文件系统。
- 在线安装Debian软件包。
- 支持在虚拟机里动态编译内核模块。
- 支持主机和虚拟机共享文件。
二、安装步骤
2.1 安装工具
首先,在Linux主机中安装如下工具。
sudo apt-get install qemu libncurses5-dev gcc-aarch64-linux-gnu build-essential git bison flex libssl-dev qemu-system-arm
安装完成之后,检查qemu版本。
qemu-system-aarch64 --version
QEMU emulator version 8.0.2
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
2.2 下载仓库
从Github下载runninglinuxkernel_5.0仓库并切换到rlk_5.0分支
git clone https://github.com/figozhang/runninglinuxkernel_5.0.git
cd runninglinuxkernel_5.0/
git checkout rlk_5.0
2.3 编译内核并制作根文件系统
./run_debian_arm64.sh build_kernel
sudo ./run_debian_arm64.sh build_rootfs
编译内核,制作根文件系统的流程比较繁琐,这里仓库中提供了一个脚本简化了上述流程。
2.4 运行刚才编译好的ARM64版本的Debian系统
sudo ./run_debian_arm64.sh run
最后,登录Debian系统。
- 用户名:root或者benshushu
- 密码:123
2.5 在线安装软件包
QEMU虚拟机可以通过Virtio-net技术来生成虚拟网卡,通过NAT技术和主机进行网络共享。
benshushu:~# ifconfig
enp0s1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::c86e:28c4:625b:2767 prefixlen 64 scopeid 0x20<link>
inet6 fec0::ce16:adb:3e70:3e71 prefixlen 64 scopeid 0x40<site>
ether 52:54:00:12:34:56 txqueuelen 1000 (Ethernet)
RX packets 18 bytes 2772 (2.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 44 bytes 5967 (5.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 2 bytes 78 (78.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2 bytes 78 (78.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到生成了一个名为enp0s1的网卡设备,分配的IP地址为10.0.2.15(此IP地址知识NAT内部的一个IP地址)
2.6 在QEMU虚拟机和主机之间共享文件
在QEMU虚拟机和主机之间可以通过NET_9P技术进行文件共享,这需要QEMU虚拟机和主机的Linux内核都能使能NET_9P的内核模块,该实验平台已经支持主机和QEMU虚拟机共享文件,可以通过如下简单的方法来测试。
cp test.c runninglinuxkernel_5.0/kmodules
启动QEMU虚拟机后,检查/mnt目录下是否有test.c文件。
root@benshushu:/# ls /mnt
README test.c
三、单步调试ARM64 Linux内核
在Ubuntu 20.04上安装gdb-multiarch,该版本支持多种不同的处理器架构。
sudo apt install gdb-multiarch
sudo ./run_debian_arm64.sh run debug
$ cd runninglinuxkernel_5.0
$ gdb-multiarch --tui vmlinux
(gdb) set architecture aarch64 // 设置aarch64架构
(gdb) target remote localhost:1234 // 通过1234端口远程连接到QEMU虚拟机
(gdb) b start_kernel // 在内核start_kernel 处设置断点