当硬件介入以后
很多时候由于提高运行效率,或者增强安全设计的考虑,硬件也会介入到安全固件的设计中。这样中断机制设计就成为不可缺少的一个部分。中断的处理基本上可以分为两个阶段,第一个阶段是硬件仲裁优先级以后硬件直接跳转的入口,通常被称为Vector,第二个阶段是在这个入口中的行为触发的不在这个Vector上下文里执行的行为。第一阶段由硬件来保证触发的实时性,第二阶段则由软件设计来决定延迟,通常实时性无法得到有效保证。根据软件设计的需求不同,第二阶段可以是可选的-有些设计会在第一阶段做完所有的事情。这两个阶段可以用FLIH(First Level Inetrrupt Handler) 和 SLIH(Second Level Interrupt Handler) 来表示。
PSA FF的要求
PSA FF的设计重点在SLIH。要求在FLIH中设置相应的信号,使得正在等待(psa_wait)的主线程得到信号并处理中断。这种模型的目的是让安全服务的开发者不用太操心中断的配置和处理,代价是针对中断的特别处理和设置,被交给了平台代码,即一个平台设计的时候,每个中断的行为基本上是固定的。TF-M IPC Model遵从这样的设计。
在TF-M的精简模型Library Model中,由于Library Model并无信号的概念,所以大部分的事情在FLIH中操作。为了潜在的隔离需求,还利用了M系列的一些特性,使得执行能够在安全分区的主线程的上下文环境中执行但同时保持中断的优先级。这样做的目的是,在隔离的情况之下,使用内核的FLIH操作安全分区提供的数据缓冲并不是一个很安全的做法,所以要设法将FLIH的一部分和安全分区相关的执行迁移到安全分区的范围内。关于这部分的实现的解释,可以参考这本书(Figure 23.4附近的章节):
https://www.eecs.umich.edu/co...
其中有Figure 23.4是错误的,Arm为这本书有一个勘误页(751项):
https://community.arm.com/dev...
FLIH和SLIH之间的原子操作
FLIH和SLIH之间的原子操作不同于普通的多线程和多核的原子操作,相对更加简单:
- FLIH中不能等待,所以它一定要能知道是否正在进行原子操作,而且能够解除或者调整正在进行的原子操作。
- SLIH需要知道当前的原子操作是否成功才能决定是否进行存取。
在V6/V7的M Profile中并没有提供特殊的指令保证这些,而V8M中提供的STL/LDA是为了Memory Order而提供的,而STREX/LDREX则更像是为了多核而提供的,并不能完全的应用在这个场景上,或者是应用在这个场景上,并不比关闭中断保证原子操作来的节省效率。而在实时性要求比较高的M Profile上,关中断不是一种建议的方式,你需要衡量在最差情况下需要关多少次中断,带来多大的延迟来决定在某个点关中断是否可被接受。