Qemu支持ATF + u-boot + linux kernel

qemu环境搭建及ATF/u-boot/linux kernel的编译等,参考

从零开始搭建qemu调试环境 - 知乎

ATF编译:

wmx@wmx-VirtualBox:~/work/arm-trusted-firmware$ cat build-atf.sh

export ARCH=arm64

export CROSS_COMPILE=/home/wmx/Downloads/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

make PLAT=qemu BL33=/home/wmx/work/u-boot/u-boot.bin all fip DEBUG=1

u-boot编译:

wmx@wmx-VirtualBox:~/work/u-boot$ cat build-uboot.sh

export ARCH=arm64

export CROSS_COMPILE=/home/wmx/Downloads/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

make qemu_arm64_defconfig

make

qemu+atf+uboot+linux启动:

wmx@wmx-VirtualBox:~/work$ cat qemu-atf-kernel.sh

qemu-system-aarch64 \

-nographic \

-M virt,secure=on,gic_version=3 \

-cpu cortex-a53 \

-smp 2 \

-m 2048 \

-d guest_errors,unimp \

-bios /home/wmx/work/arm-trusted-firmware/build/qemu/debug/bl1.bin \

-drive file=/home/wmx/work/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw \

-device virtio-blk-device,drive=blk1 \

-kernel /home/wmx/work/linux-4.19.294/arch/arm64/boot/Image \

-semihosting-config enable=on,target=native

代码执行流程:

1)BL1加载BL2并跳转到BL2入口

2)BL2加载BL31

3)BL2加载BL33,即加载u-boot.bin

前面的加载过程会用到plat/qemu/common/qemu_io_storage.c中定义的文件名,需要修改为本机的实际存储位置

4)BL2返回到BL1,并从BL1进入BL31

此时BL31由于尚未设置其自身的smc异常处理程序而无法直接处理该异常,因此,为了完成跳转流程,BL1需要先代理该异常的处理。因此BL1在退出之前先设置smc异常处理函数,

BL2触发smc启动BL31时,bl2/bl2_main.c 函数bl2_main中通过smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0); 进入BL1.

BL1捕获该异常,进入bl1/aarch64/bl1_exceptions.S 的 SynchronousExceptionA64-> smc_handler64 ,并根据BL2传入的参数设置BL31的入口地址和系统初始状态,并通过ERET跳转到BL31的入口地址处执行

5)BL31会初始化GICv3及runtime service(SMC调用的服务),并进入BL33(u-boot)执行

BL31:

runtime_svc.c->runtime_svc_init函数:

主要是初始化SMC调用时的处理函数,rt_svc_descs通过 DECLARE_RT_SVC声明,并链接到RT_SVC_DESCS_START和RT_SVC_DESCS_END范围内. 当前qemu平台上会有两个rt_svc_descs, 分别是arm_arch_svc和std_svc。 分别在services/arm_arch_svc/arm_arch_svc_setup.c 和services/std_svc/std_svc_setup.c中声明

相关推荐
wdfk_prog7 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
七夜zippoe8 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥8 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
忆~遂愿8 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
湘-枫叶情缘8 小时前
1990:种下那棵不落叶的树-第6集 圆明园的对话
linux·系统架构
Fcy6489 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满9 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠10 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Gary Studio10 小时前
rk芯片驱动编写
linux·学习
mango_mangojuice10 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习