本文以AArch64为准,内容以翻译原文为主。

资源说明

基本介绍

权限模型 (Exception Levels)

基本分为EL3-EL0,从高level转低level通过ERET指令,从低level转高level通过exception方式。

各个级别说明:

Non-secure EL0: Unprivileged applications, such as applications downloaded from an App Store.

Non-secure EL1: Rich OS kernels from, for example, Linux, Microsoft Windows, iOS.

Non-secure EL2: Hypervisors, from vendors such as Citrix, VMWare, or OK-Labs.

Secure EL0: Trusted OS applications.

Secure EL1: Trusted OS kernels from Trusted OS vendors such as Trustonic.

Secure EL3: Secure Monitor, executing secure platform firmware provided by Silicon vendors and OEMs ARM Trusted Firmware

启动过程

基本分为BL1->BL2->(BL31/BL32/BL33)这几个阶段,整体框图如下:

BL1

系统reset vector后在ROM上开始执行,EL3模式,起始执行地址BL1_RO_BASE

BL1的数据段被拷贝到trusted SRAM的顶端,起始地址BL1_RW_BASE

地址定义参见platform_def.h

BL1阶段参考函数bl1_main

架构初始化

判断cold reset还是warm reset,参考函数plat_get_my_entrypoint

cold reset和warm reset走不同代码分支,但至少完成后续这些初始化

建立简单的exception vectors,如下:

0x0 : Synchronous exception from Current EL with SP_EL0

0x1 : IRQ exception from Current EL with SP_EL0

0x2 : FIQ exception from Current EL with SP_EL0

0x3 : System Error exception from Current EL with SP_EL0

0x4 : Synchronous exception from Current EL with SP_ELx

0x5 : IRQ exception from Current EL with SP_ELx

0x6 : FIQ exception from Current EL with SP_ELx

0x7 : System Error exception from Current EL with SP_ELx

0x8 : Synchronous exception from Lower EL using aarch64

0x9 : IRQ exception from Lower EL using aarch64

0xa : FIQ exception from Lower EL using aarch64

0xb : System Error exception from Lower EL using aarch64

0xc : Synchronous exception from Lower EL using aarch32

0xd : IRQ exception from Lower EL using aarch32

0xe : FIQ exception from Lower EL using aarch32

0xf : System Error exception from Lower EL using aarch32

当出现异常时会调用函数plat_report_exception,通过LED反映异常情况:

SYS_LED[0] - Security state (Secure=0/Non-Secure=1)

SYS_LED[2:1] - Exception Level (EL3=0x3, EL2=0x2, EL1=0x1, EL0=0x0)

SYS_LED[7:3] - Exception Class (Sync/Async & origin). This is the value of the status code

CPU初始化,参考函数reset_hardler

配置控制寄存器,SCTLR_EL3、SCR_EL3、CPTR_EL3、DAIF、MDCR_EL3等等

平台初始化

使能Trusted Watchdog

初始化console

配置内联,保证硬件一致

使能MMU,并映射需要访问的memory

配置BL2所在的存储

Firmware升级 (可选)

BL2加载和运行

打印”Booting Trusted Firmware”以表明BL1执行成功

预判并加载BL2到trusted SRAM,预判参考函数bl1_plat_handle_pre_image_load,如果失败则打印”Failed to load BL2 firmware.”

调用函数bl1_plat_handle_post_image_load,传递BL2参数,如memory layout

运行BL2

BL2

在trusted SRAM上执行,EL1模式,起始地址BL2_BASE

架构初始化

为ATF子目标和通用软件正常运行而初始化

清 CPACR.FPEN,使EL1和EL0可以访问Floating Point和Advanced SIMD

平台初始化

初始化console

配置可以加载下一个BL阶段所使用的存储设备

使能MMU,并映射需要访问的memory

配置平台安全设置,使能访问控制组件

保留部分memory,用于传递数据给下一个BL EL3 Runtime Software

定义额外可用的memory,给后面每个BL的加载使用

加载Image

load_scp_bl2,(separate System Control Processor)

load_bl31,EL3 Runtime Software image load,从存储设备加载到trusted SRAM

通过提升SMC将控制回到BL1,将BL31的入口提供给BL1

BL1关闭MMU,并通过清除SCTLR_EL3.M/I/C,冲掉data cache

BL1将控制转给BL31的入口

load_bl32 (optional), Secure-EL1 Payload image load

load_bl33, Non-trusted Firmware image load,从存储设备加载到non-secure memory

BL31

在trusted SRAM上执行,EL3模式,入口地址BL31_BASE

架构初始化

与BL1的架构初始化相近,覆盖BL1的初始化

初始化每个CPU的数据框架,包括各个CPU的cache

替换BL1的exception vector

平台初始化

使normal world software能正常工作

初始化console

配置内联使其硬件一致

使能MMU,并映射需要访问的memory

初始化通用中断控制器

初始化电源控制器设备

检测系统拓扑

Runtime services初始化

EL3 runtime services framework如下:

Standard service calls,如PSCI(Power State Coordination Interface)

Secure-EL1 Payload Dispatcher service

CPU implementation service

BL32 (可选,略过)

BL33

Non-trusted Firmware image

EL3 Runtime Software使用BL2提供的entrypoint信息跳转到BL33,EL2模式

地址布局

DRAM

0xffffffff +----------+

: :

|----------|

|HW_CONFIG |

0x83000000 |----------| (non-secure)

| |

0x80000000 +----------+

Trusted SRAM

0x04040000 +----------+ loaded by BL2 +----------------+

| BL1 (rw) | <<<<<<<<<<<<< | |

|----------| <<<<<<<<<<<<< | BL31 NOBITS |

| BL2 | <<<<<<<<<<<<< | |

|----------| <<<<<<<<<<<<< |----------------|

| | <<<<<<<<<<<<< | BL31 PROGBITS |

| | <<<<<<<<<<<<< |----------------|

| | <<<<<<<<<<<<< | BL32 |

0x04002000 +----------+ +----------------+

|fw_configs|

0x04001000 +----------+

| Shared |

0x04000000 +----------+

Trusted ROM

0x04000000 +----------+

| BL1 (ro) |

0x00000000 +----------+

关于FIP

Firmware Image Package

通常BL1被烧录在ROM中,BL2/BL31/BL32/BL33/uboot被打包成fip.bin烧录在flash中;启动时通过检索UUID找到fip.bin中的各个image,参考firmware_image_package.h

通过函数plat_get_image_source()读取数FIP数据

tools/fiptool/fiptool可以生成和分解fip文件

linux firmware 框架,学习整理:arm-trusted-firmware相关推荐

  1. ATF(Arm Trusted Firmware)/TF-A Chapter 02 BL1-ROMCode

    第二章目录: Chapter 02.TF-A(Arm Trusted Firmware, ATF ) BL1-ROMCode(本文) Chapter 02.TF-A(Arm Trusted Firmw ...

  2. linux 文件inode,linux文件系统-inode学习整理

    linux文件系统-inode学习整理 介绍 linux文件系统可讲的模块有很多,包括文件系统整体架构.文件系统分类.虚拟文件系统以及文件系统存储结构等等,本文主要介绍的是文件系统的存储结构,也就是本 ...

  3. linux arm 汇编学习,如何在LINUX平台上学习GNU ARM汇编

    本例说明如何在LINUX平台上学习GNU ARM汇编. 1.软件环境 vmware 5.0 + redhat 9.0 + skyeye 1.2.4 + arm-elf 工具 2. 源文件 a.s -- ...

  4. ATF(Arm Trusted Firmware)/TF-A Chapter 01. 介绍

    1.TF-A 介绍 TF-A是一套通用的软件架构+特定于平台的实现代码. TF-A满足大多数SoC厂商的CPU设计:单核启动,多核启动,自定义reset vector,可裁剪的启动阶段,bootrom ...

  5. PHP,mysql,Linux,CI框架学习总结

    PHP,mysql,CI框架学习总结 PHP标记 1.Xml风格<?php ?> 2.简短风格 <? ?> 需在php.ini中开启short_open_tag 3.asp风格 ...

  6. [ATF] ARM Trusted firmware 构建选项

    TF-A 构建系统支持以下构建选项.除非另有说明,这些选项应在构建命令行中指定,并且不会在任何组件生成文件中修改.请注意,构建系统不会跟踪构建选项的依赖性.因此,如果任何构建选项从先前的构建中发生更改 ...

  7. ATF(Arm Trusted Firmware)/TF-A Chapter 04 Authentication Framework

    4.1. 代码分析 首先,重新分析之前忽略掉的 TRUSTED_BOARD_BOOT =1 的情况,bl1_platform_setup->arm_bl1_platform_setup-> ...

  8. 蓝牙整体框架学习整理

    从来也没写过技术博客,最近在男票的积极鼓励下,在系统学习蓝牙,写下今天的收获,持续更新中~~~ 1.蓝牙的系统架构,从底到上:如下图: 按照我自己看的文章总结, 上层的大多是Profile 底层的大多 ...

  9. Flask框架学习整理——从零开始入门Flask

    文章目录 Flask框架 一. 简介 二. 概要 三. 知识点(附代码) 1. Flask基础入门 1)路由route的创建: 2)endpoint的作用 3)request对象的使用 4)请求钩子b ...

最新文章

  1. iOS开发之功能模块--推送之坑问题解决
  2. win7下注册一个com失败,权限不够
  3. mysql连接失败 ping通_哭~问:oracle 数据库有时会突然连接失败,但能ping通主机...
  4. java注册头像_注册页面头像上传的实现(javaweb相关)
  5. NOIP 模拟 box - 费用流 / 匈牙利
  6. 国内外软件开发上的差距与分析
  7. 陈年牵手徐静蕾之一箭双雕
  8. 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面.
  9. require('module') 是什么?
  10. rocketmq4.x快速入门指南
  11. 6.1 tensorflow2实现WideDeep推荐系统——Python实战
  12. [渝粤教育] 广东-国家-开放大学 21秋期末考试市场营销10256k2
  13. C++ Lib的生成与调用 生成dll,lib快速的寻找方法
  14. 1.6 Go语言适合做什么
  15. SQL语句预处理防注入——完整版
  16. 为了实现自动控制处理,需要计算机具有的基础条件是( ),计算机应用基础考试试卷(电大本科)...
  17. EBAZ4205矿卡控制卡
  18. 如何看待中国制造2025?
  19. Java源码学习笔记之lang包——包装类Integer.class
  20. XP计算机桌面锁定进不去,[xp系统开机进不了桌面]启动进不去桌面上,电脑开机进不去桌面上怎么解决...

热门文章

  1. spring的IOC类图
  2. 任何一个二目关系都是BCNF
  3. Python requests模块详解
  4. mysql5.7.20如何卸载干净再重装
  5. 软件工程网络15个人作业3——案例分析(201521123107)
  6. WebService的简单案例记录(Java)
  7. 为什么计算机播放音乐不响,电脑打开音响,播放音乐为什么没有声音??!!~急急急!!快! 爱问知识人...
  8. $happy-new(year[2006])
  9. 不想失业?你得学会为自己工作
  10. Centos7---查看内存型号