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)
|
|