woshi_ziyu
发表于: 2017-6-7 15:36:53 | 显示全部楼层

译者注:本文翻译自RM0351: STM32L4x5 and STM32L4x6 advanced ARM®-based 32-bit MCUs  Rev 5。如有错漏,敬请指正。英文版官网下载地址:en.DM00083560


4        防火墙(FW)

4.1        简介

防火墙用于保护非易失性存储器中的特定部分的代码或数据,和/或保护SRAM1中的易失性数据,免受在保护区域外部执行的其余代码的非法访问。


4.2        防火墙的主要功能

•        防火墙保护的代码(代码段)可能位于:

–        Flash存储器

–        SRAM1存储器,如果在防火墙配置步骤中被声明为可执行保护区域。

•        要保护的数据也可以位于

–        Flash存储器中(非易失性数据段)

–        SRAM存储器中(易失性数据段)


防火墙打开后,软件可以访问这些保护区域。可以通过使用基于“call gate”机制打开或关闭防火墙(请参阅打开防火墙)。


在启用防火墙之前,必须配置每个段的起始地址及其各自的长度(请参见第4.3.5节:防火墙初始化)。


每次非法访问这些受保护的段(如果启用了防火墙),将产生一个复位,立即杀死检测到的入侵访问。


不管防火墙处于何种状态(打开还是关闭),任何DMA访问受保护的段都是禁止的。这会认为是一次非法访问,并将产生复位。


4.3        防火墙功能描述

4.3.1        防火墙AMBA总线监听

防火墙外设一直在监听AMBA总线,存储器(易失性和非易失性)连接到该总线。全局架构视图如图7所示。

图 7. STM32L4x5 / STM32L4x6防火墙连接原理图

figure7.jpg


4.3.2        功能要求

通过需要被防火墙保护的应用程序代码/数据来保证最高的安全级别,并避免不必要的防火墙报警(产生复位),有几个要求。


调试考虑

在调试模式下,如果防火墙打开,调试器对保护段的访问不会被阻止。因此,读出级别2保护必须与防火墙实现一起激活。

如果需要调试,可以按以下方式进行:

•        在最终用户代码的开发阶段可以开发具有与受保护代码相同的API的虚拟代码。这个虚拟代码可以发回应答(如果需要要考虑功能和潜在的时序),和生产阶段中受保护的代码一致。

•        在开发阶段,受保护的代码可以根据NDA协议给予最终客户,其软件可以在0级保护中开发。最终客户代码需要嵌入位于写保护区段中的IAP,以便在生产部件为2级ROP时允许将来的代码更新。


写保护

为了提供最高的安全级别,需要遵守以下几点:

•        必须在启用防火墙的代码部分保持写保护。该激活代码应该位于防火墙保护的段之外。

•        防火墙保护的代码段上的写保护也是必须的。

•        包含复位向量的扇区必须写保护。


中断管理

防火墙保护的代码不能被中断打断。在执行防火墙保护的代码之前,需要用户代码禁用任何的中断源。如果不遵守此约束,如果在执行受保护代码时出现中断(防火墙已打开),则一旦中断子程序执行,防火墙将关闭。当代码返回到受保护的代码区域时,将会引发防火墙警报,因为“call gate”序列将不被使用,并且将产生一个复位。

关于Flash存储器中的中断向量和第一个用户扇区:

•        如果第一个用户扇区(包括复位向量)受到防火墙的保护,则NVIC向量应在受保护的段之外重新编程。

•        如果第一个用户扇区没有受到防火墙保护,则中断向量可能会保留在该位置。


防火墙不会产生中断。


4.3.3        防火墙段

防火墙的设计旨在保护三个不同的段区域:


代码段

该段位于Flash存储器中。它应该包含要执行的代码,其需要防火墙保护。必须使用“call gate”访问序列来打开防火墙才能访问该段。如果不符合“call gate”入口序列(参见打开防火墙),并且如果系统配置寄存器中使用FWDIS位启用了防火墙,则会产生系统复位。必须在启用防火墙之前配置段长度和段基址(请参见第4.3.5节:防火墙初始化)。


非易失性数据段

该段包含非易失性数据,由受保护的代码使用,其必须被防火墙保护。对该段的访问定义在第4.3.4节:段访问和属性中。在访问该区域的数据之前,必须先打开防火墙。非易失性数据段应位于闪存中。必须在启用防火墙之前配置段长度和段的基址(请参见第4.3.5节:防火墙初始化)。


易失性数据段

位于代码段中的受保护代码使用的易失性数据必须定义到SRAM 1存储器中。对该段的访问在第4.3.4节:段访问和属性 中定义。取决于易失性数据段的配置,在访问此段区域之前,必须打开防火墙。必须在启用防火墙之前配置段长度和段的基址以及段选项(请参见第4.3.5节:防火墙初始化)。

易失性数据段也可以被定义为可执行的(用于代码执行)或使用防火墙配置寄存器的两位(用于易失性数据共享选项的位VDS、易失性数据执行功能的位VDE)定义成共享的。详细信息请参见表18。


4.3.4        段访问和属性

所有对受保护段的DMA访问都是禁止的,不管防火墙处于何种状态,并且会产生一个系统复位。

段访问取决于防火墙状态

三个段中的每一个具有特定的属性,如表18所示。

表18. 根据防火墙状态进行段访问

Segment
Firewall opened
access allowed
Firewall closed
access allowed
Firewall disabled
access allowed
Code segment
Read and execute
No access allowed.
Any access to the segment
(except the “call gate” entry)
generates a system reset

All accesses are allowed
(according to the Flash sector
protection properties in which
the code is located)
Non-volatile data
segment
Read and write
No access allowed
All accesses are allowed
(according to the Flash sector
protection properties in which
the code is located)

Volatile data
segment

Read and Write
Execute if VDE = 1 and
VDS = 0 into the Firewall
configuration register

No access allowed if VDS = 0
and VDE = 0 into the Firewall
configuration register
Read/write/execute accesses
allowed if VDS = 1 (whatever
VDE bit value)
Execute if VDE = 1 and VDS = 0
but with a “call gate” entry to
open the Firewall at first.

All accesses are allowed

易失性数据段与其他段有点不同。该段可以是:

•        共享的(寄存器中的VDS位)

这意味着位于此段中的区域和数据可以在受保护的代码和在非保护区域中执行的用户代码之间共享。不管防火墙是否打开或关闭或禁用,访问都是允许的。

VDS位优先于VDE位,在这种情况下,该最后一位值被忽略。这意味着,易失性数据段可以执行部分代码,而不需要在执行代码之前打开防火墙。

•        可执行的

当FW_CR寄存器中的VDS位等于0时,会考虑VDE位。如果VDS位等于1,请参阅上述有关易失性数据段共享的描述。如果VDS= 0,VDE = 1,则易失性数据段是可执行的。为避免从防火墙产生系统复位,应将“call gate”序列应用于易失性数据段以打开防火墙,作为代码执行的入口点。


段属性

每个段有一个特定的长度寄存器,用于定义要防火墙保护的段大小:CSL寄存器用于代码段长度寄存器、NVDSL寄存器用于非易失性数据段长度寄存器、VDSL寄存器用于易失性数据段长度寄存器。每个段的长度和区域范围见表19。

表 19. 段长度和区域范围

长度
区域范围
代码段
256 字节
1024 K字节 - 256 字节
非易失性数据段
256 字节
1024 K字节 - 256字节
易失性数据段
64 字节
256 K字节 - 64字节 (STM32L496xx / 4A6xx)
96 K字节 - 64 字节 (STM32L475xx / 476xx / 486xx)

跳转到指定楼层
woshi_ziyu
发表于: 2017-6-7 15:42:31 | 显示全部楼层

4.3.5        防火墙初始化

初始化阶段应该放在用户代码执行开始时(参见写保护)。

初始化阶段包括设置需要被防火墙保护的每个段的地址和长度。在启用防火墙之前必须先执行设置,因为使能位只能写入一次。因此,当启用防火墙时,直到下一次系统复位才能禁用它。

一旦启用了防火墙,就不再可能访问地址和长度段。所有的写入尝试都会被丢弃。

定义长度等于0的段不会被防火墙保护。因此,当执行对该段的基址的访问时,防火墙不会产生复位。

复位后,默认情况下禁用防火墙(SYSCFG寄存器中的FWDIS位置1)。必须清除它才能启用防火墙功能。


以下是初始化的步骤:

1.        配置RCC,使能防火墙模块的时钟;

2.        配置RCC,使能系统配置寄存器的时钟;

3.        设置每个段的起始地址和长度(CSSA、CSL、NVDSSA、NVDSL、VDSSA、VDSL寄存器);

4.        设置防火墙的配置寄存器(FW_CR寄存器);

5.        启用防火墙,清除系统配置寄存器中的FWDIS位。


防火墙配置寄存器(FW_CR寄存器)是唯一可以以动态方式进行管理的,即使启用了防火墙:

•        当非易失性数据段未定义(意味着NVDSL寄存器等于0)时,无论防火墙处于何种状态(打开或关闭),都是可以访问该寄存器的。

•        当非易失性数据段定义(意味着NVDSL寄存器不等于0)时,仅当防火墙打开时,才能访问该寄存器。


4.3.6        防火墙状态

防火墙有三种不同的状态,如图8所示:

•        禁止:复位后FWDIS位默认是置位的。防火墙 处于不活动状态。

•        关闭:防火墙保护对三个段(代码段、非易失性数据段和易失性数据段)的访问。

•        打开:防火墙允许访问保护的段,如第4.3.4节:段访问和属性中定义。

图8. 防火墙功能状态

figure8.jpg


打开防火墙

一旦使能防火墙,它将处于关闭状态。也就是说,大多数对保护段的访问都是禁止的(参见第4.3.4节:段访问和属性)。为了打开防火墙,使得能够与保护的段进行交互,必须应用下面描述的“call gate”序列:


“call gate”序列

“call gate”由3个字组成,位于代码段基地址的前三个32位,如果易失性数据段声明为不是共享的(VDS = 0)以及可执行的(VDE = 1),其也位于易失性数据段机制的前三个32位:

–        第1个字:虚拟的32位字,总是处于关闭状态,以保护由于预取缓冲区而导致的访问的“call gate”打开。

–        第2个字和第3个字:两个特定的32位字,称作“call gate”,并且一直处于打开状态。


要打开防火墙,当前执行的代码必须跳转到“call gate”的第2个字,并从此处执行代码。第2个字和第3个字的执行不能被任何中间的指令提取中断; 否则,防火墙不被视为打开状态并返回到关闭状态。然后,在接收到中间指令获取之后执行第三个字将导致系统复位。


一旦防火墙打开,受保护的段可以按照第4.3.4节:段访问和属性所述进行访问。


关闭防火墙

防火墙使能后(系统配置寄存器中的FWDIS位清零),它会立刻关闭。


为了关闭防火墙,保护代码必须:

•        将Firewall Pre Arm Flag中的正确值写入FW_CR寄存器。

•        跳转到防火墙部分之外的任何可执行位置。


如果Firewall Pre Arm Flag在被保护代码跳转到非保护段时未设置,则会产生复位。该控制位是额外的保护,以避免不必要的关闭防火墙的尝试,导致私人信息尚未清除(请参见下面的注释)。


出于安全考虑,在使用防火墙的应用程序之后,建议从CPU寄存器和硬件单元清除所有私有信息。

如果你能看到我的世界里那些渐渐消逝的美好,你就能体会到现在所拥有的幸福。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 47 | 回复: 78



手机版|

GMT+8, 2024-4-19 00:44 , Processed in 0.140260 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表