打印
[应用相关]

STM32L5 进阶课程系列 08. SRAM、Flash和启动机制的最新安全特性

[复制链接]
652|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerantone|  楼主 | 2023-11-27 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

欢迎大家来到STM32L5进阶课程,希望之前你已经完成了对STM32L5入门课程的学习。在第一季中,我们主要从Trustzone‘’的角度,认识了STM32L5和以往STM32系列产品的不同。从应用的软件设计角度,到新的编程模型的体验,STM32L5给我们打开一个新的世界。


在这一季的课程里,我们继续围绕STM32L5的安全特性展开。一方面,通用外设模块,比如SRAM、Flash、DMA,虽然基本功能大家已经非常熟悉,但是在TZ使能和L5新平台的环境下,这些基础通用模块,又有了安全方面的进一步功能延展。另外一方面,ICACHE、OTFDEC是L5新引入的模块,也会在后续的产品中继续集成。我们在本季课程里,会对这些新外设做详细介绍,另外我还设计了丰富的动手环节来帮助大家体验和理解。PKA,通俗的讲就是非对称加解密硬件引擎,不算是首次出现在STM32产品中,在L5之前,WB系列也集成了它。


我们先来看SRAM、Flash和Boot这三个最基础的通用模块,在L5上有哪些新亮点。


SRAM

SRAM还是分成两块,192K的SRAM1和64K的SRAM2:逻辑上,地址连续;物理上,作为两个AHB slave设备,分别挂在AHB 总线矩阵的两个slave端口,这和以往的STM32 SRAM没有什么不同。但是呢,在TZ环境下,我们的SRAM不是TZ-aware的外设,因此在AHB总线矩阵和SRAM之间,有一个“门神” – MPCBB,来把整个256K SRAM区域,按照用户的需求,分成不同的区域,有些是安全区域,有些是非安全区域。然后对target到SRAM不同地址的AHB transaction进行判断,是否合法,合法就放行,给到SRAM,让它做响应的应答;否则就触发illegal secure 事件。


除此之外,SRAM2还有一些额外的、独立于TZ环境的安全特性。这一部分和以往的产品系列保持一致,在此不再累述。


TZ使能的环境下,IDAU的出现,给同一块物理区域,定义了“安全别名地址” 和“非安全别名地址”,使得内核对同一个物理区域,以不同的地址去发出访问请求,可以产生安全属性不同的两种transaction。和以往的STM32 SRAM一样,L5的SRAM1和SRMA2占据了从0x2000 0000开始的地址,在IDAU眼中,这是SRAM的非安全别名区;而在0x3000 0000开始,是SRAM的安全别名区。


另外,SRAM还被定义在了0x0A00 0000开始的,内核眼里的非安全CODE区域,和0x0E00 0000开始的,内核眼里的安全CODE区域。


不考虑TZ,或者TZ没有使能的情况下,当CPU从以前的0x2000 0000地址访问SRAM,走的是S-bus;而从0x0A00 000地址访问SRAM,走的是C-Bus。


【】翻到前一页的矩阵图【】


如果我们把代码放在SRAM中运行,走C-bus,可以享受到ICACHE的缓冲。大家会问,SRAM本来就是0等待周期,放在ICACHE里运行,并不会给访问速度带来明显提升啊?但是我们看到ICACHE是挂在内核出来,还没到AHB总线矩阵。代码在这里取指执行,不需要经过AHB总线矩阵。避免了内核和DMA这两个不同主设备同时访问一个从设备,所耗费的仲裁和开关切换时钟周期。


在STM32L5环境下,对同一块SRAM区域,至少有两个地址别名,0x2000 0000开头和0x0A00 0000开头。如果还使能了TZ,则额外还有0x3000 0000和0x0E00 0000两个别名地址。


BOOT

接下来看启动。

最早的STM32就支持片上Flash首地址、片上SRAM首地址、以及内嵌在系统Flash的bootloader,三个启动地址。通过选项字节或者Boot引脚电平来决定到底从哪里启动。


到了F7,用户可以通过新增的选型字节,来配置从片上Flash、片上SRAM的任意地址启动。


到了L5,TZ未使能的情况下,这三种启动地址继续支持,和以前一样。TZ使能的情况下,系统Flash内嵌的普通bootloader启动方式换成了系统Flash内嵌的RSS启动。三种启动方式,大体上还是一样:


>> 片上用户Flash任意地址


>> 片上SRAM任意地址


>> 系统Flash内嵌的bootloader,根据TZ的使能情况,分为Non-Secure information block中的普通bootloader和Secure Information block中的RSS + 普通bootloader两种固化bootloader启动序列。

先来看L5在Trustzone没有使能下的启动情况,即TZEN这个选项字节保持出厂默认值:0:。这种配置下,启动系列和F7、H7类似。


芯片复位后,硬件装载选项字节,根据nSWBOOT0的值,判断下一步是去看BOOT0,即PH3引脚的电平,还是去看另外一个选项字节nBOOT0的值,从而进入四个不同的分支,如图所示。


BOOT0/PH3引脚,在上电过程中是先是处于输入状态,便于系统采样其上的电平。在选项字节装载完毕后,如果nSWBOOT1值为0,表示将继续从选项字节nBOOT0那里去判断如何启动,即使复位过程还没有结束,PH3引脚会自动切换回模拟状态。


如果nSWBOOT1值为1,表示会从PH3引脚电平状态来判断如何启动,则输入状态会保持到复位结束。之后才会自动切换回模拟状态。


四个分支,其实也最终落到两种状态,使用选项字节NSBOOTADD0或者NSBOOTADD1里的值,作为启动地址,赋给PC指针。选项字节在芯片出厂后的缺省值,就分别是用户Flash首地址0x0800 0000,和普通bootloader地址0x0BF9 0000。用户也可以自己随意设置,从而达到从片上Flash、片上SRAM任意地址启动的目的。


在RDP2的情况下,由于只能从用户flash启动,不允许从SRAM或者bootloader启动,因此NSBOOTADD0和NSBOOTADD1选项字节值只能在512K用户片上Flash的地址空间里,否则就是非法值,硬件会忽略非法值,而强制从用户片上Flash首地址0x0800 0000启动。


//默认,怎么组合都不会从SRAM启动,除非用户在NSBOOTADD0或者1中,写入0x2000 0000处地址

使用STM32CubeProgrammer,调整选项字节,nSWBOOT0、nBOOT0,NSBOOTADD0、NSBOOTADD1的值,通过观察PC复位时的值,核实启动地址。

当STM32L5上Trustzone使能后,即TZEN=1,启动的路径和判断条件,更加灵活,如图所示。


系统会先去判断选项字节BOOTLOCK的状态,如果是1,就直接从SECBOOTADD0选项字节中获取启动地址。若是0,再去判断RSSCMD寄存器的值,非空,就从RSS首地址启动,0x0FF8 0000。RSSCMD寄存器为空,再去看nSWBOOT0选项字节,后面的判断顺序和TZEN=0时类似,即蓝色虚线框的那部分。


看起来有6种分支,但是落实下来其实也就是2种启动地址,一个是SECBOOTADD0选项字节里的值,一个是系统Flash中固化的RSS安全启动代码。


需要强调的有两点:首先,Trustzone使能的情况下,L5的启动地址,必须是处于安全区域。RSS首地址0x0FF8 0000不消说了,从IDAU看来就是安全地址空间,SAU无需怎么设置,CPU看出来都是安全地址空间。在实际物理flash这一段,L5固定这一段区域是安全区域。因此从TZ环境下的CPU访问规则来看,RSS启动是确定无误的安全空间,没有问题。另外一个可能的启动地址,有SECBOOTADD0这个选项字节来决定,TZ使能后,这个选项字节的缺省值是0x0C00 0000,从CPU看出来是安全地址空间,从片上Flash实际的安全配置,我们要通过后面介绍的选项字节来把用户flash首地址配置成安全区域,整个TZ访问规则才能确保0x0C00 0000启动在安全区域里。 要强调的第二点,Boot_Lock这个选项字节,一旦设置后,***生效,无法撤销。类似RPD级别设置到2后,就***保持。并且,SECBOOTADD0选项字节的值也无法修改。就是说,STM32L5就***只能从固定那个地址启动了。

Trustzone使能情况下,系统对安全的防护有了很多升级。RDP在以前的RDP0、RDP1、RDP2基础上,新增了RDP0.5。只要RDP级别非0,用户可以操作的选型字节SECBOOTADD0的值,就有了限制:只能是用户片上Flash的512K地址空间,并且要是以0x0C00 0000开头的安全别名地址。这意味着,从SRAM启动不被允许。RDP0.5下的其他访问限制,我们在后面讲Flash的安全特性时再展开。

FLASH CONTROLLER

来看片上Flash。


片上Flash的结构、以及在系统架构中的位置,和以往的STM32产品一样。它由Flash接口控制器和Flash存储阵列组成。


Flash控制器,处理来自AHB总线矩阵的访问请求,管理CPU或者DMA这些AHB总线主设备对Flash存储阵列的读、写、擦除等操作。在TZ使能的情况下,Flash控制器是一个TZ aware的外设,因此它可以识别AHB访问中的secure或者non-secure属性,做出相应应答并采取对Flash存储阵列的后续操作。


片上Flash的保护机制,除了以往的RDP读保护、WRP写保护,在TZ使能情况下,还有HDP等和trustzone紧耦合的区域保护机制。我们后面展开来讲。

片上Flash的结构、以及在系统架构中的位置,和以往的STM32产品一样。它由Flash接口控制器和Flash存储阵列组成。


Flash控制器,处理来自AHB总线矩阵的访问请求,管理CPU或者DMA这些AHB总线主设备对Flash存储阵列的读、写、擦除等操作。在TZ使能的情况下,Flash控制器是一个TZ aware的外设,因此它可以识别AHB访问中的secure或者non-secure属性,做出相应应答并采取对Flash存储阵列的后续操作。片上Flash的保护机制,除了以往的RDP读保护、WRP写保护,在TZ使能情况下,还有HDP等和trustzone紧耦合的区域保护机制。我们后面展开来讲。


STM32L5的片上用户闪存有512K空间,支持双bank模式。单bank模式下,128个page,每个page 4K字节;双bank模式下,128个page,每个page 2K字节。这512K空间是用户可以自主执行读、写、擦除操作的;除此之外,还有32K只读的代码空间,是STM32芯片出厂预置了bootloader的。这一部分,和以往STM32芯片没有什么不同。唯一的区别就是不同系列产品里预置的bootloader版本会不断提升,并且不同产品系列里的bootloader支持的通信接口会有稍许区别。在STM32L5的32K 系统内置bootloader里,我们支持uart,i2c,usb, spi等通信接口,还是相当丰富的。关于系统内置bootloader的详细信息,可以参见著名的AN2606文档。


OTP,512字节,也是属于片上Flash的某块区域,顾名思义,具有一次性编程的特性,常用于存放产品序列号,产品公钥哈希值等需要保证内容不被修改,但是无需保密的数据。


STM32L5的选项字节,操作流程和使用方法同以往STM32产品相同,唯一不用的地方在于,L5里的选项字节只在Flash接口寄存器中,用户可以访问。除此之外,它本身不像以往的STM32系列那样,在flash中有直接的地址映射。所以用户只能通过flash接口寄存器去访问选项字节的内容


使用特权

评论回复
沙发
powerantone|  楼主 | 2023-11-27 15:53 | 只看该作者

STM32L5在片上flash还预置了一部分代码,即10K的RSS。这是以往STM32产品所没有的。它和系统内置的bootloader一起,可以为用户提供安全的启动服务;RSS本身还用于SFI等和安全相关的服务中。RSS的功能,仅在TZ使能的情况下可用。

STM32L5产品的主打特性之一就是:security、安全。Flash又是所有应用都会涉及的模块,它作为系统安全的基石,提供了丰富的安全相关特性,从这张胶片可见一斑。图里的安全特性,有两种图标,灰色的特性,和以往STM32系列一致,保持兼容;绿色的是TZ使能后才具有特性。我们从上往下看:


>> WRP,写保护,和以往一样,基于起始地址和结束地址来划分出被写保护的区域。以往有的产品是基于flash上的page为单位指定写保护的区域,更加灵活。


>> RDP,读保护,新增了RDP 0.5,在该状态下我们只能对非安全区域进行调试。以往的RDP降级,会造成“mass erase”,即“全片擦除”。L5中新增了RDP0.5,RDP降级中,降到RDP0.5的,叫做“partial mass erase”,顾名思义,会擦除片上Flash非安全的区域,因为在RDP0.5,是可以调试NS区域的,因此降到RDP0.5,为了保护代码的安全,非安全区域会把硬件擦除。另外,Trustzone的撤销,必须伴随着RDP降级带来的“全片擦除”来实现。


>> Secure region,HDP区域,都是512K片上用户flash里,仅能被安全的AHB访问。Secure region可以通过选项字节SECWM,或者Flash接口控制器里的寄存器SECBB来设置。HDP区域的范围是在选项字节里设置,但是使能“隐藏保护” 这个功能,还是需要通过寄存器去设置。


>> 前面讲片上Flash的存储阵列时,提到的10K RSS就是这里的“secure system memory”。它在物理flash上固定就是安全区域,在memory map的角度,它被映射在0x0Fxx xxxx开头的地址,因此从内核看出来对RSS代码的访问是安全的AHB transaction。RSS提供的主要服务之一就是SFI,另外还提供了API供用户代码来使能对“HDP安全隐藏区域”的保护。


// By default, All Flash memory is secure. When the TrustZone is active, additional security features are available: • Secure watermark-based user options bytes defining secure, hide protection areas • Secure or non-secure block-based areas can be configured on-the-fly after reset • An additional readout protection: RDP level 0.5 • Erase or program operation can be performed in secure or non-secure mode with associated configuration bit.

Flash上这么多新增的安全特性都是在TZ使能状态下才有的,而STM32L5芯片在出厂时,TZ是不使能的。用户需要选项字节的设置来使能它。


当需要做一些无需TZ特性的,其他功能模块的验证时,比如尝试STM32CubeL5固件包里PKA例子。这些例子都是基于没有使能TZ的L5 DK板子的。那么就需要撤销TZ在选项字节里的设置。


TZ的撤销,必须通过RDP降级造成的全片擦除来同时完成。如果像使能TZ那样,仅仅去操作TZEN选项字节,是无法做到TZ撤销的。这个和以往在L4、F4上面的PCROP撤销有点类似。但是L5有两个需要大家特别注意的地方:一个是:TZ使能,且RDP不为0的状态下,只有内核处于非安全状态,调试端口才能连接。还有就是:RDP降级只能通过bootloader和调试端口来完成,就是说用户代码无法完成RDP降级。


所以呢,如果我们现在使能了TZ,即使没有设置读保护,RDP=0,为了撤销TZ,还是需要把读保护级别先升高到RDP0.5,或者RDP1。升级之前,一定要确保MCU复位后,运行的程序可以跑到NS状态。无论是从用户Flash启动跑自己的代码,还是从系统Flash启动跑secue bootloader,总之要能跑到稳定的NS代码区。那个时候CPU是稳定处于non secure状态的,调试器才可以连接上去,进一步修改选项字节,来把RDP降到0,同时TZEN从1改到0。

在此,我给大家演示一下撤销TZEN的实际操作。

我们继续回来看片上用户Flash。上一季课程,包括前面的概览介绍,我们多次提到STM32L5的flash控制器是TZ aware的外设。一方面,从寄存器角度,它可以把512K存储阵列空间,分成安全的一些区域,和非安全的一些区域;一方面,Flash接口控制器对过来的AHB transaction进行考察,根据该transaction的安全属性,和该transaction要访问的flash区域的实际安全属性,来判断该次访问是否合法。判断的细节,在本集课程的最后一张胶片的表格里有详细展示。


这里我们要引入的概念是,Flash寄存器有些是NS的,有些是S的。NS的寄存器,安全世界代码和非安全世界代码都可以访问;而S的寄存器,通常只能由安全世界代码访问。


胶片里左边是非安全的寄存器;右边是具有安全属性的寄存器。上面一个表格,就是普通的寄存器;下面的表格是对选项字节做设置的寄存器。


在TZ使能的情况下,通过SECWM或者SECBB寄存器划分出了512K片上flash的安全区域和非安全区域后,对安全和非安全扇区的操作,就分开由两套寄存器来掌管了,包括【】【】键值寄存器、控制寄存器、状态寄存器。


而【】【】启动地址寄存器,如果TZ没有使能,则是NSBOOTADD0和1两个起作用;TZ使能的情况下,SECBOOTADD0寄存器起作用。

512K 片上flash空间,有两种方式来划分安全和非安全区域的方式。选项字节,使用water mark的方式,划出安全区域起始和结尾地址。不在指定范围内的区域,就是非安全区域啦。寄存器SECBB,使用block base或者说page base的方式,来提供动态并且更加精细的区域调整机会。寄存器的设置,虽然上电只能使用缺省值,需要代码运行到设置的时候才能生效,但是它的有点在于灵活,可以动态改变一个区域的安全属性,前提是这一块区域在SECWM选项字节中设置的是NS。原因很简单,一个区域的最终配置结果,取决于SECWM和SECBB的共同作用,并且Secure这个属性最高,只要有一方把一个区域设置成了S,另外一方是无法通过NS的设置,来扭转最终的结果;只有一方设置成NS,另外一方才可以通过也是NS来保存该区域的NS属性,或者通过S来改变成安全区域。


通过以上两种方式,可以设置,当然也可以修改一个区域的安全属性。那么随之带来的一点,当一个区域从安全区域,切换成非安全区域,它里面的内容,硬件是不负责给擦除的。需要用户根据实际需要,采取对应措施。


如果是通过选项字节静态切换,只需要用户代码先做目标区域的擦除,设置新的选型字节值,启动OB_launch让选项字节生效,随着带来系统复位。


如果是通过寄存器动态切换,用户代码擦除了目标区域后,在通过寄存器改变该区域安全属性之前,要清空指令cache,再紧接一个ISB指令。选择字节的改变会自动触发系统复位,也会同时情况cache,所以无需人为刻意去操作一下。

我们现在来跑一下STM32CubeL5软件包里的一个例子,体会一下Flash的安全扇区和非安全扇区的操作,以及动态调整一个扇区安全属性的方法和注意事项。


系统上电后的复位状态,flash的区域划分,由选项字节决定。这个例子和上一季大家熟悉的gpio_toggle例子,是一样的设置:前一半,256K,安全,后一半256K非安全。如左图所示。


复位后先运行s.bin,即安全项目的代码。由于现在CPU运行的是安全代码,处于安全状态,所以可以操作SECBB这个寄存器,来把bank1的后面118个本来处于非安全区域的扇区改成安全的扇区。然后就可以对这些安全扇区做擦除,和编程,写入特殊值,然后读出来。


安全代码执行完毕,跳转到非安全代码执行,即中图的ns.bin。它也试图去读取bank1刚才被改成安全扇区并写入特殊值的地址,我们会看到读出的是0,显然没有有效读出来。道理很简单,此时CPU运行非安全代码,处于非安全状态,必然无法访问安全地址的flash。那怎么办呢?是不是也可以通过SECBB寄存器,再动态地把写了特殊值的这段区域再改回非安全的属性呢?可是可以,但是我们知道SECBB这个寄存器是具有Secure属性的,只有安全代码才可以操作它。所以在执行ns.bin的时候,我们无法直接访问到它,需要通过安全世界暴露出来的API访问。

512K的用户片上Flash,除了配合TZ而划分出安全区域和非安全区域,ST进一步加强了片上Flash特别敏感扇区的安全性,就是这里要介绍的隐藏保护区域。这个特性,在L5的参考手册文档里叫做“secure hide protection area”,简称HDP,Secure表示HDP的区域,一定要是在TZ架构下划分出的Secure区域里。本来在TZ的硬件隔离机制下,已经分隔出了安全区域和非安全区域。HDP区域的出现,是在安全区域内部,进一步作出隔离,划出关键区域。


HDP区域的设置和使能,是通过选项字节设置。注意HDPEN使能了,只是说设置好了这样一个HDP区域,还没有表示该区域的保护开关打开。而HDP区域的保护开关,是有寄存器HDP_ACCDIS (access disable)控制的。一旦HDPxACCDIS=1,对该区域的任何访问都被禁止,直到系统复位。系统复位后,只要没有跑到软件设置ACCDIS之前,HDP区域都是和普通的安全扇区一样使用。对HDP区域使用的通常过程是这样的:


先通过选项字节设置好HDP区域的范围,


【】【】系统启动,执行HDP区域里的代码


【】【】调用RSS lib中的退出HDP区域函数,来置位ACCDIS,从而将该区域隐藏起来,直到系统下次复位


【】【】RSS lib里退出HDP区域这个函数,执行完毕后会跳转到HDP之外的安全区域继续执行用户代码,跳转到目标地址,是在第二步用户代码调用RSS lib函数时就参数传递过去了


【】【】HDP区域保护生效后,执行用户安全代码,也完全访问不到HDP区域了,无论是读、写、还是执行代码。


因此,HDP区域,通常是从系统复位的首地址开始,即上电就运行的一段非常关键的代码,比如安全启动,检查当前系统的安全措施,设置相应安全功能,校验下一步要运行代码的合法性。系统的一些机密信息,比如密钥,通常也会放在HDP区域里。在执行完初始的安全启动后,这段区域里的代码,数据都随着HDP保护的生效,隐藏起来,消失在大家的视野里。


这也就是为什么,第二步,当执行完所有敏感操作,要开启HDP保护,需要调用RSS lib里的API来完成。因为启动关闭HDP的代码,是HDP区域里执行的而最后一句话,它自己不可能把自己所在的地方关闭。当然,逻辑上,你是可以站在比如page8的首地址执行代码,把前面的page,0~7的区域用HDP保护起来。你执行的代码所在去区域不是将要被保护的区域里面,那没有问题。但是实际应用中,不会这样做,这会带来潜在的安全风险。大家可以自己想一想为什么。

10K的安全系统存储区,有别于512k可供用户使用的用户flash存储区;是和bootloader一样,芯片出厂前就在这里预置了类似ROM service的功能代码,只能被执行,不能被修改;但是这里固化的service,它和普通的BL又不一样在于,它主要着眼于提供安全相关的服务。前面提到的RSS(信任根服务)还有打开HDP区域保护开关的API,都是存放在这块区域。


RSS区域首地址存放的代码,做的事情,是给系统BL分配Non Secure资源,然后跳转到普通系统Bootloader去执行;其他安全功能,或者说RSS打算暴露出来给你用的功能,就以API的形式,在存放系统bootloader的Non Secure区域,以RSSLIB_PFunc结构体变量,通过函数指针员,供NS和S世界的代码调用。


这个结构体的地址在0x0BF9 7F40,大家有兴趣可以看一下这里的结构体,每个函数指针的值。前面8个是RSS 安全区域代码,暴露给NS世界调用的,红色字体表示;因此你去看任意一个函数指针指向的地址,会看到第一条就是熟悉的SG指令。RSS安全区域代码,给Secure代码调用的一个API,就是CloseExhitHDP,正是前一页胶片说的,调用RSS lib里的函数来把某段HDP区域保护开关打开。 从用户应用代码角度,我们只要通过RSSLIB_PFUNC这个结构体全局变量,调用对应函数指针即可实现。


安全系统储存区,RSS,这些都是STM32L5新引入的功能,我们现在暂且先了解这么多。后面在下一季,STM32L5的高级课程,讲到SBSFU、TFM和SFI的时候,我们再详细展开。

512K 片上用户Flash的WRP写保护,和以往的系列没有什么区别,并且和是否STM32L5使能了TZ也没有关系。因此这里不再累述。


使用特权

评论回复
板凳
powerantone|  楼主 | 2023-11-27 15:53 | 只看该作者

读保护:首先,保护的范围或者说对象,进一步扩展了,新增了对外部Octo-SPI flash上,被OTFDEC设置了的区域。那么,在RDP不为0时,除了用户flash上运行的代码之外,其他方式都无法读访问这些片外区域。因为它们是保护的对象,因此在发生RDP降级时,这些片外区域在OTFDEC模块对应的密钥,会被硬件擦除。这个特性,我们在后面OTFDEC那一集来实际操作体验。


TZ使能的情况下,RDP新增0.5级别,调试器仅能调试Non-secure世界的代码;RDP非0级别时,SRAM启动无效。

由于新增了RDP0.5,从RDP1退到RDP0.5,叫做“partial mass erase”,芯片会自动擦除 用户片上Flash上由选项字节通过Water mark方式定义的非安全扇区。即使这块地址会被寄存器配置成安全区域,也于事无补,一样会被擦掉。


TZ使能下的RDP回退,只能通过调试接口,或者系统BL完成。启动RDP回调前,要先invalidate ICACHE,否则回退无效。
这是和TZ未使能,或者以往的STM32产品系列不一样的地方。

这张胶片总结了在TZ使能情况下,4个RDP级别,RDP0、RDP0.5、RDP1、RDP2,彼此的转化关系。


RDP2,一旦到了,就无法回退。


从0.5降到0,从1降到0,都会触发full mass erase,全片擦除;


从1降到0.5,触发的是部分扇区擦除,仅擦除选项字节定义的非安全区域。

这两张胶片里的表格,总结了在TZ使能和未使能情况下,不同RDP保护级别时,不同执行条件或者说执行上下文,对不同保护对象的保护措施。


前面提到过,TZEN=0时,L5的RDP读保护和以往的产品基本一样,就是在受保护对象方面,增加了最后一行,被OTFDEC保护的Octo-SPI flash区域。

TZ使能后,首先读保护级别新增了RDP 0.5。这个级别的保护下,运行用户flash里的代码,或者运行系统BL里代码,能够访问到哪里,只是受TZ的限制;而调试模式下,只能调试NS世界的代码。


TZ使能后,读保护和以往芯片系列不一样的,还有一点,就是RDP级别非0时,不再支持从SRAM启动。

STM32L5上的选项字节,用户编程、修改的流程和以往一样,不同的地方在于L5中,用户只能通过flash控制接口里的寄存器来配置和读取当前选项字节的配置,没有像以往STM32那样,能够在系统Flash中,从分配给选项字节的地址读出当前选项字节的配置值。


STM32L5芯片出厂时,TZ=0;随着TZ使能后,选项字节方面会多出几个控制域,主要集中在对512K片上用户Flash 安全扇区以及HDP隐藏保护区域的范围设置和功能使能。我们可以通过STM32CubeProgrammer方便的查看和修改选项字节的值。但是有些选项字节之间有依赖关系,比如要修改DBANK配置,从单bank改成双bank,或者从双bank改成单bank,需要先把Flash上的安全扇区的保护都关闭,即:使用water mark或者block based方式保护的Flash安全扇区,先关闭保护。


其他选项字节之间的依赖关系,详情请大家参考STM32L5的参考手册,Flash那一章选项字节小结里的具体描述:Rules for modifying specific option bytes


这张胶片里截了三张图,就是当TZEN从0切换到1后,从STM32CubeProgrammer界面里多看到的部分。初次切换过来,虽然选项字节都使能了一些出来,可供用户配置Flash具体扇区的安全性,但是在没有配置之前,缺省状态是:全片都是安全扇区,但是没有在安全扇区里进一步隔离出隐藏保护区域。



最后我们再回顾并总结一下对片上Flash的访问规则。整个访问链路,从内核发起访问请求,到target到flash具体地址,有两级检查。


第一级检查是在内核里面,有SAU和IDAU来判别,当前发起的transaction是否合法。对于取指令,第一级总是可以放行;对于取数据,当CPU处于非安全状态,但是企图访问安全区域,该transaction被第一级检查就截断。


第一级检查放行后,transaction来到AHB总线上,接收第二级检查,这个阶段就取决于真实物理设备自己的安全设置。这些设备要么是TZ aware的外设,知道如何处理过来的transaction携带的HNONSEC信号,要么这些设备受GTZC的管理,有GTZC来帮助它们判断,如何处理过来的transaction携带的HNONSEC信号。


对于片上Flash,它的接口控制器是TZ aware的,它就根据胶片里的表格来判断, Secure或者Non-secure的transaction,访问 安全或者非安全扇区时,在不同RDP级别下的规则。大体规则就是:安全访问,只能触摸到安全page;非安全访问,只能触摸到非安全page。


除了安全扇区属于Flash上的安全资源,Flash接口寄存器里有些是属于“安全选项字节”,它们也是属于安全资源。


STM32_Programmer_CLI.exe -c port=swd mode=hotplug -ob displ


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

418

主题

1572

帖子

4

粉丝