OSDev Wiki
Advertisement

Общие сведения[]

Управление работой MPU и получение информации о причине возникновения зарегистрированной им ошибки выполняется с помощью нескольких регистров, относящихся к сопроцессору управления системой CP15. Набор регистров отличается для MPU процессоров ранних архитектур (до PMSAv6) и архитектуры PMSAv6. Программно между собой они не совместимы.

Регистры MPU версий до PMSAv6
Регистр CP15 Назначение
1
Управление системой
2
Управление кэшами инструкций и данных
3
Управление буфером записи
5
Управление разрешением доступа
6
Управление конфигурацией областей защиты


Регистры MPU версии PMSAv6
Регистр CP15 Назначение
0
Идентификация типа MPU
1
Управление системой
5
Индикация ошибок
6
Адрес ошибки; управление областями защиты
13
Идентификатор процесса

Идентификация типа MPU[]

Программная идентификация типа имеющегося MPU возможна только для PMSAv6 и старше; более ранние версии архитектуры её не поддерживают.

Считывание информации об MPU выполняется из регистра 0 сопроцессора CP15 при opcode2, равном 4. Полученное значение имеет следующий формат:

ARM CP15 R0 PMSAv6

Формат регистра типа MPU

Назначение его разрядов следующее:

  • биты 31–24 и 7–1 (SBZ/UNP) — нули либо непредсказуемо;
  • биты 23–16 (IRegion) — если S=1, содержит количество областей памяти инструкций, иначе содержит 0;
  • биты 15–8 (DRegion) — если S=1, содержит количество областей памяти данных, в противном случае — количество единых областей инструкций и данных;
  • бит 0 (S) — равен нулю, если MPU использует единые области инструкций и данных, и единице, если MPU разделяет области инструкций и области данных.

Управление работой MPU[]

Общее управление работой MPU осуществляется с помощью нулевого разряда регистра 1 сопроцессора CP15: когда он сброшен, MPU выключено, когда установлен — включено.

Управление кэшированием и буферизацией[]

В версиях архитектуры, предшествовавших PMSAv6, возможность кэширования и буферизации областей памяти задаётся с помощью соответственно регистра 2 и регистра 3 сопроцессора CP15. Младшие восемь разрядов каждого из этих регистров соответствуют восьми областям, на которые память делится с помощью MPU.

Если MPU поддерживает единое адресное пространство кода и данных, управление кэшированием осуществляется с помощью единого регистра, доступного через регистр 2 сопроцессора CP15. Для обращения к нему в полях CRm и opcode2 команд MRC и MCR должны быть указаны соответственно c0 и 0. При поддержке раздельных адресных пространств кода и данных применяются два отдельных регистра, доступных через регистр 2 сопроцессора CP15. Для обращения к регистру управления кэшированием пространства кода в поле opcode2 необходимо указать значение 1, а для пространства данных — значение 0.

Независимо от того, используется общее или раздельные пространства кода и данных, формат информации, считываемой или записываемой в регистр 2, остаётся одинаковым:

ARM CP15 R2 PMSAv5

Формат регистра управления кэшированием MPU

При считывании значение битов 31–8 будет непредсказуемым, при записи оно должно быть равно нулю или же совпадать со значениями, полученными при считывании. Разряды 7–0 содержат биты управления кэшированием (C) для областей памяти 7–0.

Формат информации, находящейся в регистре 3 сопроцессора CP15, принципиально аналогичен таковому для регистра 2, но вместо битов управления кэшированием там находятся биты управления буферизацией:

ARM CP15 R3 PMSAv5

Формат регистра управления буферизацией MPU

Поскольку буферизация распространяется только на операции записи, при обращении к этому регистру поля CRm и opcode2 команд MRC и MCR должны быть указаны соответственно как c0 и 0.

Управление доступом[]

В версиях MPU до PMSAv6 доступом к отдельным областям памяти управляют биты регистра 5 сопроцессора CP15.

Если MPU поддерживает единое пространство кода и данных, для управления доступом служит единый регистр, доступный с помощью инструкций MRC и MCR при opcode2=0. Если же MPU поддерживает раздельные пространства кода и данных, то управление доступом к пространству кода осуществляется с помощью регистра, доступного при opcode2=1, а к пространству данных — при opcode2=0. Формат информации в любом случае остаётся одинаковым:

ARM CP15 R5 PMSAv5

Формат регистра управления доступом MPU

Разряды 31–16 при считывании имеют непредсказуемые значения. При записи они должны содержать 0 или значения, изначально считанные из них. Разряды 15–0 делятся на 8 двухбитных полей AP7—AP0, каждое из которых управляет доступом к одной области памяти:

  • 00 — доступа нет;
  • 01 — полный доступ для привилегированного кода, нет доступа для непривилегированного кода;
  • 10 — полный доступ для привилегированного кода, доступ только для чтения для непривилегированного кода;
  • 11 — полный доступ.

Индикация отказов[]

Версии до PMSAv6[]

Версии PMSAv6 и старше[]

В версиях PMSAv6 и старше ндикаторы отказов доступны через регистр 5 сопроцессора CP15. Физически имеются два регистра — для индикаторов отказов при последнем обращении к данным (DFSR) и при выборке команд (IFSR). Для доступа к этим регистрам поле opcode2 должно содержать соответственно 0 или 1.

ARM CP15 R5 PMSAv6

Формат регистра индикации отказов MPU

Назначение разрядов этих регистров следующее.

Бит 11 (R/W) используется только в DFSR. Он показывает, вызван отказ попыткой выборки данных (равен нулю) или попыткой записи (равен единице). Поскольку записи инструкций не бывает, в регистре IFSR он отсутствует.

Бит 10 (S) указывает, какого рода отказ был зафиксирован — точный (равен нулю) или неточный (равен единице).

Биты 3–0 кодируют тип отказа. Их расшифровка совместно с битом S приведена в следующей таблице.

Приоритет Источник отказа FS[10,3:0]
высший
нарушение выравнивания
00001
недействительный адрес
00000
нарушение прав доступа
01101
точный внешний отказ
01000
неточный внешний отказ
10110
точная ошибка чётности
00110
неточная ошибка чётности
11000
низший
отладочное событие
00010

Управление областями памяти[]

Версии до PMSAv6[]

Для доступа к регистрам управления защищаемыми областями памяти служит регистр 6 сопроцессора CP15. В инструкциях MRC и MCR номер области задаётся с помощью параметра CRm, принимающего значения от c0 до c7 включительно. Если MPU использует общее адресное пространство инструкций и данных, параметр opcode2 должен быть равен нулю; если же поддерживаются отдельные пространства кода и данных, то для доступа к регистрам областей пространства данных он должен быть равен нулю, а пространства кода — единице.

Все регистры управления защищаемыми областями имеют одинаковый формат:

ARM CP15 R6 PMSAv5

Формат регистра управления защищаемой областью памяти

Назначение разрядов этого регистра следующее.

  • Поле Base address (разряды 31:12) содержит адрес первого байта защищаемой области. Адрес должен быть кратен размеру области (см. таблицу ниже).
  • Разряды 11:6 при чтении имеют непредсказуемое значение, а при записи должны быть равны нулю или значению, находящемуся в них при считывании регистра.
  • Поле Size (разряды 5:1) содержит размер защищаемой области в виде степени числа 2. Оно должно определять размер в пределах от 4 Кбайт до 4 Гбайт, что соответствует значениям от 01011 до 11111. Его кодировка приведена в таблице ниже.
  • Бит E (разряд 0) разрешает или запрещает защищаемую область памяти. Когда он равен нулю, защищаемая область запрещена, и содержимое остальных разрядов этого регистра не оказывает никакого влияния на доступы к памяти. После сброса процессора все области памяти запрещены, поэтому MPU не оказывает влияния на его работу. Когда этот бит равен единице, защищаемая область разрешена, и MPU выполняет контроль доступа по адресам, относящимся к этой области.
Поле Size Размер области Ограничения для базового адреса
00000-01010 непредсказуемо

Версии PMSAv6 и старше[]

Advertisement