目录
一、搭建 QEMU 环境
(1)安装 Ubuntu20.04:
在此略过
(2)安装 QEMU :
sudo apt update
sudo apt-get install qemu-system
(3)安装交叉编译工具:
# 此工具用来编译生成 arm32 可执行程序
sudo apt-get install gcc-arm-linux-gnueabi
(4)安装需要的依赖库:
sudo apt-get install flex bison bc cpio
二、编译&运行 uboot
2.1 编译 uboot 源码:
(a)下载 uboot 源码:
wget https://ftp.denx.de/pub/u-boot/u-boot-2022.10.tar.bz2
(b)解压 uboot 源码: tar -jxvf u-boot-2022.10.tar.bz2
(c)进入 uboot 目录: cd u-boot-2022.10
(d)清理 生成 的文件: make clean
(e)编译 uboot 配置: 在弹出的窗口中直接 Save ---> Exit
make vexpress_ca9x4_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
(f)编译 uboot 程序:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j6
2.2 测试 uboot 程序:
qemu-system-arm -M vexpress-a9 -kernel u-boot --nographic
运行结果如下:
三、编译&运行 Kernel
3.1 编译 kernel 源码:
(a)下载 kernel 源码:
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.8.tar.gz
(b)解压 kernel 源码: tar -zxvf linux-4.8.tar.gz -C kernel
(c)进入 kernel 目录: cd kernel
(d)清理 生成 的文件 : make distclean
(e)使用已有开发板的配置:
rm -f ./.config
cp arch/arm/configs/vexpress_defconfig ./.config
(f)编译配置界面
make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
在弹出的窗口中直接 Save ---> Exit 不作任何修改、直接退出
(g)编译内核
make zImage ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j6
生成位置:arch/arm/boot/zImage
(h)编译设备树
make dtbs ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j6
生成位置:arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb
3.2 测试 kernel 内核:
# 1.复制生成的文件到 kernel 根目录
cp arch/arm/boot/zImage ./
cp arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb ./
# 2.进入kernel上级目录
cd ../ # 进入上级目录
# 3.执行测试,加载内核
qemu-system-arm \
-M vexpress-a9 \ # -M 指定开发板
-m 512M \ # -m 指定内存大小
-kernel kernel/zImage \ # -kernel 指定内核文件
-dtb kernel/vexpress-v2p-ca9.dtb \ # -dtb 指定设备树dtb文件
-append "console=ttyAMA0" \ # -append 扩展显示界面,串口或者LCD,告诉内核串口设备是哪个tty
-nographic # -nographic 不需要图形界面
运行结果如下:
输出的内容太长,中间部分省略 。。。。。。
四、编译&运行 Busybox
4.1 编译 busybox 源码:
(a)下载 busybox 源码:
wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2
(b)解压 busybox 源码 : tar -jxvf busybox-1.36.0.tar.bz2
(c)进入 busybox 目录 : cd busybox-1.36.0
(d)清理 生成的中间文件: make clean
(e)编译配置界面:Settings ---> [*] Build static binary (no shared libs)
make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
(f)编译 busybox (生成静态依赖 可执行文件)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j6
(g)安装 busybox (生成位置:_install)
make install ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
4.2 制作文件系统:
1 进入上级目录:cd ../
2 创建根目录: mkdir rootfs
3 复制文件: cp -rf ./busybox-1.36.0/_install/* ./rootfs
4 创建运行目录:lib mkdir proc sys dev etc etc/init.d
5 复制依赖库: cp -p /usr/arm-linux-gnueabi/lib/* lib
6 生成 rcS 文件:
vi etc/init.d/rcS , 填入以下内容:
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
7 制作 image 文件:
cd rootfs # 进入根目录
find . | cpio -o --format=newc > ../rootfs.img
cd ../ # 进入上级目录
chmod +x rootfs.img
4.3 测试文件系统:
qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel kernel/zImage \
-dtb kernel/vexpress-v2p-ca9.dtb \
-append "root=/dev/ram rdinit=sbin/init console=ttyAMA0 ignore_loglevel" \
-initrd ./rootfs.img \
-nographic
运行结果如下所示: