Настройка модуля защиты памяти на Atmel SAMD51 - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь настроить MPU SAMD51 (Cortex-M4) для защиты 1 КБ FLASH от любого доступа и 1 КБ SRAM от доступа для записи, который будет содержать конфиденциальную информацию, доступ к которой никогда не должен быть поврежден (с ПО).ошибка или любой другой способ).

Я хочу защитить эти разделы, даже в привилегированном (программное обеспечение не имеет ОСРВ и всегда будет в привилегированном режиме).

Поскольку код будет выполняться в привилегированномВ режиме я использую флаг 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?
  • Чего я не хочу достичь, оставаясь в привилегированном режиме?

Спасибо за помощь!

1 Ответ

0 голосов
/ 26 февраля 2019

Ну, в вашем коде есть некоторые явные проблемы.Пожалуйста, используйте это для битовых полей: 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: эта строка не имеет никакого эффекта.Поскольку это поле уже было установлено на ноль при настройке размера, и оно также неверно.Чтобы очистить бит, мы используем & операция не |.

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

3: Для целей тестирования попробуйте отключить кэширование.то есть tex = 1, b = 0, c = 0, s = 0.Также установите бит выборки инструкций XN для отключения доступа к выборкам инструкций.

...