鸿蒙轻内核M核源码分析系列十六 MPU内存保护单元

本文主要分析鸿蒙轻内核MPU模块的的源码。本文中所涉及的源码,以OpenHarmony LiteOS-M内核为例,均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_m 获取。鸿蒙轻内核支持的ARM Cortex-M芯片架构都支持MPU的,代码都是一样的,以kernel\arch\arm\cortex-m4\gcc\los_mpu.c为例进行讲解。


1、MPU枚举、结构体定义和常用宏定义

1.1 MPU枚举、结构体定义

在文件kernel\arch\include\los_mpu.h定义MPU相关的结构体。

⑴处定义MPU内存区域的访问权限,有关访问权限见下图,或者可以访问官网https://developer.arm.com/documentation/dui0552/a/cortex-m3-peripherals/optional-memory-protection-unit/mpu-access-permission-attributes,特别是上述页面的表格Table 4.47. AP encoding了解更多。

⑵处定义MPU的是否可执行属性枚举,⑶处定义MPU内存区域是否可以共享属性枚举,⑷定义内存区域的类型属性枚举,⑸处的结构体用于定义MPU内存区域。

⑴ typedef enum {
        MPU_RW_BY_PRIVILEGED_ONLY = 0,
        MPU_RW_ANY = 1,
        MPU_RO_BY_PRIVILEGED_ONLY = 2,
        MPU_RO_ANY = 3,
    } MpuAccessPermission;

⑵  typedef enum {
        MPU_EXECUTABLE = 0,
        MPU_NON_EXECUTABLE = 1,
    } MpuExecutable;

⑶  typedef enum {
        MPU_NO_SHARE = 0,
        MPU_SHARE = 1,
    } MpuShareability;

⑷  typedef enum {
        MPU_MEM_ON_CHIP_ROM = 0,
        MPU_MEM_ON_CHIP_RAM = 1,
        MPU_MEM_XIP_PSRAM = 2,
        MPU_MEM_XIP_NOR_FLASH = 3,
        MPU_MEM_SHARE_MEM = 4,
    } MpuMemType;

⑸  typedef struct {
        UINT32 baseAddr;
        UINT64 size; /* armv7 size == 2^x (5 <= x <= 32)  128B - 4GB */
        MpuAccessPermission permission;
        MpuExecutable executable;
        MpuShareability shareability;
        MpuMemType memType;
    } MPU_CFG_PARA;

1.2 MPU宏

MPU外设的一些宏定义有HAL Drivers定义,比如对于Cortex-M4,位置为Drivers\CMSIS\Core\Include\core_cm4.hMPU结构体定义如下,关于MPU寄存器的详细信息可以访问https://developer.arm.com/documentation/dui0552/a/cortex-m3-peripherals/optional-memory-protection-unit,查看页面上的Table 4.38. MPU registers summary,下图是MPU寄存器的官网表格截图,下文在讲解代码时会涉及MPU的各个寄存器。

#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */
  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */
#endif

另外,MPU支持8个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值