打印
[STM32L5]

STM32L5进阶课程系列 10.DMA,兼顾传输灵活性和TZ架构下的安全性

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

欢迎大家继续关注STM32L5的进阶课程,今天介绍STM32L5上的DMA,它有别于以往历代STM32产品的DMA,能为TrustZone应用提供安全而灵活的支持。





从STM32H7开始,后面的产品,G0、G4、WB,到现在的L5,DMA作为控制和传输通道,和DMA请求模块分开了,后者叫做DMAMUX。


DMA和DMAMUX,都是TZ aware的外设,它们都是以【通道】为单位,对自己内部的资源进行划分,有些通道划分给安全应用使用,有些通道划分给非安全应用使用。DMA作为AHB总线主设备,它还要负责管理发出到AHB总线上的transaction上的安全属性。这些都是L5上的DMA,新增的安全功能。这一集,我们就来展开介绍和讨论。





STM32L5上有两个DMA控制器,DMA1和DMA2,各支持8个传输通道。之所以说DMA控制器是TZ aware的外设,是因为DMA控制器把它自己的资源,以“通道” 为单位做了划分:每个通道,不是在安全世界,就是在非安全世界,由该通道的配置寄存器决定。芯片复位后的缺省状态,每个通道都是在非安全世界。


分配给安全世界的通道,它的寄存器大部分就只能由安全代码访问;每个通道还可以设置成特权通道,那么这些寄存器就只能由特权级别下的代码访问了,进一步提高使用系统资源的安全性。分配给安全世界的通道,它可以在AHB总线上,发出secure的transaction,也可以发出Non secure的transaction。后面我们有例程来展现这种灵活的用法,大家可以体会。


通道的安全属性,和特权属性确定下来之后,通道本身的意义,和以往的DMA控制器是一样的,根据该通道的传输请求,来把数据从源地址,按照一定的数据宽度, 搬移到或者说传输到目标地址。传输,可以由外设的某个事件发起,或者由软件触发。


外设发起一个DMA请求给到DMA控制器。DMA控制器,根据这个请求所对应的通道的优先级,来决定是否响应这个请求。如果确定响应,就发回给外设一个应答。外设一旦收到应答信息,就释放请求信号线。DMA控制器看到外设释放了请求信号,也就释放应答信号线。


哪个外设,或者什么事件,发出一个DMA请求,给到DMA控制器的哪个通道,这是和DMAMUX模块一起来完成的。






DMA控制器的安全规则,需要从两个角度来理解。一个是它作为AHB主设备,负责往AHB总线发出transaction;一个是它作为AHB从设备,被内核来配置寄存器。


一个通道负责传输或者搬移数据,需要从源地址发起一次读请求,再向目的地址发起一次写请求。也就是说,一次DMA搬移,是由一读、一写,两个transaction组成的。那么这两个transaction上携带的安全属性,由什么来决定呢?大家不妨先回忆一下CPU内核发出的transaction,它通过了IDAU/SAU的第一级检查,来到AHB总线上,这个transaction的安全属性是由什么来决定的?无论是取指访问还是数据访问,已经成行的transaction的安全属性,都取决于目标地址,在IDAU/SAU看来的安全性。


回过头来,DMA控制器里没有IDAU/SAU来帮它审查,当通过【通道配置寄存器】 里的SECM位域,把该通道配置成安全通道后,它所负责的传输,它发出的一读、一写,两个transaction的安全属性,分别由该通道配置寄存器里【SSec】和【DSec】来决定。也就是说用户通过设置这两个位域来决定。


当DMA控制器里的某条通道被【SecM位域】配置成安全通道,该通道的对应寄存器,对non secure的代码访问,就有了诸多限制。


比如,Non secure代码要读取安全通道的寄存器时,只能有效读到【SecM】和【Priv】位域,意思什么状态的代码,都可以知道该通道的安全属性和特权级别。但是读取其他位域,就是RAZ,read as zero了。甚至读取有些寄存器的时候,还会触发“非法访问”事件 。这是列举了一些non secure代码的读访问限制。对于写访问,首先写操作肯定是无效的,而且还会触发“非法访问”事件。






我们借用这张胶片来说明被配置了安全属性的DMA通道,如何管理一次数据传输所需的两个transaction。


这是一个安全的通道,我们用绿色的圈表示。在DMA传输请求的触发下,它先发起一个读操作,就是箭头指向它的两条线,如果Ssec=1,表示从源地址过来的读访问是安全transaction,即左边绿色的这条;如果Ssec=0,表示从源地址过来的读访问是非安全的transaction,就是红色这条输入箭头。


接下来写到目标地址的写操作,同样,根据Dsec=1或者0,可以是安全写访问,或者非安全的写访问,由一绿一红两个出去的箭头线表示。



无论是安全的transaction还是非安全的transaction,当它们要target到具体的物理区域,比如Flash、SRAM、外设寄存器,都要遵守数据访问在TZ环境下的访问规则,受到来自GTZC的审查,或者物理区域所在控制器的审查,如果它是TrustZone aware的话。’具体来说就是,安全的数据传输transaction,可以访问安全存储区,安全外设,非安全外设;而非安全的数据传输transaction,只能访问到非安全存储区,和非安全外设。





如果通道被配置成了非安全,这也是芯片复位后的缺省状态,一次数据搬移所需要发起的一读一写两个数据传输transaction就只能都是非安全的了。


从寄存器角度,当SecM=0, Ssec和Dsec都会强制处于清零状态。非安全的transaction只能触碰到非安全的存储区和非安全的外设。


由此可知,当需要在安全世界和非安全世界之间进行自动数据搬移,该DMA通道必须要是安全的通道。




使用特权

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

我们先来看一个STM32CubeL5固件包里预编译好的例子。这个例子是基于TZ环境下,因此有安全应用和非安全应用两个工程。安全世界里定义了三个数组,是下图右边的绿框部分;非安全世界定义了两个数组,是下图左边红框部分。例程使用了4个DMA通道,来对数据进行依次搬移,形成了一个数据流的链路,把5个数组挨个串了起来。


绿框表示的安全世界数组,都在安全存储区上,因此要能碰到这些地方的DMA通道,必须是安全通道。所以CH1、CH2、CH3都是安全通道。CH4负责非安全世界里的两个数组间的数据搬移,非安全通道即可。我们来看表格的前三行,CH1、CH2‘和CH3,它们都是安全通道,但是各自的Ssec和Dsec并不相同。


通道1,负责安全世界里两个数组间的搬移,Ssec和Dsec都是1,发起的是安全transaction。


通道2和通道3,负责安全存储区和非安全存储区之间的数据搬移,方向不一样而已。片上Flash和片上SRAM,在缺省模式下,是严格遵循TZ访问规则,即安全的地址只能被secure transaction触碰,非安全的地址只能被non secure transaction触碰。所以通道2和通道3的SSec和DSec,必须做相同安全属性的配置。‘


那么我们现在就来看一下STM32CubeL5软件包里基于Nucleo板子上的一个现现成的例子,在TrustZone环境下使用DMA做存储区之间的数据搬移。主要就是看看,在安全世界和非安全世界之间,如何使用DMA做数据搬移,在安全性方面要注意哪些问题。我们会着重考察例程里的通道2和通道3。





基于刚才这个参考例程,如果我们把通道2的一个参数:DSEC从Non secure改到Secure会怎样?


我们知道,通道2负载把安全世界里的数据搬移到非安全世界。它的下半场,write transaction,要触碰到非安全世界的SRAM,这个aDST_Buffer1是在非安全应用的堆栈空间,因此是位于片上SRAM的非安全区域。按照我们多次强调的,非安全SRAM区域只能被非安全transaction触碰。那么预测通道2的传输不会成功。我们把代码修改一下,运行一下看看。


那么第二个问题来了,如果DSEC就是设置成secure的情况下,怎能让这次DMA传输成功完成呢?我们来看看STM32L5 参考手册上的这一段话。它位于GTZC这一章的illegal access definition,非法访问的定义,这个章节里。





我们再看来看另外一个TrustZone环境下的DMA使用例程。


这里不再是M2M传输,而是更贴近实际应用的一个场景。通常加解密模块,Hash模块这些和密码学操作相关的硬件我们都把它们分配在安全世界,使得只有安全世界的代码才可以直接访问,利用TrustZone的先天具有的“硬件隔离”机制,对敏感的模块进行保护。而用户的业务应用通常运行在非安全世界。当需要对非安全世界的一段话或者一个消息进行Hash计算,就需要把这个非安全区域的消息,一个word一个word地送到Hash模块的DIN寄存器


。计算完成后,摘要值从Hash模块的HR寄存器组读出。非安全世界的应用,要启动一次填充Hash模块输入FIFO的DMA传输,必须也调用Secure API。例子里使用DMA2控制器的通道7来负责搬移。那么它的上半程,读操作应该是一个non secure的transaction,所以SSEC为非安全;而后半程的写操作,必须是一个secure的transaction。


了解了例程的用途,我们来看一下代码实现时需要的注意事项。





最后我们看一下DMAMUX。


DMA控制器负责在它的各个通道上进行数据传输,而提出传输请求这件事是由另外一个模块DMAMUX负责的。从胶片中的功能框图,可以看到DMAMUX的主体是右边的Request multiplexer,请求复用开关。这里面有16个独立的通道,分别连到DMA1和DMA2的对应输入通道。DMAMUX也是TZ aware的外设,和DMA控制器一样,每条通道要么被分配在安全世界,要么被分配到非安全世界。DMAMUX里通道的安全属性,由对应的DMA通道来决定。


DMAMUX每条通道的请求多路复用开关,它的输入有94条线可供选择。其中,90条来自外设事件,比如ADC,4条来自内部请求产生器。而内部产生器的触发输入又有22条,覆盖16条EXTI信号线、DMAMUX模块本身产生的事件,以及三个LPTIM的输出。这23条信号,位于框图的左下角,和框图左边90条外设信号,对于DMA传输请求复用开关的意义都是一样的,来自这些源头的事件,可以触发一次DMA主导的数据搬移。这23条信号线,还可以用来同步DMA传输请求的输出。


这些参数都可以在STM32CubeMX的图形界面中配置。需要强调,用户容易搞混淆的有一点:DMA传输的请求信号来源,和DMA请求传输的源地址和目的地址,是完全独立的。比如说我可以在在外部中断EXTI13的触发下,让DMA把数据从ADC1搬移到SRAM的数组里。这种使用场景,外部中断EXTI13就是DMA请求的信号源,需要DMAMUX来配置。而ADC1的DR数据寄存器和SRAM数组的地址,则是在DMA控制器对应通道的通道寄存器里配置。这些概念和使用方法和以往不带TrustZone安全特性的STM32 DMA和DMAMUX是一样的,这里不再累述。



关于STM32L5上DMA在TZ环境下的特点和使用注意事项,这一集就讲解完毕。





同步模式下,检测到了同步信号的边沿时,若有pending的request就会N次导到输出;


如果那个时刻,没有pending的request,后面来的request,不予理会,这个新的request,要到下次同步信号边沿到来时才处理;


同步模式下,没有检测到同步信号的边沿,即使有DMA请求输入,也不会导到输出


非同步模式下,有DMA请求就导到输出,只是每N次就会有一个事件产生





同步信号会可能产生overrun错误及中断;触发信号也可能产生overrun错误及中断;


由于DMAMUX按照通道来划分S和NS的资源,因此像状态寄存器、标志清零寄存器中,还有S和NS的位域混合在一起。


安全通道上的overrun 中断和非安全通道上的overrun中断,在NVIC输入上是两条不同的input line;在向量表中也是两个相邻的entry


使用特权

评论回复
板凳
Wordsworth| | 2024-7-21 07:29 | 只看该作者

模块电源选购灌封材料的时候,需要注意导热系数要能达到电子部件散热的需求,不过粘接能力不太强

使用特权

评论回复
地板
Clyde011| | 2024-7-21 08:32 | 只看该作者

A、B组分先分别用手动或机械进行充分搅拌,让A、B灌封料充分融合

使用特权

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

可能击穿开关器件,

使用特权

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

如果想要让它正常工作且不会损坏

使用特权

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

前模块电源灌封时用的最多的是加成型有机灌封硅胶

使用特权

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

电阻属于一个普通的元件

使用特权

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

并且考虑到TVS相同的尺寸

使用特权

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

当异常过压消失,恢复至高阻态

使用特权

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

微控制器、数字信号控制器和处理器都具有内部的ESD钳位二极管

使用特权

评论回复
12
童雨竹| | 2024-7-21 19:25 | 只看该作者

ESD电压一般超过导通电压

使用特权

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

本版积分规则

558

主题

2431

帖子

4

粉丝