实验环境
硬件设备:GDK8
GDK8是我的主力开发机,可以非常方便的在ARM上编译代码,免去了交叉编译的苦恼,而它最大的特色就是可以进行JTAG调试。
相信现在非常多的领域都需要研究Linux内核,而传统的内核调试方法就是printk,而像kgdb这样的软件调试器又有调试不了的“盲区”,基于这种情况就只能使用JTAG技术,但市场上的芯片又不给你把JTAG引脚弄出来,于是想要使用JTAG进行调试是非常困难的,但是GDK8可以非常轻松的通过挥码枪与底层的Coresight协议进行交互,进行JTAG调试,大大提高了我解决问题的效率。
ATF与BL31的介绍
可信固件(Trusted Firmware)是ARM从ARM-v8时期开始引入的安全方案,主要作用在提高了启动过程的安全性和细化了运行过程的特权级区间,对于ARM而言,可信固件可以分成两类,分别是针对A核的TF-A和针对M核的TF-M。
当机器启动后,会从Boot Rom
内启动bl1_entrypoint.S
,bl1的主要目的是建立Trusted SRAM、exception vector、初始化串口等,bl1完成之后,会从Trusted Boot Firmware
内运行bl2_main.c
,在这里面会去初始化硬件和寻找bl3,当然bl3有很多,如bl31、bl32、bl33,bl31是通过SMC为Non-Secure持续提供设计安全的服务,并寻找bl32和bl33,其中bl32负责OPTee OS的运行,bl33则是不可信固件。
1. 下载ATF源代码
git clone https://github.com/ARM-software/arm-trusted-firmware.git
2. 编译ATF
编译ATF固件可以参照下面的命令进行编译。
make realclean
CFLAGS='-gdwarf-2' \
CROSS_COMPILE=aarch64-linux-gnu- \
make PLAT=rk3328 DEBUG=1 ERROR_DEPRECATED=1 bl31
其中PLAT=
指对应芯片类型,由于GDK8的芯片是RK3328,所以指定PLAT=rk328
,也可以根据具体的芯片型号指定不同的平台。
而DEBUG=
用于决定生成的二进制是否带有符号信息,比如设置DEBUG=1
就会生成符号信息,而设置DEBUG=0
就不会生成调试信息。
完成编译后,可以在build/rk3328/
目录下找到编译出来的二进制文件,生成的固件位于bl31
目录下,名字是bl31.elf
。
ls build/rk3328/debug/
bl31 lib libc libfdt libwrapper romlib
ls build/rk3328/debug/bl31/
16550_console.d cache_helpers.o errata_report.d plat_gicv2.o psci_on.d
16550_console.o cci.d errata_report.o plat_helpers.d psci_on.o
aem_generic.d cci.o generic_delay_timer.d plat_helpers.o psci_setup.d
aem_generic.o context.d generic_delay_timer.o plat_log_common.d psci_setup.o
arm_arch_svc_setup.d context_mgmt.d gicdv2_helpers.d plat_log_common.o psci_suspend.d
arm_arch_svc_setup.o context_mgmt.o gicdv2_helpers.o plat_pm.d psci_suspend.o
backtrace.d context.o gicv2_helpers.d plat_pm.o psci_system_off.d
backtrace.o cortex_a53.d gicv2_helpers.o plat_psci_common.d psci_system_off.o
bakery_lock_coherent.d cortex_a53.o gicv2_main.d plat_psci_common.o rockchip_gicv2.d
bakery_lock_coherent.o cpu_data_array.d gicv2_main.o plat_topology.d rockchip_gicv2.o
bl31_context_mgmt.d cpu_data_array.o interrupt_mgmt.d plat_topology.o runtime_exceptions.d
bl31_context_mgmt.o cpu_data.d interrupt_mgmt.o pmu.d runtime_exceptions.o
bl31.dump cpu_data.o misc_helpers.d pmu.o