基于Qemu hobot-sigi-virt平台的bringup

在新增Qemu芯片平台之后,我们就可以基于这个平台进行最小系统的移植适配,从而加快系统软件的开发节奏。随着Qemu里面模拟的外设越来越多,我们BSP里面的很多驱动都可以先在这个芯片平台上完成function逻辑的验证,等验证到一定程度,我们再迁移到FPAG上集中验证一遍,从而大大节省验证的时间代价和成本,因为Qemu里面调试极其方便。


  • Qemu: v7.2.0
  • U-Boot: v2022.04
  • ATF: lts-v2.8.1
  • Linux Kernel: linux-6.1.12
  • aarch64-none-linux-gnu-gcc: 10.3.1 20210621

启动介绍

在运行起来之前,我们先明确最小系统涉及的组件以及它们的启动顺序

  • ATF:提供EL3 runtime service,具有整个硬件系统的全部权限
  • U-Boot:加载和启动不同OS的镜像
  • Xen: Hypervisor OS,支持多个虚拟机的运行
  • Kernel:Linux kernel OS,常用的OS
  • initramfs:最小的文件系统,用作临时跳转
  • Ubuntu Rootfs:根文件系统,存放在存储介质上,里面包含很多应用、库和工具

启动顺序

bootflow1

图1 U-Boot从不同媒介的启动

bootflow2

图2 Linux Kernel的启动

bootflow2

图3 Xen的启动

该平台支持上面三种启动方式,每个人在开发早期根据自己的喜好和开发特点来选择一个启动方法,来加快软件的开发验证效率。

镜像构建

U-Boot构建

1
2
3
4
git clone -b hobot-uboot https://github.com/chasinglulu/u-boot.git
cd u-boot
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- hobot-sigi-virt_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j4

ATF构建

1
2
3
4
5
6
7
8
9
10
git clone -b sigi-atf https://github.com/chasinglulu/arm-trusted-firmware.git
cd arm-trusted-firmware
make PLAT=sigi CROSS_COMPILE=aarch64-none-linux-gnu-

or
make PLAT=sigi CROSS_COMPILE=aarch64-none-linux-gnu- DEBUG=1 #debug

or
make PLAT=sigi CROSS_COMPILE=aarch64-none-linux-gnu- DEBUG=1 LOG_LEVEL=50 #verbose

arm-trusted-firmware/build/sigi/目录下构造出bl31.bin镜像。

Kernel构建

1
2
3
4
git clone -b linux-v6.1-rt https://github.com/chasinglulu/linux.git
cd linux
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- hobot_sigi_tiny_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j64

Initramfs构建

1
2
3
4
git clone https://github.com/chasinglulu/buildroot.git
cd build
make hobot_qemu_defconfig
make

buildroot/output/images目录下产出rootfs.cpio.lz4镜像。

启动验证

仅启动U-Boot

1
qemu-system-aarch64 -M hobot-sigi-virt -m 4G -display none -device loader,addr=0x3000200000,file=/path/to/u-boot/u-boot.bin,cpu-num=0 -serial stdio

uboot

启动U-Boot+Kernel

Imagehobot-sigi-virt.dtbrootfs.cpio.lz4三个镜像先复制到执行qemu-system-aarch64的当前目录$(PWD)下,U-Boot将使用semihosting方式让qemu自动地将这三个镜像加载到hobot-sigi-virt平台模拟的内存中。

1
qemu-system-aarch64 -M hobot-sigi-virt -m 4G -display none -device loader,addr=0x3000200000,file=/path/to/u-boot/u-boot.bin,cpu-num=0 -serial stdio -semihosting

或者直接从eMMC上加载Kernel等镜像

1
qemu-system-aarch64 -M hobot-sigi-virt -m 4G -display none -device loader,addr=0x3000200000,file=/home/charleye/24-Xen/u-boot/u-boot.bin,cpu-num=0 -serial stdio -drive file=/path/to/emmc-aarch64.img,format=raw,if=emmc

kernel
启动日志附件:U-Boot -> Kernel Booting

启动ATF+U-Boot

1
qemu-system-aarch64 -M hobot-sigi-virt,virt=on,secure=on -m 4G -display none -device loader,addr=0x04001000,file=/path/to/arm-trusted-firmware/build/sigi/release/bl31.bin,cpu-num=0 -device loader,addr=0x3004000000,file=/path/to/u-boot/u-boot-dtb.bin -serial stdio

atf

启动ATF+U-Boot+Kernel

Imagehobot-sigi-virt.dtbrootfs.cpio.lz4三个镜像先复制到执行qemu-system-aarch64的当前目录$(PWD)

1
qemu-system-aarch64 -M hobot-sigi-virt,virt=on,secure=on -m 4G -display none -device loader,addr=0x04001000,file=/path/to/arm-trusted-firmware/build/sigi/release/bl31.bin,cpu-num=0 -device loader,addr=0x3004000000,file=/path/to/u-boot/u-boot-dtb.bin -serial stdio -semihosting

或者直接从eMMC上加载Kernel等镜像

1
qemu-system-aarch64 -M hobot-sigi-virt,virt=on,secure=on,emmc=on -m 4G -display none -device loader,addr=0x04001000,file=/path/to/arm-trusted-firmware/build/sigi/release/bl31.bin,cpu-num=0 -device loader,addr=0x3004000000,file=/path/to/u-boot/u-boot-dtb.bin -serial stdio -drive file=/path/to/emmc-aarch64.img,format=raw,if=emmc

atf_kernel

启动日志附件:ATF->U-Boot->kernel Booting