0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MPU抽象层设计与使用方法

冬至子 来源:半亩方塘8067 作者:半亩方塘8067 2023-09-06 15:43 次阅读

内存保护单元
内存保护单元是一个可编程的设备,用来指定一块特定内存区域的访问权限,比如读,写,和从该区域执行代码的权限。内存保护单元可以增加系统的健壮性,预防一些黑客的攻击。ARMV7-M和ARMV8-M都提供了内存保护单元,简称MPU(Memory Protection Unit)。RISC-V也提供了相似的功能,简称PMP(Physical Memory Protection)。

项目进展
目前对ARMV7-M和ARMV8-M架构实现了初步的支持。框架通用的代码在components/mp目录下,硬件相关的代码存放在libcpu,并提供了两个简单的例程。

功能简介
RT-Thread操作系统的任务和内核使用同一个地址空间,全部运行在特权级。所有代码默认对任何内存都有读,写,和执行的权限。使用MPU框架可以给特定的内存区域设置更低的权限,如只读权限。MPU框架可以被用来实现以下的功能:

把关键数据或代码设置成只读,防止它们被破坏
任务隔离,设定特定地址只能由特定的任务访问

检测栈溢出
把数据区域设置为不可执行,防止栈溢出攻击

使用方法

Menuconfig配置
通过menuconfig进入RT-Thread Components->Memory Protection配置相关选项

RT_USING_MEM_PROTECTION:开启MPU抽象层
RT_USING_HW_STACK_GUARD:使用MPU检测栈溢出。具体实现原理是在任务栈顶和栈底各设置一个MPU区域,权限设置为不可访问。如果发生栈溢出,代码访问了MPU保护的地址,会触发异常
NUM_MEM_REGIONS:硬件支持的MPU区域数量
NUM_EXCLUSIVE_REGIONS:使用rt_mem_protection_add_exclusive_region函数配置的内存区域数量
NUM_CONFIGURABLE_REGIONS:各任务可以通过rt_mem_protection_add_region函数配置的内存区域数量

内存区域配置
MPU抽象层提供了以下的API来配置任务对内存区域的权限:

rt_err_t rt_mem_protection_add_region(rt_thread_t thread, rt_mem_region_t *region):添加内存区域
rt_err_t rt_mem_protection_delete_region(rt_thread_t thread, rt_mem_region_t *region):删除内存区域
rt_err_t rt_mem_protection_update_region(rt_thread_t thread, rt_mem_region_t *region):更新内存区域配置
内存区域的特性由rt_mem_region_t结构体定义:

typedef struct {
void start; / 起始地址 /
rt_size_t size; /
区域大小 /
rt_mem_attr_t attr; /
区域特性 */
} rt_mem_region_t;
其中attr可通过以下宏来定义,使用这样定义的代码在任何处理器架构下都是通用的:

RT_MEM_REGION_P_RW_U_RW:可读写
RT_MEM_REGION_P_RO_U_RO: 只读
RT_MEM_REGION_P_NA_U_NA:不可访问
RT_MEM_REGION_P_RWX_U_RWX:可读写,执行
RT_MEM_REGION_P_RX_U_RX:只读,可执行
通常程序需要定义一块内存区域只能由一个特定的任务访问。允许访问该内存区域的任务可以调用以下函数实现这个功能:

rt_err_t rt_mem_protection_add_exclusive_region(void *start, rt_size_t size):添加内存区域
rt_err_t rt_mem_protection_delete_exclusive_region(void *start, rt_size_t size):删除内存区域
初始化
使用MPU抽象层之前需要在board.h文件定义固定的MPU区域数量:

#define NUM_STATIC_REGIONS 2
在board.c文件定义固定的MPU区域特性:

rt_mem_region_t static_regions[NUM_STATIC_REGIONS] = {
/* Flash region, read only */
{
.start = (void )STM32_FLASH_START_ADRESS,
.size = (rt_size_t)STM32_FLASH_SIZE,
.attr = RT_MEM_REGION_P_RX_U_RX,
},
/
SRAM regin, no execute */
{
.start = (void *)STM32_SRAM_START_ADDRESS,
.size = (rt_size_t)STM32_SRAM_SIZE,
.attr = RT_MEM_REGION_P_RW_U_RW,
},
};
任何代码进行内存访问,都要遵守这些区域的配置。可以用固定的MPU区域,把代码段配置为只读,可执行,把数据段配置成可读写,不可执行。

另外必须确保配置的MPU区域数量满足以下的关系:

如果开启了RT_USING_HW_STACK_GUARD:NUM_STATIC_REGIONS + NUM_CONFIGURABLE_REGIONS + NUM_EXCLUSIVE_REGIONS + 2 <= NUM_MEM_REGIONS
如果没有开启RT_USING_HW_STACK_GUARD:NUM_STATIC_REGIONS + NUM_CONFIGURABLE_REGIONS + NUM_EXCLUSIVE_REGIONS <= NUM_MEM_REGIONS
异常检测
程序可以注册钩子函数,用来检测内存异常:

rt_err_t rt_hw_mp_exception_set_hook(rt_hw_mp_exception_hook_t hook)
hook函数会在发生内存异常时被调用。函数声明如下:

typedef void (*rt_hw_mp_exception_hook_t)(rt_mem_exception_info_t *)
rt_mem_exception_info_t结构体根据处理器机构定义,对于ARM架构,提供以下用来诊断内存异常的信息

typedef struct {
rt_thread_t thread; /* 触发异常的线程 */
void addr; / 发生异常的地址 /
rt_mem_region_t region; /
地址对应的内存区域 /
rt_uint8_t mmfsr; /
MemManage Status寄存器的值 */
} rt_mem_exception_info_t;

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM处理器
    +关注

    关注

    6

    文章

    360

    浏览量

    41648
  • MPU
    MPU
    +关注

    关注

    0

    文章

    342

    浏览量

    48712
  • RT-Thread
    +关注

    关注

    31

    文章

    1268

    浏览量

    39886
  • 内存保护单元

    关注

    0

    文章

    6

    浏览量

    1586
收藏 人收藏

    评论

    相关推荐

    硬件抽象的设置

    我在进行PCI板的开发时经常能够遇到硬件抽象这个概念,不知道这个硬件抽象是在PCI板上设置还是在软件中设置的,用什么软件设置
    发表于 07-21 12:06

    嵌入式操作系统的通用硬件抽象设计

    引言为了便于操作系统在不同硬件结构上进行移植,美国微软公司首先提出了将底层与硬件相关的部分单独设计成硬件抽象美国微软公司提出了将操作系统底层与硬件相关的部分单独设计成硬件抽象HAL
    发表于 12-07 10:30

    如何使用抽象设计可移植代码?

    可移植代码有什么重要性如何使用抽象设计可移植代码求一种可移植软件的设计方案
    发表于 04-26 06:57

    STM32Cube硬件抽象

      STM32Cubemx是一个便捷,方便管理的软件平台。极大的优化了开发的过程,尽管很多人对此不适应。它包括了ST产品的每个系列除了STM8。平台包括了STM32Cube硬件抽象(一个STM32
    发表于 08-03 07:45

    芯片设计中的不同抽象

    在了解Verilog语言的更多细节之前,我们最好先了解一下芯片设计中的不同抽象
    发表于 11-10 08:05

    嵌入式系统硬件抽象的设计思想简析

    嵌入式系统硬件抽象(HAL & BSP)的设计思想1 前言1.1 层次化思想1.2 模块化思想1.3 对象化思想2 板级支持包(BSP)3 嵌入式系统硬件抽象的原理3.1 硬件
    发表于 02-11 07:49

    一文解读RT-Thread MPU抽象的相关知识

    一、介绍MAL(MPU Abstract Layer),即mpu抽象。是RT-Thread自主研发的,支持安全的内存访问。用户代码可以任意的访问任务、外地的内存(内存任务的访问权限、
    发表于 04-28 13:01

    将BLE抽象添加到新项目的正确方法是什么,应该从哪里下载抽象

    将BLE抽象添加到新项目的正确方法是什么,应该从哪里下载抽象
    发表于 04-11 07:06

    求分享SDK软件组件和抽象文档

    SDK 软件组件和抽象文档
    发表于 04-21 07:18

    嵌入式操作系统的通用硬件抽象设计

    摘要 基于嵌入式操作系统硬件抽象层理论,设计一种用于嵌入式操作系统内核开发的通用硬件抽象平台。通用硬件抽象能够为嵌入式操作系统内核的设计
    发表于 03-29 15:16 1192次阅读
    嵌入式操作系统的通用硬件<b class='flag-5'>抽象</b><b class='flag-5'>层</b>设计

    电机控制硬件抽象(HAL)

    硬件抽象( Hardware Abstraction Layer,HAL)为更高层(例如:应用程序框架和客户应用程序等等)提供基于API函数的服务,允许更高层独立于实际的硬件细节执行面向硬件的操作。本文档提供了硬件抽象
    发表于 03-21 16:38 3次下载

    芯片设计抽象及其设计风格

    在了解Verilog语言的更多细节之前,我们最好先了解一下芯片设计中的不同抽象
    发表于 11-05 15:51 12次下载
    芯片设计<b class='flag-5'>抽象</b><b class='flag-5'>层</b>及其设计风格

    STM32 硬件抽象(Hardware Abstraction la

    STM32 硬件抽象(Hardware Abstraction la
    发表于 12-09 12:06 1次下载
    STM32 硬件<b class='flag-5'>抽象</b><b class='flag-5'>层</b>(Hardware Abstraction la

    电缆护保护器的使用方法

    电缆护保护器的使用方法 电缆护保护器是一种用于保护电力电缆护套的装置。其主要作用是对电缆护进行监测,当电缆护层出现泄漏时,能够自动切断电力系统,以保护设备和人身安全。 以下是电缆
    发表于 02-17 14:52 1019次阅读

    AUTOSAR架构MCAL、服务、ECU抽象介绍

    1 微控制器抽象(MCAL) AUTOSAR CP的微控制器抽象(MCAL)是AUTOSAR软件架构中的一个重要组成部分,它提供了对底层硬件的
    的头像 发表于 10-27 15:36 6162次阅读