本文将针对AArch64平台进行linux内核编译,并使用qemu虚拟机运行linux内核1。
工具链准备
为了编译linux内核,需要准备相关的构建工具链,我们要编译AArch64平台的,所以需要安装aarch64-linux-gnu-
编译工具链
1 | sudo apt install gcc-aarch64-linux-gnu |
编译busybox(根文件系统)
busybox是一个广泛应用于嵌入式linux的工具箱,集成了一些很常用的linux命令,我们首先需要编译一个busybox做准备,然后作为rootfs进行加载,从而使用户迅速方便地构建相对完整、功能丰富的文件系统。点击此处下载对应busybox版本,下载解压后,进入对应的目录下,然后执行如下指令
1 | mkdir build |
在弹出的配置菜单中,在[settings]里修改如下配置:
1 | [*] Don't use /usr |
运行如下命令:
1 | make O=build # -j16 |
进入build/_install
目录下,该目录结构为:
1 | tree -L 1 . |
创建一些空的目录作为rootfs
中的目录
1 | mkdir -pv {etc,proc,sys,usr/{bin,sbin}} |
创建一个init文件并执行chmod +x init
,该文件将会在系统启动后执行:
1 | !/bin/sh |
此时build/_install
目录如下:
1 | tree -L 1 . |
将上述目录与文件进行打包:
1 | find . -print0 | cpio --null -ov --format=newc | gzip > ../initramfs.cpio.gz |
生成的cpio映像位于build目录下,实际就是将initramfs打包成了cpio格式的压缩包。
编译最小配置的linux内核
在kernel下载适当版本的内核源码并解压,然后执行如下命令:
1 | cd linux-5.10.127 # 这里选择长期支持版本的5.10内核 |
这会首先初始化一个最小的配置(allnoconfig
),然后打开配置菜单。在配置菜单中做以下修改:
1 | -> General setup |
完成后保存并退出,再运行:
1 | make O=build ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- # -j16 |
编译完成后有两个东西比较有用,一个是build/vmlinux
,ELF格式的内核,可以在GDB中加载调试信息。另一个是build/arch/arm64/boot/Image
,是可以加载的内核镜像文件。
qemu启动
在ubuntu上执行如下命令安装对应架构的qemu
1 | apt install qemu-system-arm |
创建一个qemu
文件夹,将上面编译好的Image
和initramfs.cpio.gz
拷贝到qemu
文件夹下,然后执行如下脚本:
1 | qemu-system-aarch64 \ |
系统启动非常快,用了不到1秒中
1 | Booting Linux on physical CPU 0x0000000000 [0x410fd083] |
启动后可以看到位于我们打包的busybox文件夹下:
1 | / # ls |
可以执行一些简单的命令:
1 | / # top |
使用ctrl a + x
可以关闭qemu