打印
[应用相关]

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

[复制链接]
1006|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


使用特权

评论回复
地板
公羊子丹| | 2024-7-21 07:25 | 只看该作者

但是,由于变压器存在漏感,

使用特权

评论回复
5
万图| | 2024-7-21 08:28 | 只看该作者

在此情况下我们通常会用电阻串联在电路中

使用特权

评论回复
6
Uriah| | 2024-7-21 09:31 | 只看该作者

缩合型灌封硅胶由于固化过程有体积收缩一般不使用在模块电源的灌封中

使用特权

评论回复
7
帛灿灿| | 2024-7-21 11:27 | 只看该作者

设备中的ESD静电阻抗器一般都不易老化损坏

使用特权

评论回复
8
Bblythe| | 2024-7-21 12:30 | 只看该作者

通过将各类分立元器件进行整合和封装,模块电源能够实现以最小的体积来实现功率密度更高的效果。

使用特权

评论回复
9
周半梅| | 2024-7-21 14:26 | 只看该作者

可对电路进行一个防护效果

使用特权

评论回复
10
Pulitzer| | 2024-7-21 15:29 | 只看该作者

以保护器件免受ESD的损坏

使用特权

评论回复
11
Wordsworth| | 2024-7-21 18:28 | 只看该作者

一端接地,滤去高频

使用特权

评论回复
12
Clyde011| | 2024-7-21 19:31 | 只看该作者

如果防护与热设计欠佳

使用特权

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

本版积分规则

549

主题

2383

帖子

4

粉丝