QEMU启动
准备一个目录qemu_boot
存放所有镜像文件。最终启动需要的镜像如下所示。
Image QEMU_EFI.fd bl1.bin bl2.bin bl31.bin fip.bin flash.bin rootfs.cpio.gz
准备镜像
EDK2
下载QEMU_EFI。
wget http://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/latest/QEMU-KERNEL-AARCH64/RELEASE_GCC5/QEMU_EFI.fd
rootfs
rootfs使用Buildroot编译构建。
git clone git://git.buildroot.net/buildroot.git
cd buildroot
make qemu_aarch64_virt_defconfig
utils/config -e BR2_TARGET_ROOTFS_CPIO
utils/config -e BR2_TARGET_ROOTFS_CPIO_GZIP
make olddefconfig
make
编译得到output/images/rootfs.cpio.gz
。
kernel
kernel构建这里下载linux-5.17.2.tar.xz。
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.17.2.tar.xz
编译kernel,如下
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig
make -j16
编译得到arch/arm64/boot/Image
。
编译ATF
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=qemu all fip DEBUG=1 \
BL33=../qemu_boot/QEMU_EFI.fd \
OPENSSL_DIR=/home/xieli/project/6---ATF/openssl-3.0.8
在build/qemu/debug
会生成bl1.bin
、bl2.bin
、bl31.bin
文件以及固件镜像包fip.bin
。
打包
将bl1.bin和fip.bin存放在一个flash.bin文件中,通过提供给qemu的-bios参数加载。
dd if=bl1.bin of=flash.bin bs=4096 conv=notrunc
dd if=fip.bin of=flash.bin seek=64 bs=4096 conv=notrunc
注意:上面需要设置seek=64的原因是在qemu平台中定义了fip文件的起始地址从0x40000(64*4096)开始。
镜像文件的对应关系如下。
阶段 | 文件 |
---|---|
BL1 | build/qemu/debug/bl1.bin |
BL2 | build/qemu/debug/bl2.bin |
BL31 | build/qemu/debug/bl31.bin |
BL33 | QEMU_EFI.fd |
Kernel | arch/arm64/boot/Image |
Rootfs | output/images/rootfs.cpio.gz |
启动
qemu-system-aarch64 -nographic -machine virt,secure=on \
-cpu cortex-a57 -kernel Image \
-append 'console=ttyAMA0,38400 keep_bootcon' \
-initrd rootfs.cpio.gz -smp 2 -m 1024 -bios flash.bin \
-d unimp
退出qemu,使用Ctrl+A
、然后按X
。
调试
在启动qemu时添加-s –S选项。
qemu-system-aarch64 -nographic -machine virt,secure=on \
-cpu cortex-a57 -kernel Image \
-append 'console=ttyAMA0,38400 keep_bootcon' \
-initrd rootfs.cpio.gz -smp 2 -m 1024 -bios flash.bin \
-d unimp \
-s -S
在另一窗口启动gdb调试,其中blx.elf
文件位于build/qemu/debug/blx
。
# 启动调试
gdb-multiarch bl1.elf
# 连接目标
target remote localhost:1234
# 如果要调试bl2,bl31, 需要添加对应符号表
add-symbol-file bl2.elf
add-symbol-file bl31.elf
# 打断点
b bl1_main
b bl2_main
b bl31_mainn
# 全速运行
c
# 单步执行
n
# 单步跟踪进入
s
安全启动
重新编译ATF,使能安全启动TBBR。
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=qemu all fip DEBUG=1 \
BL33=../qemu_boot/QEMU_EFI.fd \
OPENSSL_DIR=/home/xieli/project/6---ATF/openssl-3.0.8 \
TRUSTED_BOARD_BOOT=1 GENERATE_COT=1 \
MBEDTLS_DIR=/home/xieli/project/6---ATF/mbedtls-mbedtls-2.28.1
同上打包生成flash.bin文件。qemu启动命令也与普通启动一致。