Bootstrap

Ubuntu20.04 下基于QEMU 的 ARM 开发

目录

一、搭建 QEMU 环境

二、编译&运行 uboot

2.1 编译 uboot 源码

2.2 测试 uboot 程序

三、编译&运行 kernel

3.1 编译 kernel 源码

3.2 测试 kernel 内核

四、编译&运行 busybox

 4.1 编译 busybox 源码

 4.2 制作文件系统

 4.3 测试文件系统


一、搭建 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

  运行结果如下所示:

;