OSDev Wiki
Advertisement

Регистр 1 на самом деле состоит из нескольких регистров; для доступа к одному из них используется поле дополнительной операции (opcode2) инструкций MRC и MCR. Следует заметить, что лишь один из них, регистр управления, присутствует в любом варианте CP15; наличие других регистров определяется реализацией.

opcode2 Регистр
000
Регистр управления
001
Вспомогательный регистр управления
010
Регистр управления доступом к сопроцессорам

Регистр управления[]

ARM CP15 R1-0

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

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

  • бит 0 (M) — когда установлен, разрешает работу MMU или MPU. Если процессор не содержит MPU или MMU, этот бит считывается как 0, а запись в него игнорируется;
  • бит 1 (A) — когда установлен, разрешает контроль выравнивания (при обращении к памяти по невыровненному адресу возникнет отказ данных). Этот бит обязателен в версии ARMv6 и может присутствовать в процессорах более ранних версий. Если процессор не имеет возможности переключать режим контроля выравнивания, этот бит будет считываться как 1 или 0 в зависимости от того, осуществляется контроль или нет, а запись в него будет игнорироваться. Ошибки выравнивания отражаются в регистрах адреса и состояния MMU и MPU;
  • бит 2 (C) — когда установлен, разрешает работу кэша данных или общего кэша первого уровня. Если кэш первого уровня отсутствует, этот бит считывается как 0, а если кэш не может быть отключен, он считывается как 1; в обоих случаях запись в этот бит игнорируется;
  • бит 3 (W) — когда установлен, разрешает работу буфера записи. Если буфер записи отсутствует, этот бит считывается как 0, а если он не может быть отключен — как 1; в обоих случаях запись в этот бит игнорируется;
  • биты 4–6 (P, D, L) всегда считываются как 1; запись в них игнорируется;
  • бит 7 (B) — этот разряд используется для выбора модели представления многобайтовых величин. Когда он равен единице, используется модель «старший-младший» (BE-32), когда нулю — либо «младший-старший» (LE), либо «старший-младший» (BE-8), причём последняя поддерживается только в версии ARMv6. Состояние этого разряда после сброса определяется реализацией или состоянием специальных конфигурационных линий процессора. Подробнее о представлении многобайтовых величин говорится в разделе «Логическая структура памяти»;
  • бит 8 (S) — разряд защиты системы. Поддерживается для совместимости с предыдущими версиями архитектуры, в ARMv6 считается устаревшим. Подробнее описан в подразделе «Управление доступом»;
  • бит 9 (R) — разряд защиты ПЗУ. Поддерживается для совместимости с предыдущими версиями архитектуры, в ARMv6 считается устаревшим. Подробнее описан в подразделе «Управление доступом»;
  • бит 10 (F) — назначение этого разряда определяется реализацией;
  • бит 11 (Z) — когда установлен, разрешает работу предсказателя ветвлений. Если предсказатель отсутствует, этот бит считывается как 0, а если не может быть отключен — как 1; в обоих случаях запись в этот бит игнорируется;
  • бит 12 (I) — когда установлен, разрешает работу кэша инструкций первого уровня. Если кэш первого уровня отсутствует вообще либо если используется единый кэш инструкций и данных, этот бит считывается как 0, а если кэш не может быть отключен, он считывается как 1; в обоих случаях запись в этот бит игнорируется;
  • бит 13 (V) — когда равен нулю, векторы прерываний начинаются с адреса 0000_0000, когда равен единице — с адреса FFFF_0000. Состояние этого разряда после сброса может определяться специальной конфигурационной линией (это зависит от реализации);
  • бит 14 (RR) — этот разряд управляет стратегией замещения строк в кэш-памяти. Когда он равен нулю, используется обычная стратегия (например, случайное замещение), когда единице — предсказуемая стратегия (например, круговое замещение). Конкретные стратегии замещения и возможность их переключения зависят от реализации;
  • бит 15 (L4) — этот бит в версии ARMv6 считается устаревшим. Он запрещает взаимодействие с набором команд Thumb, реализованным в ARMv5T. Это влияет на выполнение команд LDM, LDR и POP;
  • бит 21 (FI) — когда установлен, разрешает режим малой задержки прерываний;
  • бит 22 (U) — этот разряд появился в ARMv6. Когда установлен, разрешает невыровненные доступы, когда сброшен, вызывает «вращение» байтов невыровненных слов (устаревшее поведение для ARMv6). Для инструкций загрузки и сохранения двойных слов (LDRD и STRD) он не отменяет, а лишь смягчает контроль выравнивания: когда он равен нулю, задаваемый в этих командах адрес должен быть кратен 8, а когда равен единице – должен быть кратен 4. Правила контроля выравнивания описаны в разделе Логическая структура памяти;
  • бит 23 (XP) — этот разряд управляет работой механизма преобразования адресов. Когда он сброшен, разрешено деление каждой страницы виртуальной памяти на подстраницы, когда установлен, такое деление запрещено. Подстраницы всегда используются в старых версиях архитектуры виртуальной памяти (до VMSAv6); они могут использоваться и в VMSAv6, однако в этом случае предпочтительным является отказ от подстраниц. Подробнее о подстраницах говорится в разделе Таблицы переадресации;
  • бит 24 (VE) — когда установлен, разрешает использование векторных прерываний, когда сброшен, для обычных и быстрых прерываний используются фиксированные векторы;
  • бит 25 (EE) — значение этого разряда, появившегося в ARMv6, при возникновении исключения заносится в бит E нового CPSR и тем самым задаёт формат размещения данных в памяти («младший–старший» или наоборот).
  • бит 26 (L2) — разрешает работу единого кэша второго уровня;
  • биты 31–27, 20, 18, 16 — зарезервировано, содержат нули. Часть этих разрядов может быть впоследствии использована для расширения функциональных возможностей процессора.

Заметим, что при записи в регистр управления следует оставлять неизменными зарезервированные биты, а при считывании нельзя полагаться на их значения.

Вспомогательный регистр управления[]

Назначение разрядов вспомогательного регистра управления зависит от конкретной модели процессора и описывается в соответствующей документации.

Регистр управления доступом к сопроцессору[]

ARM CP15 R1-2

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

Назначение разрядов регистра управления доступом к сопроцессорам следующее:

  • биты 31–29 — нули либо непредсказуемо;
  • остальные пары битов кодируют разрешённый тип доступа к сопроцессору с соответствующим номером:
    • 00 — доступ запрещён; попытка обращения к сопроцессору вызовет генерацию исключения по неопределённой команде;
    • 01 — привилегированный доступ. Попытка программы, выполняющейся в режиме пользователя, обратиться к данному сопроцессору, вызовет генерацию исключения по неопределённой команде;
    • 10 — зарезервировано;
    • 11 — полный доступ в соответствии с правилами, определёнными для данного сопроцессора.

После сброса доступ ко всем сопроцессорам, кроме CP14 и CP15, запрещён.

Advertisement