引言
本文尝试带领观众体验uboot到应用程序执行的过程,了解Linux的基本使用和开发。也许当你跟着博文操作一次,会发现做一个Linux嵌入式镜像也没想象的困难。
QEMU是什么
QEMU是一个开源的虚拟机监视器,它可以模拟多种硬件平台,包括x86、ARM、PowerPC等。QEMU最初是由Fabrice Bellard开发的,目的是为了能够运行Linux在Windows和Mac OS X操作系统下。
Documentation - QEMUhttps://wiki.qemu.org/Documentation
QEMU的好处
- 灵活性:QEMU可以模拟各种计算机硬件,因此可以在同一物理计算机上运行多个虚拟机,并使它们具有不同的硬件配置,包括处理器、内存、网络、存储等。
- 节省成本:使用QEMU运行虚拟机,可以避免购买开发板情况下初步接触Linux,以评估是否购买开发继续学习。
- 节省时间:软件开发很大比例的时间开销都花费在调试上。QEMU的硬件都是虚拟的,一则减少了排查硬件因素花费的时间;二则可以在模拟环境中实时查看内核的运行情况,包括内存映射、中断处理、进程调度等细节,甚至可以让用户实时修改虚拟机中的寄存器值、内存值等。
QEMU使用
安装
# 大家根据实际环境调整,我使用的是阿里云的ubuntu镜像
apt-get install qemu-system
# 测试是否安装成功
qemu-system-x86_64 --version
QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.13)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
# 查看支持的主板方案,这里选用了vexpress-a9
qemu-system-arm -M help
Supported machines are:
...
vexpress-a9 ARM Versatile Express for Cortex-A9
引导uboot(可选)
- 编译
U-Boot(Universal Bootloader)是一种开源的引导加载程序,主要作用是提供初始化系统的启动过程,加载内核镜像,挂载根文件系统并启动操作系统。通常,U-Boot由ROM或Flash芯片上的代码启动,然后加载和执行内核。同时,U-Boot还可以提供各种其他功能,如软件升级、故障排除和系统维护。
# 安装编译中使用到的工具和库
apt-get install build-essential pkg-config zlib1g-dev libglib2.0-0 libglib2.0-dev libsdl1.2-dev libpixman-1-dev libfdt-dev libssl-dev autoconf automake libtool librbd-dev libaio-dev flex bison libncurses5-dev libncursesw5-dev -y
# 安装交叉编译工具
apt-get install gcc-arm-linux-gnueabihf
apt-get install g++-arm-linux-gnueabihf
wget https://ftp.denx.de/pub/u-boot/u-boot-2023.07.tar.bz2
tar -jxvf u-boot-2023.07.tar.bz2
cd u-boot-2023.07/
make vexpress_ca9x4_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make clean && make vexpress_ca9x4_defconfig # 不需要改配置
# 看下cpu核数,使用多线程编译,对应-j参数
cat /proc/cpuinfo
make -j4
# 编译完成目录文件
root@aliyun:~/project/u-boot-2023.07# ls
api board common disk dts fs Kconfig MAINTAINERS post scripts tools u-boot.cfg u-boot-nodtb.bin
arch boot config.mk doc env include lib Makefile py System.map u-boot u-boot.lds u-boot.srec
bin cmd configs drivers examples Kbuild Licenses net README test u-boot.bin u-boot.map u-boot.sym
- 引导启动
# 测试使用QEMU引导uboot启动
root@aliyun:~/project/u-boot-2023.07# qemu-system-arm -M vexpress-a9 -m 256 -kernel ./u-boot -nographic
U-Boot 2023.07-rc6 (Sep 12 2023 - 11:39:37 +0800)
DRAM: 256 MiB
WARNING: Caches not enabled
Core: 18 devices, 10 uclasses, devicetree: embed
Flash: 64 MiB
MMC: mmci@5000: 0
Loading Environment from Flash... *** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: eth0: ethernet@3,02000000
Hit any key to stop autoboot: 0
=>
退出 QEMU:输入
Ctrl + A 后按 X
引导Linux
- 编译
# 下载Linux源码包
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.256.tar.xz
tar -xvf linux-5.4.256.tar.xz
cd linux-5.4.256/
# 根据KConfig生成对应编译配置 .config
make vexpress_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
# 编译内核
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
-
引导
# dtb是设备树文件,这里没有通过uboot拷贝内核到内存,而是通过 NFS 网络下载
# 因为没有挂载根文件系统,执行后会 Kernel panic
qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"
进入shell
- 下载编译busybox
busybox是一个精简的Linux工具箱,包含了许多Linux系统中最基本的命令行工具,如ls、grep、awk、sed等等。它的设计初衷是为了让嵌入式设备和低端设备也能够运行Linux操作系统,因此它具有非常小的体积和高度的兼容性。
# 下载busybox源码
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
# 编译
tar jxvf busybox-1.36.1.tar.bz2
cd busybox-1.36.1/
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make defconfig
# 去除 Setting -> Build static Binary...
make menuconfig
make -j4
- 制作根文件系统
mkdir rootfs
cp _install/* rootfs/ -raf
cd rootfs/ && mkdir -p lib proc sys tmp root var mnt dev && cd -
cp examples/bootfloppy/etc rootfs/ -arf
sed -r "/askfirst/ s/.*/::respawn:-\/bin\/sh/" rootfs/etc/inittab -i
sudo cp -arf /usr/arm-linux-gnueabihf/lib/* rootfs/lib
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
sudo dd if=/dev/zero of=rootfs.ext3 bs=1M count=128
sudo mkfs.ext3 rootfs.ext3
# 文件拷贝到文件系统
sudo mkdir virfs && chmod 777 virfs
sudo mount -t ext3 rootfs.ext3 virfs/ -o loop
sudo cp -r rootfs/* virfs/
sudo umount virfs
cp rootfs.ext ~/~linux-5.4.256/
- 启动rootfs的命令
qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
-
至此,成功登陆命令行终端~