【问题标题】:Configuring Memory Protection Unit on Atmel SAMD51在 Atmel SAMD51 上配置内存保护单元
【发布时间】:2019-02-26 15:39:03
【问题描述】:

我正在尝试配置 SAMD51 (Cortex-M4) 的 MPU 以保护 1k 的 FLASH 免受任何访问,并保护 1k 的 SRAM 免受包含不应访问或损坏的敏感信息的写访问(来自 SW错误或任何其他方式)。

我希望保护这些部分,即使在特权模式下(软件没有 RTOS 并且将始终处于特权模式)。

由于代码将在特权模式下运行,我使用MPU_CTRL_PRIVDEFENA_Msk 标志,并希望只覆盖我的两个区域的访问权限。

我已经检查了这些部分的对齐要求:

  • 区域 0(在 FLASH 中)@0x0001d400(1k 对齐)
  • 区域 1(在 SRAM 中)@0x20000000(1k 对齐)

在下面找到我的代码来配置 MPU:

__disable_irq();

//
// Region0
//
__DSB();
__ISB();
MPU->RNR = 0;
MPU->RBAR = (0x0001d400 << MPU_RBAR_ADDR_Pos);
// 1k size - log2(1k) = 10
MPU->RASR  = ((10 - 1) << MPU_RASR_SIZE_Pos); 
// Normal; Not shareable; Cacheable; Inner Write back; no write allocate
MPU->RASR |= ((0x4 << MPU_RASR_TEX_Pos) | (1 << MPU_RASR_C_Pos) | (1 << MPU_RASR_B_Pos)); 
// No priviledged or unpriviledge access
MPU->RASR |= (0UL << MPU_RASR_AP_Pos);
// Enable
MPU->RASR |= 1UL;

//
// Section 1
//
__DSB();
__ISB();
MPU->RNR = 1;
MPU->RBAR = (0x20000000 << MPU_RBAR_ADDR_Pos);
// 1k size - log2(1k) = 10
MPU->RASR  = ((10 - 1) << MPU_RASR_SIZE_Pos); 
// Normal; Not shareable; Cacheable; Inner Write back; no write allocate
MPU->RASR |= ((0x4 << MPU_RASR_TEX_Pos) | (1 << MPU_RASR_C_Pos) | (1 << MPU_RASR_B_Pos)); 
// Read-Only Priviledged or unpriviledge access
MPU->RASR |= (6UL << MPU_RASR_AP_Pos);
// Enable
MPU->RASR |= 1UL;

// Enable MPU
MPU->CTRL = MPU_CTRL_ENABLE_Msk | MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk;
// Enable MemFault handler
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
__DSB();
__ISB();
__enable_irq();

似乎配置被忽略,并且在访问配置的区域时永远不会产生错误。

我已经多次阅读 ARM 文档,但看不出有什么问题...

  • 我的代码有错误吗?
  • SAMD51 的缓存/内存配置是否错误?
  • 保持特权模式无法实现我想要做的事情吗?

感谢您的帮助!

【问题讨论】:

    标签: arm cortex-m


    【解决方案1】:

    您的代码中存在一些明显的问题。 位域请参考:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/BIHHGADD.html

    从一开始: 1:你为什么要在这里转移基地址

    MPU->RBAR = (0x0001d400 << MPU_RBAR_ADDR_Pos);
    

    它必须是这样的。请参阅此寄存器的位域。

    MPU->RBAR = (0x0001d400);
    

    2:此行无效。由于在设置大小时该字段已设置为零,因此也不正确。要清除我们使用 & 操作 not | 的位。

    MPU->RASR |= (0UL << MPU_RASR_AP_Pos);
    

    3:出于测试目的,请尝试关闭缓存。即 tex=1, b=0, c=0, s=0。同时设置取指位 XN 以禁用取指访问。

    【讨论】:

    • 1.我将此static.docs.arm.com/ddi0403/eb/… 用作参考并误解了RBAR 配置。谢谢,这显然是问题......转移会截断地址。 2.虽然没有效果,但不是问题,因为RASR是影响上面两行,然后ored。无论如何... 3. 确实,在我的情况下,设置 XN 更安全。
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 2013-03-24
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多