《optee系统架构从入门到精通》
CSDN学院课程连接:https://edu.csdn.net/course/detail/39573
讲师介绍
拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整理并清晰讲解,透过事务看本质,帮助学员快速入门和理解。
课程介绍
课程大纲
01-Trustzone简介
什么是TEE?TEE基础科普
TEE的生态介绍?有哪些TEE厂商?各有什么特点?
02-TEE技术简介
什么是TEE?TEE基础科普
TEE的生态介绍?有哪些TEE厂商?各有什么特点?
03-TEE的生态和应用
这么些年过来,TEE为什么一直不温不火?
TEE在手机生态中表现如何?发展趋势如何?
TEE在汽车电子领域又是怎样的?是否大有前途?
TEE在服务器领域是否有应用?
TEE在物联网IOT中是否有需求?
TEE还在哪些领域中有需求?(电视机/机顶盒…)
04-TrustzoneTEE的学习方法
什么是trustzone?什么是TEE?什么是架构?
Trustzone是硬件吗?是软件吗?
当前主流的软件和硬件是怎么样子的?有什么标准规范吗?
如何学习Trustzone/TEE? 学习Trustzone/TEE的最佳路径是怎样的?
什么是软硬件交互?软硬件是怎样交互的?如何学习软硬件交互的主流框架?
05-optee技术简介
什么是open tee?什么是optee?
什么是TEE?什么是optee?
optee是大的系统软件中扮演什么角色?
optee在架构生态中扮演什么角色?
optee是谁领导和维护的?
06-optee系统组件介绍
大系统里都有哪些组件?组件如何理解?
如何集成一家TEE?
TEE都有哪些组件?
组件之间如何交互?
07-optee系统启动流程
多系统如何理解?
boottime和runtime如何理解?
现在主流的系统是怎样的?
08-optee os启动流程
optee是如何启动的?
optee是如何被加载到安全内存的?
cpu是如何跳转到optee内核代码并开始执行的?
optee os的初始化都干了啥?
optee的单核启动和多核启动有什么区别?
09-optee os线程向量表及其作用
REE和TEE如何交互?
CPU是怎样切到TEE中去的?
CPU切到TEE后执行的第一行代码是什么?
在boottime阶段CPU是如何切到TEE中的?
在runtime阶段CPU是如何切到TEE中的?
在runtine阶段CPU切换到TEE后怎样找到需要执行的代码?
线程向量表是啥概念?
10-optee的进入和退出
cpu是如何进入optee的?进入optee的入口有哪些?如果一些入口没有实现是怎样的?
cpu是如何从optee中返回的?
fast smc call和std smc call有什么区别?是如何区分的?使用场景是怎样定义的?
多核启动是怎样换成optee os启动多核的?
optee os是如何响应外部系统中断的?
11-optee os的异常向量表和设计模型
异常中断如何学习?要想让异常中断机制正常工作需要注意哪些事项?
异常、中断、异常中断这些词汇如何理解?有何不同?
FIQ和IRQ有什么不同?
在optee中,针对FIQ和IRQ的设计有什么区别?
optee和商业TEE,在异常中断这块设计有什么区别吗?
12-optee的同步机制
optee都有哪些同步机制?有什么区别?
optee要操作uart外设,在开启uart的时候需要操作clk寄存器,而REE侧的驱动程序可能也会操作clk寄存器。两者如果同时修改了,冲突了,怎么办?
optee的spinlock和mutex有什么区别?
optee系统里没有sleep函数,也没有schedule函数,那optee的mutex会让出CPU吗
13-大系统的的同步机制
在不同的操作系统之间,如何实现spinlock?
在不同的master硬件之间,如何实现spinlock?
14-optee线程管理
optee os中是否有进程、线程的概念?
optee os中的thread该如何理解?
optee os中是否有调度?
optee os中线程是如何切换的?
线程切换或调度的本质是什么?它依托的硬件基础是什么?
15-optee中的线程调度
1、optee中支持多核吗?支持多线程吗?线程是怎样切换的?
2、TA中呢,TA中是否支持多线程?
3、你为什么会问TEE是否支持多线程?想必你想问的是TA中是否支持多线程吧。
4、optee侧的线程之前如何调度的呢?
5、你能举一个TEE侧线程调度的示例吗?
6、optee中支持多核吗?支持多线程吗?线程是怎样切换的?
7、TA中呢,TA中是否支持多线程?
8、你为什么会问TEE是否支持多线程?想必你想问的是TA中是否支持多线程吧。
16-optee之大系统调度
cpu是如何在REE/TEE之间来回调度的?
当CPU在TEE OS中执行的时候,此时来一个想给REE处理的中断(如蓝牙中断),此时CPU是如何响应的?
CPU切入到TEE后陷入死循环不回来了,会影响到REE的调度吗?
多系统下如何分配CPU资源?如何做到来回切换的?
17-optee os的MMU的使用
让MMU工作的五大步骤,optee os中都是怎样实现设计的?
设置页表基地址TTBR(translation table base address)
初始化MAIR_EL3 (Memory Attribute Indirection Register)
配置TCR_EL3 (Configure the translation regime)
创建页表 (Generate the translation tables)
Enable the MMU
18-optee os的根密钥(信任根)
HUK到底是什么?HUK有什么要求?有什么特性?
一般情况下HUK都是怎么获取?经典的HUK获取的示例都是怎样的?
你能想到哪些安全地获取HUK的方法?
19-optee的系统调用
系统调用的本质是啥?什么是系统调用?
syscall、system call、utee call有什么区别?
linux kernel和optee os的系统调用有什么区别?
在函数调用的时候,传入的参数尽量小于等于8个的原理是啥?
系统调用是如何实现的?
20-optee的存储系统
TA之间的安全内存是如何隔离的?
不同TA之间的存储是如何隔离的?
如果有一个需求,TA1和TA2想使用共同的证书怎么办?
TA存储的最终的路径是在哪里?
optee os支持多少种方式的存储?
TA支持多少种方式的存储?
GP规范里定义了多少种规范的存储?
存储的数据,重新开机后会丢失吗?刷机或OTA后会丢失吗?格式化后会丢失吗?
如果想刷机或OTA后不丢失怎么办?如果想丢失又怎么办?
如果想格式化不丢失怎么办?如果想格式化丢失又怎么办?
在linux内核态,你想存储一个文件,如何做得到呢?在optee的内核,是否可以调用存储接口?
TA的存储是怎样通过uuid隔离的?Tee os内核的存储,没有uuid怎么办?
TA存储的数据是怎样加密的?FEK是怎样生成的?
TA存储的数据能否防回滚?怎样做到的?
21-optee的Timer实现
什么是monotonic time ?什么是 utc time?
TEE_GetSystemTime和TEE_GetREETime有什么区别?
optee的TEE_GetSystemTime的实现是否有问题?是否follow了GP规范?
如果想把TEE_GetSystemTime实现为utc + monotonic time? 需要进行哪些考量?
如果TEE_GetSystemTime的时间来自REE,如何抵御时间回滚的攻击?
当前optee中TEE_GetSystemTime的具
22-optee中密码学函数的支持
optee支持哪些密码学算法?
在optee中如何新增一个密码学算法?
在optee中,如何基础一个crypto engine?
optee中的tomcrypt和mbedtls有什么关系?到底在使用的哪个?
Optee的密码学算法,是运行在用户空间的,还是运行在kernel空间的?
分别使用Libtomcrypt和libmbedtls实现的密码学算法,是运行在userspace还是kernel space
Cryptographic Operations API
23-optee中的service和init程序
24-optee中的 PTA
什么是PTA?PTA和TA有什么不同?
optee中有哪些PTA?分别都是什么功能?
如何编写一个PTA呢?
PTA存在的意义是什么?为什么说PTA是连接用户TA和secure driver的桥梁?
25-optee中的 secure driver
什么是安全驱动程序?如何开发一个安全驱动程序?
安全驱动程序和普通的linux kernel的驱动程序有什么不同?
在安全驱动程序中,可以读写文件吗?可以调用加解密算法吗?
26-optee中的 Early TA
什么是Early TA?
Early TA和普通的TA有什么不同?
Early TA如何开发?如何使用?它的应用场景什么?
Early TA是如何打包的?如何启动的?
Early TA和embed TA有什么不同?
27-optee的栈指针和栈内存的介绍
什么是栈?什么是栈指针?什么是栈内存?
什么是栈溢出?
optee有哪些栈内存?分别是什么作用?
optee使用了哪些栈指针?为什么要这样设计?
optee有哪些类栈内存?分别都是多大?
堆和栈有什么区别?
在optee中是否有堆的概念?
28-optee中使用虚函数(平台客制化)的设计模型
什么是虚函数?
虚函数在操作系统中的意义什么?
在optee为何大量使用了虚函数?
29-optee的panic的实现
TEE_Panic函数是给谁用的?
TEE_Panic函数的具体实现是什么?
tee有没有主动panic的函数?
30-optee的socket的实现
optee是否支持socket接口?是如何实现的呢
optee是否支持TLS?是如何实现的?
31-optee的RPC技术
CA可以调用TA?那TA可以主动调用CA吗?
optee os内的程序是如何反向调用REE,其技术原理是什么?
为什么会有TA反向调用REE的需求?
optee反向调用REE的接口是否开放给TA?
在TA程序中如何实现反向调用?
32-optee的RPMB的实现
什么是RPMB?RPMB的重要意义是什么?
在optee os中如何集成RPMB?
RPMB的硬件工作原理是什么?
一般的TEE和TA中都是如何使用RPMB的?有什么标准规范吗?
33-RPMB协议
RPMB的读写最终落盘是在TEE中还是在REE中?
为什么说任何人任何程序都可以读RPMB?
写入RPMB的数据会被自动加密吗?
读写RPMB有什么标准规范吗?
34-RPMBmmc-util代码导读
35-optee的RPMB实现代码导读
36-CA_TA的开发模型
什么是TA?TA如何开发?TA可以第三方独立开发吗?
如何开发一个TA? sdk又是什么?
如何写一个TA的hello world程序?
第三方TEE如何开发TA?
37-CA到TA的调用
【面试必考题】CA到TA的调用流程是什么?
GP client API和GP internal API有什么不同?
在不同的TEE OS操作系统上都是如何开发CA/TA的?
38-TA和PTA的调用
什么是early TA?使用场景如何?
什么是PTA?什么是secstor TA? 什么是User TA ?什么是REE_FS TA?
CA如何调用到TA的?CA可以直接调用PTA吗?
TA如何调用到TA的?TA如何调用到PTA的?
PTA可以调用TA吗?
PTA可以调用CA吗?
TA可以调用CA吗?
TA或PTA想去调用Linux kernel space如何实现?
TA或PTA想去调用Linux Userspacce space如何实现?
39-uboot和TA的通信
uboot可以和optee通信吗?
uboot可以和TA通信吗?
uboot是如何调用optee或TA的?有没有标准的API?
40-linux kernel和TA的通信
在linux kernel中如何调用TA?有哪些API函数呢?
41-TEE虚拟化技术简介(场景)
单VM调用TEE模型
多VM调用TEE模型-直通
多VM调用TEE模型-代理
多VM调用多TEE模型
单VM调用多TEE模型
硬件隔离的多VM调用多TEE模型
42-TEE安全内存的保护
TEE怎么就是安全操作系统了的?
TEE所在的内存怎么就安全了呢?
TEE的安全内存是怎样硬件隔离的?
为什么说TEE是安全系统?TEE怎么就安全的?TEE是如何跑到安全内存中的?
TEE能够访问安全内存?那能否访问非安全内存呢?
在一个大系统中,哪些内存是安全的?
安全内存是如何划分的?由谁来管控的?
说一说以下的概念:安全内存、安全寄存器、安全外设
43-大系统的MMU隔离机制
在一个大系统中,有多少个MMU?
MMU和translation regime两者有什么区别?
当REE和TEE同时使用MMU的时候两者会不会冲突?
当软件强制修改MMU页表中的NS比特属性的时候,是否有安全攻击的可能性?
44-大系统的cache隔离机制
cache是否分为安全cache和非安全cache?
非安全数据的访问是否可以命中安全的cache?
非安全的cache和安全的cache是如何靠硬件隔离的?
cache里都有啥?TLB里都有啥?
45-TA的加载过程
TA是如何被加载到安全内存的?
TA是如何被验签的?
46-optee中属性的介绍
optee中也有属性的概念?都有哪些属性呢?
optee中的属性都是怎么使用的呢,常见的使用场景有哪些呢?
47-TA是如何校验CA的
TA也是可以校验CA的,常见的方法有哪些?
什么是LOGIN Flag,都有哪些用法?
如何设置TA只允许某个TA的调用?
48-共享内存的介绍
什么是共享内存?
共享内存的本质是怎样的?
optee中如何实现和REE的共享内存的?
什么是静态共享内存?什么是动态共享内存?
共享内存有多大?在使用时有什么上限吗?
49-TA链接静态库的方法
optee os支持静态库吗?
TA支持静态库吗?
在编译TA的时候如何link一个静态库?
如何讲一段代码编译出静态库?
50-optee支持动态库
optee os支持动态库吗?
TA支持动态库吗?
在编译TA的时候如何link一个动态库?
如何讲一段代码编译出动态库?
51-TA的签名和验签
optee中的TA是如何签名的?支持哪些签名算法?
TEE OS中是如何打包验签使用的公钥的?
能否同时支持多把签名密钥?
52-optee的标准错误码
optee os中的标准错误码是谁定义的?遵循什么规范?
CA侧和TA侧都有标准错误码,两者有何区别?
每家TEE厂商都是否完全follow标准错误码呢?
53-optee的TA防回滚技术
什么是放回滚技术?
optee_os是否支持防回滚?
TA是否支持防回滚?
storage是否支持防回滚?
secure time是否支持防回滚?
RPMB对防回滚的支持?
54-Multi instance和Multi Session
不同的CA调用同一个TA,会怎样?怎样迸发的?
什么是multi instance?什么是multi session?
什么是single instance?什么是single session?
如果配置multi instance或single instance?
如果是multi instance的TA,那么不同的instance TA之间能够共享数据吗?
不同的TA调用同时访问存储接口,是如何互斥的?
同一个TA的不同的instance,能够访问同一个存储吗?
对于一个single instance TA而言,是如何保障opensession不被调用两次的?
对于一个single instance TA而言,在CA的主线程重调用opensession后,然后多个线程开始同时调用invoke,这时TEE是如何互斥的,保障只有一个invoke能进来?
对于一个single instance TA, CA端同时发起两次的opensession的调用,第二次调用的结果如何?是卡住,还是报错?
55-optee plugins
什么是optee plugins?
optee plugins的本质和原理是什么?
optee plugins为得是解决哪些问题?
56-TEE LOG是如何打印的
optee的打印log是如何实现的?
在optee_os中的打印log函数是啥?有几种log输出级别控制?能否动态控制?
在TA中的打印log函数是啥?有几种log输出级别控制?能否动态控制?
那如何控制optee os的log输出呢?如何控制TA的log输出呢?
除了uart打印log方案,还有别的方案吗?
uart打印log方案中,串口终端会不会出现乱码,如何解决呢?
在optee启动很早期的,uart driver还没初始化呢,这个时候如果需要看log有什么办法实现?
在TA中关闭log后,TA调用到optee_os后,optee_os的log级别是否受TA的trace_level控制?
在TA中控制log的输出,到底是怎样控制的?是靠宏比较?还是靠底层C语言代码检查flag?
如何自己实现一套TA log的输出机制?尽量不依赖平台、不依赖os。
57-optee的dump stack
optee os有哪些调试技术?是否支持dump stack?
58-optee ftrace
什么是optee ftrace?
如何开启optee ftrace?
optee ftrace和linux ftrace有什么不同?
59-optee gprof
什么是optee Gprof?
如何开启optee gprof?
optee gprof和linux gprof有什么不同?
60-大系统的标准规范介绍
当前的主流软件框架是怎样的?有什么标准规范吗?
不同的SOC系统启动时有什么标准规范吗?
在运行状态跨系统进行电源管理时有什么标准规范吗