ARM ATF入门-安全固件软件介绍和代码运行

大家都知道硬件之上是软件,本公众号主要介绍“os与autosar”,那么除了这两种类型的软件,是否还有别的软件?本文以arm soc硬件为例,“打破砂锅,问到底”,来看看还有哪些软件我们没接触到,在os之下和soc硬件之上的,各种卖给我们底层软件的厂商(一般都是soc芯片原厂)所掩盖的核心技术,另外结合开源代码进行理解。
1.  os之下,soc硬件之上有什么软件?
我们在定位os的问题的时候突然一个smc指令之后的代码找不到了,代码不在os里面也不在u-boot里面,到底在哪里,之后的运行又是什么,带着这个问题,我们“打破砂锅问到底”,看看到底怎么回事。    
    在之前的文章autosar入门-汽车电子构架演进(四) 未来已来,有一个nxp的汽车软件方案图,可以同时支持ap和bp,很经典,我们回顾下:
可以看到标识的是firmware(固件),我们首先会想到这就像电脑里面的bios,焊在电脑主板上的一个存储芯片,开机启动的时候,cpu寻址就会去执行里面的代码。那么这个东西的确是个软件啊,有软件就有代码,有代码就有开源的,来一起盘它。
    nxp的图,以功能为核心是给客户看的,掩盖了其使用arm技术的细节,也就是软件实现的细节,并不能直接反映arm软件的框架。然后重新起个高大上的模块名字,好忽悠啊,我们直接来看arm的特权级(重要:本文以下都是针对arm a核):
这个图了解arm的都太熟悉了,el(exception level)就是异常等级,为什么会有异常等级,那就是特权(privilege),不同的软件有不同的特权,el0的特权最小,只能运行app,el3的特权是最大的,也就是说对所有硬件的访问权限也是最大的。
    armv8分为secureworld和non-secure world(normalworld),四种异常级别从高到低分别为el3,el2,el1,el0。
el0:非安全态的apps,安全态的trusted apps,el0是无特权模式,所有app应用都在el0。
el1:非安全态的normal world os,安全态的trusted os ,el1是一个特权模式,能够执行一些特权指令,用于运行各类操作系统(例如linux、freertos、tee等)。
el2:hypervisor虚拟层
el3:secure monitor,arm trusted firmware安全固件,el3具有最高管理权限,是一个微型的runtime系统,为os提供服务,负责安全监测和secure world和normal world之间的切换。
关于arm体系结构的基础知识可以自己找资料看看。os下面的软件有hypervisor和securemonitor。hypervisor是虚拟机,后续有机会了介绍下,本文聚焦到secure monitor。
secure monitor到底是什么,如下图中红框中:
其中有u-boot大家都比较熟悉,是一个bootloader, bootloader程序会先初始化 ddr等外设,然后将 linux内核从 flash(nand nor flash sd mmc等 )拷贝到 ddr中,最后启动 linux内核。后续有文章再详细介绍。
    这里我们看bl1、bl2、bl31、bl32、bl33是什么东西,下面介绍下atf的概念:
atf:arm trustedfirmware(arm安全固件),运行在el3异常级别,atf为armv7-a 和 armv8-a提供了一些安全可信固件。具体包括上面说的:atf= bl1、bl2、bl31、bl32、bl33,其中bl33有就是u-boot。都运行在el3模式。具体为:
bl1:也叫bootrom,rom的意思就是只读的,具有最高的执行权限el3,在 cpu 出厂时就被写死了。为什么要写死,这里有一个安全驱动概念(secure boot)。cpu上电启动的时候,加载镜像的顺序为bl1 -》 bl2 -》 bl31 -》 bl32 -》bl33(uboot)-》os(linux),但是如果其中的一个镜像被换掉了怎么办?这里不是说网络攻击换掉,就是物理上拿到电路板,然后把存储sd卡拔掉换了自己的os,那不是想干啥就干啥,完全控制了硬件设备,俗称“越狱”。答案就是没一个镜像进行签名校验。
    例如bl33加载os,需要os镜像算出hash利用私钥加密,然后bl31在加载os的时候会读取这个加密的hash,利用自己的公钥解密,解密后的hash是对的就进行加载。那么这么一级一级按照加密向前传递,那第一个根bl1如果可以在sd卡上伪造,那校验就没用了。所以bl1需要只读,并且作为只读硬件直接搞进到cpu里面,你从板子上也拆不下来,更替换不了。因为要写死到cpu内部,所以独立出来了,也是其由来的原因。
bl2:bl2在flash中的一段可信安全启动代码,主要完成一些平台相关的初始化,比如对ddr的初始化等。因为bl31和bl32是一个runtime,也就是上电后一直运行的程序,那么需要加载到内存里面,需要先初始化内存ddr,bl2就干这个事情的。所谓的loder。
bl31:作为el3最后的安全堡垒,它不像bl1和bl2是一次性运行的。如它的runtime名字暗示的那样,它通过smc指令为non-secure os持续提供设计安全的服务,在secure world和non-secure world之间进行切换。是对硬件最基础的抽象,对os提供服务。例如一个el3级别的特权指令,比如关机、休眠等os是无权处理的,就会交给bl31来继续操作硬件处理。
bl32:是所谓的secure os,运行在secure mode。在arm平台下是arm 家的 trusted execution environment(tee)实现。op-tee 是基于armtrustzone硬件架构所实现的软件secure os。
    一般在bl32会运行optee os + 安全app,它是一个可信安全的os运行在el1并在el0启动可信任app(如指纹信息,移动支付的密码等),并在trust os运行完成后通过smc指令返回bl31,bl31切换到non-seucre world继续执行bl33。关于optee和secure mode及turstzone的机制,有机会再写一个文章介绍。
bl33:这里就是normal wrold了,运行的都是非安全固件,也就是我们常见的uefi firmware或者u-boot,也可能是直接启动linux kernel。
    启动bl1,bl2,bl31,bl32则是一个完整的atf信任链建立流程(arm trusted firmware),像常见的psci(power state coordination interface)功能则是在atf的bl31上实现。对基本概念有认识了后,你就知道os之下还有的这些软件通常称为atf,其启动流程如下:
详细为:
2. atf代码下载编译运行
2.1 atf代码下载编译
atf代码下载:
git clone https://github.com/arm-software/arm-trusted-firmware.git atf代码编译: make cross_compile=aarch64-linux-gnu- plat=qemu debug=1 all
编译完成后在arm-trusted-firmware/build/qemu/debug目录下生成bl1.bin、bl2.bin、bl31.bin。
atf的bl33使用的u-boot,代码下载:
git clone https://source.denx.de/u-boot/u-boot.git 编译: cd u-bootexport arch=arm64export cross_compile=aarch64-linux-gnu-make qemu_arm64_defconfigmake -j8 编译完成后在当前目录下生成u-boot.bin。
2.2 qemu运行atf
首先需要qemu,执行
qemu-system-aarch64 –version 看下系统是否安装过,如果没安装过,需要安装:
git clone https://git.qemu.org/git/qemu.gitcd qemu./configure --target-list=aarch64-softmmu --prefix=make -j8sudo make install 有了qemu,然后新建一个run目录,把各个镜像软连接进来:
mkdir runcd runln -s ~/arm/arm-trusted-firmware/build/qemu/debug/bl1.bin bl1.binln -s ~/arm/arm-trusted-firmware/build/qemu/debug/bl2.bin bl2.binln -s ~/arm/arm-trusted-firmware/build/qemu/debug/bl31.bin bl31.binln -s ~/arm/u-boot/u-boot.bin bl33.bin 在run目录执行命令:
qemu-system-aarch64 -nographic -machine virt,secure=on -cpu cortex-a53 -smp 2 -m 2048 -d guest_errors,unimp -bios ./bl1.bin -semihosting-config enable=on,target=native
可以看到u-boot已经启动了,我们输入u-boot支持的version命令会有输出。
    这里主要分析atf,qemu只加载了atf包括u-boot。如果想一块加载linux可以参考:https://zhuanlan.zhihu.com/p/521196386


业界首创!5G-A算网一体游牧式基站赋能体育赛事
半导体封装及测试厂商蓝箭电子正式登陆创业板
承德科胜颗粒全自动包装机|胡辣汤料包装机|河北包装机
常用的非比较排序算法:计数排序,基数排序,桶排序的详细资料概述
武汉芯源半导体CW32F030系列MCU在电焊机的应用
ARM ATF入门-安全固件软件介绍和代码运行
德国汽车制造商戴姆勒和宝马正式宣布,双方将深化此前的合作
中国将稳居世界第二大半导体设备市场
应该如何学习C语言?给学习C语言的同学几点建议
荣耀v9评测:荣耀v9和华为P10谁更性价比?荣耀v9和华为P10评测对比
迎接小米MIX2的到来?小米MIX现在3019就可买到 真正的全面屏
“保姆级”智能驾驶的照顾,谁不想拥有?
美新半导体:三合一MEMS芯片实现更高性价比
PCB设计中焊盘的种类以及设计标准解析
智能机器人正处在一个最好的时代
英飞凌助攻马自达最新增程序电动车接入富田电机七合一驱动系统
机器人的SLAM和导航系统技术分析
体验经济是 ToB 领域的下一个关注点
深入解析SMT工厂加工车间的环境要求
华为三款新旗舰:华为p10、华为P10plus、荣耀v9综合评测大PK,你看好谁?