ARM64-Trust-Firmware[3]-BL1解析
3 BL13.1 bl1_entrypointbl1的源码如下
bl1.ld.S为链接文件
bl1.mk为编译文件
在bl1.ld.S中定义了bl1的入口函数为bl1_entrypoint以及内存布局,ROM的内存为可读可执行,RAM的内存可读可写可执行
ENTRY(bl1_entrypoint)MEMORY { ROM (rx): ORIGIN = BL1_RO_BASE, LENGTH = BL1_RO_LIMIT - BL1_RO_BASE RAM (rwx): ORIGIN = BL1_RW_BASE, LENGTH = BL1_RW_LIMIT - BL1_RW_BASE}
关于BL1_RO_BASE和BL1_RW_BASE的值,这个是和平台息息相关的,比如qemu平台上:
/* * Partition memory into secure ROM, non-secure DRAM, secure "SRAM", * and secure DRAM. */#define SEC_ROM_BASE ...
ARM64-Trust-Firmware[2]-启动ATF
2 启动ATF2.1 基于qemu运行ATF项目地址:https://gitee.com/yang_lian/atf-demo
运行结果如下:
2.2 基于qemu运行optee我们基于optee来启动ATF,构建optee项目的过程会同时拉取linux kernel和ATF并把这个安全架构的软件栈运行起来
2.2.1 安装repo在Ubuntu 20.04上,直接通过apt命令安装repo可能会遇到问题。推荐使用以下步骤来安装repo:
下载repo脚本:
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
添加执行权限:
chmod +x repo
移动repo脚本到系统路径:
sudo mv repo /usr/bin
2.2.2 下载编译OP-TEE源码optee的github仓库如下:https://github.com/orgs/OP-TEE/repositories
optee官方文档如下:https://optee.readthedocs.io/en/latest/building/de ...
ARM64-Trust-Firmware[1]-ARM安全架构
1 ATF概览1.1 ARM安全架构
EL0:用户特权,运行普通用户程序
EL1:系统特权,运行操作系统内核
EL2:运行虚拟机监视器
EL3:运行安全监控器
ARM64 体系结构提供了 3 种软件产生的异常和3种系统调用。系统调用允许软件主动地通过特殊指令请求更高一场等级的程序所提供的服务。
SVC 指令:允许用户态应用程序请求操作系统内核的服务
HVC 指令:允许客户操作系统请求虚拟机监控器(hypervisor)的服务。
SMC 指令:允许普通世界(normal world)中的程序请求安全监控器(secure monitor)的服务。
异常向量表。向量可以分为两大类,四种:
Exception from Lower EL,从低特权级来的异常
低特权级的执行状态为 AArch64
低特权级的执行状态为 AArch32
Exception from the current EL,异常就来自当前特权级
当前选择了使用 SP_EL0 处理异常,就是处理异常使用 EL0 的栈空间
当前选择了使用 SP_ELx 处理异常,异常处理使用当前特权级的栈空间
https:/ ...
Xhyper剖析[6]--中断虚拟化
7.1 GICV3
寄存器
7.2 GIC初始化
根据上面这张图可知,对GIC的初始化分为四个步骤
初始化Distributor,Distributor是所有core共有的
初始化Redistributor,每个core都有自己的Redistributor
初始化cpu interface,每个core都有自己的cpu interface
初始化virtual interface,每个core都有自己的virtual interface
初始化Distributor
//gicv3.c/* 读取GICD_CTLR寄存器的bit[31],确认GICD_CTLR寄存器写入是否有效*/static inline void gic_dist_wait_for_rwp(void){ while((GICD_READ32(GICD_CTLR) >> 31) & 0x1);}static void gic_dist_init(void){ u32 gicd_type, gic_irqs; s32 i, nr_regs; ...
Xhyper剖析[5]--MMIO虚拟化
6.1 mmio设备模拟同物理机器上的物理地址空间一样,虚拟机的 IPA 地址空间也包含了用于访问内存和外围设备的区域,如下图所示:
Hypervior 可以通过将 IPA 与实际物理外设地址映射,从而使 虚拟机可以直接通过二阶段的地址映射来访问物理设备,比如我们之前实现的虚拟机上的 PL011 支持,就是直接将 IPA 映射到物理地址上,实现设备直通.
上述左边的设备叫做分配的外设,是已经分配给 Guest VM 并映射到其 IPA 空间的真实物理设备,允许 Guest VM 在运行时直接与外围设备交互。
上述右边的设备叫做虚拟外设,是 hypervisor 要在其软件中模拟的外设,在我们的 X-Hyper 实现中,我们让该虚拟设备的 IPA在二阶段表条目中不做物理地址映射,或者如果已经映射的,那么我们就给他解除映射。此时如果 Guest VM 访问该 IPA地址空间,则会触发 Data Abort 异常,从而陷入 EL2,并在 EL2 中实现软件模拟。
在 Hypervisor 的软件模拟中,我们需要知道哪个外设被访问了,还需要知道该外设中的哪个寄存器被访问了,是读访问还是 ...
Xhyper剖析[4]--XhyperCPU虚拟化
5.1 vcpu构建在 CPU 虚拟化中,首先明确一个概念就是 Guest VM 依然还是运行在实际的物理 CPU 上,那么这里提到的 VCPU 是一个什么概念呢?
VCPU 的运行与进程的上下文切换是类似的,当 Guest VM 需要切换到 VCPU 运行时,Hypervisor 就将 VCPU 对应的 Guest VM 的上下文恢复到对应的物理 CPU 中。当 Guest OS 由于执行一些敏感指令、访问没有权限的内存等情况时,会陷入运行在更高特权级的 Hypervisor,然后 Hypervisor 负责将物理 CPU 的状态保存到 VCPU 上下文中。所以我们这里就可以理解 VCPU 就是对物理 CPU 资源的抽象,Hypervisor 实现了物理 CPU 对 Guest VM 的时间复用。
在 Hypervisor 中可以控制所有的系统资源,包括之前讲到的物理内存、IO 设备、中断、指令等。Hypervisor 可以配置 Guest VM 在执行到敏感指令时触发异常,该异常会被路由到 EL2 的 Hypervisor 中,然后可以对这些敏感指令进行模拟。
首先对Guest ...
Xhyper剖析[3]--Xhyper内存虚拟化
4.1 页表4.1.1 页表映射
MMU的作用,主要是完成地址的翻译,即虚拟地址到物理地址的转换,无论是main-memory地址(DDR地址),还是IO地址(设备device地址),在开启了MMU的系统中,CPU发起的指令读取、数据读写都是虚拟地址,在ARM Core内部,会先经过MMU将该虚拟地址自动转换成物理地址,然后在将物理地址发送到AXI总线上,完成真正的物理内存、物理设备的读写访问。
高位是1的虚拟地址空间,使用TTBR1_ELx基地址寄存器进行页表翻译;
高位是0的虚拟地址空间,使用TTBR0_ELx基地址寄存器页表翻译。
Linux Kernel 使用0xffff_0000_0000_0000 - 0xffff_ffff_ffff_ffff作为内核地址区间
AArch64支持的页面大小有:4kb、16kb、64kb。不同页面大小的索引情况不同:
4KB:48位有效虚拟地址,每一级页表使用虚拟地址中的9个bit来索引,所以每一级页表就有2^9=512个页表项
16KB:48位有效虚拟地址,L0页表使用VA[47]作为索引,L1页表使用VA[46:36] ...
Xhyper剖析[2]--Xhyper启动
3.1 设备内存分布项目使用qemu的aarch64的virt机器来运行
CPU="cortex-a72"QCPU="cortex-a72"QEMU="qemu-system-aarch64"GIC_VERSION=3MACHINE="virt,gic-version=$GIC_VERSION,virtualization=on"NCPU=4QEMUOPTS="-cpu $QCPU -machine $MACHINE -smp $NCPU -m 128M -nographic \ -bios ./u-boot/u-boot.bin \ -device loader,file=./build/X-Hyper_Uimage,addr=0x40200000,force-raw=on"
其中virt的内存分布如下,定义在qemu源码的hw/arm/virt.c中
static const MemMapEntry base_memmap[] = { ...
Xhyper剖析[1]--ARM64基础知识
2.1 寄存器通用寄存器AArch64执行状态提供了32个在任何时间任何特权级下都可访问的64位的通用寄存器。 每个寄存器都有64位宽,它们通常被称为寄存器X0-X30。
SPSR
当异常发生时,处理器状态将保存在相关的程序状态保存寄存器(SPSR)中,
M[3:0]
Binary
状态
描述
0
0x0
EL0t
EL0(用户态),Thread 模式,使用 SP_EL0(共享栈),AArch64。
0
0x4
EL1t
EL1(内核态),Thread 模式,使用 SP_EL0(共享栈),AArch64。
0
0x5
EL1h
EL1(内核态),Handler 模式,使用 SP_EL1(专用栈),AArch64。
0
0x8
EL2t
EL2(Hypervisor),Thread 模式,使用 SP_EL0(共享栈),AArch64。
0
0x9
EL2h
EL2(Hypervisor),Handler 模式,使用 SP_EL2(专用栈),AArch64。
0
0xC
EL3t
EL3(Secure Monitor),Thread 模式,使用 SP_ ...
CyberRt源码剖析--07协程调度框架
7.1 什么是协程协程的核心在于将程序的执行流程划分为多个可控的片段,每个片段能够在特定时点暂停或恢复运行。这种机制通过协作式调度实现,开发者可在代码中显式指定挂起和恢复的时机,从而避免传统线程因抢占式调度带来的复杂同步问题。协程的生命周期包括以下四个阶段:
1.创建(Creation):协程通过特定的语法或函数被创建,此时协程处于就绪状态,等待被调度执行。
2.挂起(Yield):协程在执行过程中可以主动或被动地暂停执行,将控制权交还给协程调度器。挂起操作通常在等待 I/O 操作、等待其他协程完成或主动让出 CPU 时发生。
3.恢复(Resume):协程调度器可以在适当的时候恢复协程的执行,从上次挂起的位置继续运行,直到完成任务或再次挂起。
4.销毁(Destruction):当协程完成任务后,会被销毁并释放占用的资源。
如上图左边假设一个MainTask是一个线程去调用Task()函数去执行一个功能,如果Task()是一个普通函数,那么MainTask会等待Task()执行完毕返回后继续执行MainTask的步骤
如上图右边如果MainTask去执行Cotask() ...

![ARM64-Trust-Firmware[3]-BL1解析](/2026/01/24/ARM64-Trust-Firmware-3-BL1%E8%A7%A3%E6%9E%90/17692290470595.png)
![ARM64-Trust-Firmware[2]-启动ATF](/2026/01/24/ARM64-Trust-Firmware-2-%E5%90%AF%E5%8A%A8ATF/17692287555201.png)
![ARM64-Trust-Firmware[1]-ARM安全架构](/2026/01/24/ARM64-Trust-Firmware-1-ARM%E5%AE%89%E5%85%A8%E6%9E%B6%E6%9E%84/17692284856153.png)
![Xhyper剖析[6]--中断虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-6-%E4%B8%AD%E6%96%AD%E8%99%9A%E6%8B%9F%E5%8C%96/17689244713913.png)
![Xhyper剖析[5]--MMIO虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-5-MMIO%E8%99%9A%E6%8B%9F%E5%8C%96/17689243819381.png)
![Xhyper剖析[4]--XhyperCPU虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-4-XhyperCPU%E8%99%9A%E6%8B%9F%E5%8C%96/17689241119091.png)
![Xhyper剖析[3]--Xhyper内存虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-3-Xhyper%E5%86%85%E5%AD%98%E8%99%9A%E6%8B%9F%E5%8C%96/176892388736321.png)
![Xhyper剖析[2]--Xhyper启动](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-2-Xhyper%E5%90%AF%E5%8A%A8/17689237041079.png)
![Xhyper剖析[1]--ARM64基础知识](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-1-2-ARM64%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/176892275018318.png)
