安全之安全(security²)博客目录导读
问题:如何在不使用非安全引导程序(Non-secure Bootloader)的情况下使用TF-A直接引导Linux内核?
作为一名软件开发人员,使用非安全引导加载程序引导Linux内核,例如用于嵌入式系统的u-boot引导加载程序,或用于基础设施系统的edk2引导加载程序。
然而,对于裸机开发,希望使用TF-A来直接引导Linux内核,而不使用非安全引导加载程序。我怎么做呢?
答案:
通常,TF-A支持u-boot bootloader或edk2非安全引导加载程序作为BL33镜像。然后,BL33镜像引导内核,但它也可以直接引导Linux内核。
构建选项ARM_LINUX_KERNEL_AS_BL33用于此特殊场景。Linux内核期望寄存器x0-x3在引导时具有特定的值。这些值在Linux内核文档中描述如下:
-
x0 =
<physical address of device tree blob (dtb) in system RAM>
-
x1 = 0
(reserved for future use) -
x2 = 0
(reserved for future use) -
x3 = 0
(reserved for future use)
因此,当通过将ARM_LINUX_KERNEL_AS_BL33设置为1来使用该特性时,设备树blob (DTB)和Linux内核镜像(BL33)可以通过BL2加载,并且DTB地址可以通过x0寄存器从TF-A传递到内核。
此外,Linux内核镜像(BL33)由BL2加载,但是起始地址必须使用PRELOADED_BL33_BASE选项指定。
以下示例展示了基于arm的FVP模型的构建选项:
make CROSS_COMPILE=aarch64-none-elf- \PLAT=fvp \FVP_HW_CONFIG_DTS=fdts/fvp-base-gicv3-psci-1t.dts \ARM_LINUX_KERNEL_AS_BL33=1 \PRELOADED_BL33_BASE=0x84000000 \all fip
参考:Documentation – Arm Developer