qemu是用软件模拟硬件解析指令运行的软件,可以模拟arm、arm64、x86等,对于调试linux 内核机制很方便,不用额外购买开发板。由于linux上有对qemu的加速引擎,支持程度更高,且网络上教程居多,所以这里使用virtualbox+ubuntu22虚拟机,在ubuntu上运行qemu进行模拟。
virtualbox安装:Oracle VM VirtualBox
ubuntu镜像下载:Ubuntu系统下载(清华大学开源软件镜像站)(ubuntu-20.04.1-desktop-amd64.iso)_ubuntu下载-CSDN博客
这里直接选择最新版本ubuntu22,ubuntu虚拟机安装,本文不再赘述,请大家自行搜索。
进入ubuntu,安装qemu,因为我们目标架构是arm,所以这里安装qemu-system-arm
sudo apt install qemu-system-arm -y
需要下载编译内核,制作根文件系统。
这里使用较新的内核版本,5.5.18
wget http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.5.18.tar.gz
sudo apt-get install gcc-arm-linux-gnueabi
交叉编译工具链的前缀:arm-linux-gnueabi-
编译5.x的内核,需要安装工具包flex、bison、apt-get install libncurses5-dev
sudo apt-get install libncurses5-dev flex bison -y
编译命令:vexpress配置专门用于qemu仿真。
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm
如果想修改配置使用如下命令,注意要带ARCH=arm,否则默认以x86配置。
make menuconfig ARCH=arm
1)下载busybox:
wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2
2)busybox编译
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm defconfig
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm prefix=${PWD} install
3)copy busybox产物到rootfs临时目录
mkdir -p rootfs/{dev,etc/init.d,lib,proc,sys,/dev/pts,/dev/shm,tmp,run}
cp busybox-1.36.0/_install/* rootfs/ -rf
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/
同时copy的工具链中so到rootfs/lib目录。
1)/etc/inittab
值定init进程执行的启动脚本rcS
::sysinit:/etc/rcS
::askfirst:-/bin/sh
2)内核启动要默认挂载一些调试的fs
如proc、sys、tmp等,这些定义在/etc/fstab,
fstab的解析命令mount -a,需要在rcS中显示调用。
/etc/rcS
# <file system> <mount pt> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620,ptmxmode=0666 0 0
tmpfs /dev/shm tmpfs mode=0777 0 0
tmpfs /tmp tmpfs mode=1777 0 0
tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0
sysfs /sys sysfs defaults 0 0
/etc/rcS:
mount -a
1)生成镜像,128MB即可
qemu-img create -f raw disk.img 128M
2)格式化成ext4
mkfs -t ext4 ./disk.img
3)copy文件到镜像中
mkdir tmpfs
sudo mount -o loop ./disk.img tmpfs/
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs
qemu-system-arm -M vexpress-a9 -m 256M -kernel ./linux-5.5.18/arch/arm/boot/zImage -dtb ./linux-5.5.18/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd disk.img