QEMU学习之路(8)— ARM32通过u-boot 启动Linux
一、前言
参考文章:
Linux内核学习——内核的编译和启动
Linux 内核的编译和模拟执行
Linux内核运行——根文件系统
Linux 内核学习——使用 uboot 加载内核
二、构建Linux内核
1、获取Linux源码
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git -b v5.4 linux-5.4
2、配置内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig
3、编译内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j $(nproc)
编译出的 kernel image 位于 arch/arm/boot/zImage
三、构建busybox
1、获取busybox 源码
wget https://busybox.net/downloads/busybox-1.32.0.tar.bz2
解压,进入源码目录
tar xvf busybox-1.32.0.tar.bz2
cd busybox-1.32.0
2、配置静态编译
使用如下命令进入配置界面
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
使用以下选项,选择静态方式编译busybox,目的是将程序的所有依赖库直接打包进二进制文件,避免了Linux系统运行时依赖动态库。
Settings --->
[*] Build static binary (no shared libs)
3、编译busybox
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j $(nproc)
4、安装
使用如下命令会将busybox默认安装到_install
目录下
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install
四、构建根文件目录
创建一个sdcard.img
镜像,初始化为ext4格式
dd if=/dev/zero of=sdcard.img bs=1M count=16
mkfs.ext4 sdcard.img
把镜像挂载在rootfs
目录下
mkdir rootfs
sudo mount -t ext4 sdcard.img rootfs/ -o loop
将busybox文件复制到rootfs目录下
sudo cp -r busybox-1.32.0/_install/* rootfs/
进入rootfs
目录,新建如下文件夹
cd rootfs
sudo mkdir etc proc sys dev var boot
设置启动有关的配置脚本,将busybox 目录下启动的脚本直接拷贝过来
sudo cp -rf ../busybox-1.32.0/examples/bootfloppy/etc/* ./etc/
修改etc/fstab
文件内容如下所示
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /var tmpfs defaults 0 0
修改etc/init.d/rcS
文件内容如下所示
#! /bin/sh
/bin/mount -a
/sbin/mdev -s
fstab 文件中的内容指定系统启动时需要挂载的文件系统以及挂载的选项,
rcS 文件是启动脚本,其中的 /bin/mount -a 表示挂载 fstab 中指定的文件系统,/sbin/mdev -s 则负责在Linux系统启动时自动检测和管理设备
回到镜像目录,将Image
和dtb
文件拷贝到rootfs文件夹下
cd ../
sudo cp linux-5.4/arch/arm/boot/zImage rootfs/boot/
sudo cp linux-5.4/arch/arm/boot/dts/vexpress-v2p-ca9.dtb rootfs/boot/
取消镜像挂载
sudo umount rootfs
五、构建U-Boot
1、获取uboot源码
git clone https://gitee.com/mirrors/u-boot.git -b v2020.10 u-boot_2020.10
2、配置编译选项
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_ca9x4_defconfig
3、编译uboot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j $(nproc)
六、启动测试
使用如下命令启动
qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot_2020.10/u-boot -sd ./sdcard.img -nographic -no-reboot
启动界面如下
在u-boot命令行输入如下命令,将Image和dtb加载到内存中
load mmc 0:0 0x66000000 boot/zImage
load mmc 0:0 0x66500000 boot/vexpress-v2p-ca9.dtb
设置启动参数如下
setenv bootargs "root=/dev/mmcblk0 rw console=ttyAMA0,115200 init=/linuxrc"
使用如下命令启动
bootz 0x66000000 - 0x66500000
启动界面如下所示