STM32 SRAM 存储器保护:保障嵌入式系统安全,防止数据泄露和系统崩溃
发布时间: 2024-07-03 18:15:19 阅读量: 7 订阅数: 14 ![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![STM32 SRAM 存储器保护:保障嵌入式系统安全,防止数据泄露和系统崩溃](https://img-blog.csdnimg.cn/93fb325e82e54aa6872012c64bfca1d6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aSn54i35p2l546p5YS_,size_20,color_FFFFFF,t_70,g_se,x_16)
# 1. STM32 SRAM 存储器简介
SRAM(静态随机存取存储器)是一种用于存储数据的半导体存储器。在 STM32 微控制器中,SRAM 用于存储程序代码、数据和堆栈。与动态 RAM (DRAM) 不同,SRAM 不需要周期性刷新,因此具有更快的访问速度和更低的功耗。
SRAM 存储器在 STM32 微控制器中通常分为多个存储器区域,包括:
- **代码存储器:**用于存储程序代码。
- **数据存储器:**用于存储全局变量和静态数据。
- **堆栈存储器:**用于存储函数调用和局部变量。
SRAM 存储器的容量和组织方式因不同的 STM32 微控制器型号而异。例如,STM32F4 系列微控制器具有高达 1 MB 的 SRAM 存储器,而 STM32L0 系列微控制器具有高达 32 KB 的 SRAM 存储器。
# 2. SRAM 存储器保护机制
### 2.1 存储器保护单元 (MPU)
#### 2.1.1 MPU 的基本原理
存储器保护单元 (MPU) 是一种硬件机制,用于在嵌入式系统中保护 SRAM 存储器。它允许系统定义不同的存储器区域,并为每个区域分配特定的访问权限。MPU 通过以下方式实现存储器保护:
- **存储器区域划分:** MPU 将 SRAM 存储器划分为多个区域,每个区域都有自己的访问权限。
- **访问权限控制:** MPU 定义了不同的访问权限等级,例如读取、写入、执行等。
- **区域属性配置:** 每个存储器区域可以配置特定的属性,如大小、起始地址和访问权限。
#### 2.1.2 MPU 的配置和使用
MPU 的配置和使用涉及以下步骤:
1. **初始化 MPU:** 在系统启动时,需要初始化 MPU,包括设置存储器区域和访问权限。
2. **定义存储器区域:** 根据系统的需要,定义多个存储器区域,并为每个区域分配起始地址和大小。
3. **配置访问权限:** 为每个存储器区域配置访问权限,包括读取、写入和执行权限。
4. **使能 MPU:** 在配置完成后,使能 MPU 以激活存储器保护功能。
### 2.2 存储器访问权限控制
#### 2.2.1 访问权限等级
MPU 定义了以下访问权限等级:
- **无访问:** 区域不可访问。
- **只读:** 区域只能被读取。
- **只写:** 区域只能被写入。
- **读写:** 区域可以被读取和写入。
- **执行:** 区域可以被执行。
#### 2.2.2 访问权限配置
访问权限配置是通过 MPU 寄存器进行的。每个存储器区域都有一个对应的 MPU 寄存器,用于配置该区域的访问权限。寄存器中的位字段定义了不同的访问权限等级。
```
MPU_Region_Register {
Region_Enable: 1 bit
Region_Size: 4 bits
Region_Start_Address: 32 bits
Region_Access_Permissions: 8 bits
}
```
- **Region_Enable:** 使能或禁用该存储器区域。
- **Region_Size:** 定义存储器区域的大小。
- **Region_Start_Address:** 定义存储器区域的起始地址。
- **Region_Access_Permissions:** 定义存储器区域的访问权限。
**代码块:**
```c
// 配置 MPU 区域 1
MPU->RBAR = 0x20000000; // 起始地址
MPU->RASR = 0x00000005; // 大小为 32KB,读写权限
// 配置 MPU 区域 2
MPU->RBAR = 0x40000000; // 起始地址
MPU->RASR = 0x00000001; // 大小为 16KB,只读权限
// 使能 MPU
MPU->CTRL = 0x00000001;
```
**逻辑分析:**
- 第一行代码配置了 MPU 区域 1,起始地址为 0x20000000,大小为 32KB,具有读写权限。
- 第二行代码配置了 MPU 区域 2,起始地址为 0x40000000,大小为 16KB,具有只读权限。
- 第三行代码使能了 MPU,激活了存储器保护功能。
# 3. SRAM 存储器保护实践**
### 3.1 MPU 配置示例
#### 3.1.1 保护关键数据区域
MPU 可用于保护关键数据区域,防止未经授权的访问。例如,在嵌入式系统中,存储敏感信息的变量或函数可以分配到受保护的内存区域。
**代码块:**
```c
MPU_Region_InitTypeDef region;
region.Enable = MPU_REGION_ENABLE;
region.BaseAddress = 0x20000000; // 受保护区域的起始地址
region.Size = MPU_REGION_SIZE_32KB; // 受保护区域的大小
region.AccessPermission = MPU_REGION_FULL_ACCESS; // 对受保护区域的访问权限
region.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; // 是否允许缓存
region.IsCacheable = MPU_ACCESS_NOT_CAC
```
0
0