OSDev Wiki
Advertisement

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

Процессоры классической архитектуры ARM (все варианты ARMv6, кроме, вероятно, ARMv6Z/ARMv6KZ, и более ранние версии) имеют шесть регистров состояния; в версиях ARMv7, поддерживающих расширения безопасности, к ним добавился ещё один.

Один из этих регистров называется регистром текущего состояния программы и обозначается CPSR (current program status register). Он содержит биты, характеризующие текущее состояние процессора и выполняемой программы: режим работы, активную систему команд, признаки результата выполнения предыдущей команды и т. д. CPSR неявно используется при выполнении любых операций во всех режимах процессора; кроме того, в любом режиме к нему возможен полный или частичный явный доступ.

Пять или шесть остальных регистров называются регистрами сохранённого состояния программы и обозначаются SPSR (saved program status register). Каждый из режимов обработки прерываний имеет собственный SPSR, в котором сохраняется состояние прерванной программы (содержимое CPSR на момент возникновения прерывания); этот регистр доступен только в соответствующем режиме процессора. Наряду со своими собственными экземплярами регистра связи и указателя стека наличие индивидуального SPSR для каждого режима обработки теоретически упрощает и ускоряет обработку прерываний. На практике, однако, обилие режимов и связанных с ними регистров лишь усложняет код операционной системы, не давая в большинстве случаев никаких реальных преимуществ.

Режимы системы и пользователя не имеют регистров SPSR, поскольку процессор может перейти в них только программным путём, а не в результате прерывания. Попытка выполнить команды чтения или записи SPSR в этих режимах приведёт к непредсказуемым последствиям.

Документация нередко упоминает регистр состояния приложения APSR (application program status register). На самом деле такого регистра не существует: в его состав включены биты CPSR, которые могут явным образом модифицироваться непривилегированным кодом.

Замечание. В процессорах, поддерживающих расширения безопасности, помимо традиционных для архитектуры ARM состояний, связанных с текущим режимом работы, системой команд и т. д., введено понятие состояний безопасности (безопасное и небезопасное). В отличие от других режимов и состояний, состояние безопасности задаётся содержимым не CPSR, а регистра SCR.

Назначение разрядов[]

Все регистры состояния имеют одинаковый формат, показанный на рисунке.

ARM A&R profiles PSR

Формат регистров состояния программы для A- и R-профилей

Формат APSR, т. е. биты CPSR, доступные для модификации прикладным кодом, показан на следующем рисунке.

ARM APSR

Формат регистра состояния приложения для A- и R-профилей

Попытка записи в зарезервированные или не реализованные в данном варианте процессора разряды единичных значений может привести к непредсказуемым последствиям. Рекомендуется для обеспечения совместимости записывать в них те же значения, что были из них прочитаны.

Флаги условий[]

Биты N, Z, C и V носят общее название флагов условий или просто флагов. Они характеризуют результат выполнения той или иной операции и могут использоваться для организации переходов и условного выполнения команд.

Команды сравнения обоих наборов команд всегда изменяют состояние флагов. В наборе ARM флаги изменяются также любыми другими командами обработки данных в S-форме (т. е. с установленным битом S в коде команды, что при записи на языке ассемблера отражается добавлением буквы S к мнемокоду команды, например, ADDS вместо обычной записи ADD). В 16-разрядной системе команд Thumb состояние флагов изменялось почти всеми командами обработки данных, хотя некоторые из них, напротив, не изменяли флаги. В расширенном наборе Thumb-2 появились 32-разрядные команды, в которых можно явным образом выбрать изменение или сохранение состояния флагов; эти команды в целом эквивалентны аналогичным командам набора ARM. Правила установки и сброса флагов даны в описании соответствующих команд, а общие принципы изложены в следующей таблице.

Флаг Описание
N
Устанавливается равным старшему биту результата операции. В том случае, когда результат трактуется как число со знаком, нулевое значение N будет соответствовать нулевому или положительному результату, единичное — отрицательному
Z
Устанавливается, если результат операции равен нулю, и сбрасывается в противном случае
C
Устанавливается или сбрасывается одним из следующих способов:
  • в операциях сложения, включая команду сравнения CMN, флаг C устанавливается, если в результате сложения возник перенос (т. е. если произошло беззнаковое переполнение), и сбрасывается в противном случае
  • в операциях вычитания, включая команду сравнения CMP, флаг C сбрасывается, если в результате вычитания возник заём (т. е. если беззнаковый результат получился меньше нуля), и устанавливается в противном случае
  • после операций сдвига флаг C будет равен значению последнего выдвинутого разряда
  • прочие операции, не включающие в себя выполнение сдвига одного из операндов-источников, обычно не изменяют значение флага C
V
Операции сложения и вычитания устанавливают флаг V, если возникло знаковое переполнение (т. е. когда знак результата получается не тем, что должен быть по правилам арифметики), и сбрасывают V при отсутствии переполнения. Остальные команды, как правило, не изменяют его состояние

Помимо изменения состояния с помощью команд обработки данных, флаги могут быть изменены ещё несколькими способами, включая прямую их загрузку командой MSR. Эта загрузка возможна как в привилегированных режимах процессора, так и в режиме пользователя.

Флаг Q[]

Этот флаг появился в E-варианте архитектуры ARMv5 (набор команд цифровой обработки сигналов) и является признаком переполнения и/или насыщения, возникшего при выполнении некоторых команд этого набора. Как и флаги NZVC, этот бит может прямо изменяться непривилегированным кодом.

Биты GE[3:0][]

Эти биты появились в архитектуре ARMv6. Они используются командами набора SIMD и отражают выполнение условия «больше или равно» для отдельных байтов или полуслов результата. Кроме того, они применяются для управления командой SEL.

В операциях над байтами разряды GE[3:0] соответствуют байтам, расположенным слева направо, т. е. бит 3 относится к старшему, а бит 0 — к младшему байту результата. В операциях над полусловами биты GE[3:2] и GE [1:0] устанавливаются и сбрасываются одновременно по результату, полученному в старшем и младшем полуслове соответственно.

Каждый бит устанавливается в следующих случаях:

  • для беззнакового сложения байтов — если результат больше 255;
  • для беззнакового сложения полуслов — если результат больше 65535;
  • для беззнакового вычитания — если результат больше либо равен нулю;
  • для знаковой арифметики — если результат больше либо равен нулю.

Если эти условия не выполняются, соответствующий бит сбрасывается.

Бит E[]

Бит E появился в версии ARMv6. Он управляет порядком байтов данных, хранящихся в памяти. При выборке команд его значение игнорируется.

В версиях, предшествовавших ARMv6, этот разряд был зарезервирован, и порядком байтов управлял бит B регистра 1 сопроцессора управления системой CP15; при отсутствии CP15 порядок определялся реализацией. Начиная с версии ARMv6, бит E указывает порядок в том случае, если бит B равен нулю: нулевое значение E задаёт порядок «младший-старший», а единичное — «старший-младший».

Этот бит может быть прочитан и записан в любом режиме процессора. Начиная с версии ARMv7, его чтение и запись командами MSR и MRS обоих наборов команд считается устаревшим. Для определения используемого порядка байтов рекомендуется считать из памяти слово с заранее известным расположением байтов, а для изменения порядка байтов — использовать командуSETEND.

Биты запрещения прерываний A, I, F[]

Установленные биты A, I и F запрещают связанные с ними исключения, а сброшенные — разрешают:

  • бит A отвечает за асинхронные отказы. Он был введён в версии ARMv6, в документации на которую соответствующий вид прерываний назывался неточными отказами;
  • бит I отвечает за обычные внешние прерывания (IRQ);
  • бит F отвечает за быстрые внешние прерывания (FIQ).

Бит A автоматически устанавливаются при сбросе, отказах предвыборки и данных, обычном и быстром внешних прерываниях.

Бит I автоматически устанавливается при всех видах прерываний.

Бит F автоматически устанавливаются только при сбросе и быстром внешнем прерывании.

Маски прерываний могут быть прочитаны в любом режиме работы процессора, но записаны только в привилегированных. Возможность считывания в режиме пользователя в версии ARMv7 объявлена устаревшей.

Некоторые процессоры архитектуры ARMv7 могут поддерживать режим немаскируемых быстрых прерываний (NMFI). Такой режим активизируется внешним сигналом, подаваемым на один из выводов процессора. Наличие или отсутствие поддержи NMFI зависит от реализации.

Процессоры архитектуры ARMv7, поддерживающие расширения безопасности, обладают возможностью ограничить модификацию битов A и F привилегированным кодом, исполняемым в небезопасном состоянии.

Биты режима M[4:0][]

Пятиразрядное поле M определяет текущий режим работы процессора. Допустимыми комбинациями в этим поле являются:

  • 10000 — режим пользователя;
  • 10001 — режим быстрого прерывания;
  • 10010 — режим прерывания;
  • 10011 — режим супервизора;
  • 10110 — режим монитора;
  • 10111 — режим отказа;
  • 11011 — режим неопределённой команды;
  • 11111 — режим системы.

Чтение значения этого поля возможно в любом режиме, запись — только в привилегированных. Возможность считывания битов M в режиме пользователя в версии ARMv7 объявлена устаревшей.

Режим монитора присутствует только в процессорах версии ARMv7 (и, вероятно, ARMv6Z/ARMv6KZ), поддерживающих расширения безопасности. Переключение с помощью записи в регистр состояния в режимы монитора и быстрого прерывания из кода, выполняемого в небезопасном состоянии, в таком ЦП может быть заблокировано.

Биты набора команд T и J[]

Биты T и J определяют систему команд, используемую в данный момент времени:

  • когда оба бита равны нулю, активна система команд ARM;
  • когда установлен только бит T, активна система команд Thumb (включая её расширенный вариант Thumb-2);
  • когда установлен только бит J, активна система команд Jazelle;
  • когда оба бита установлены, активна система команд ThumbEE, появившаяся только в версии ARMv7

Бит T реализован в T-вариантах версий ARMv4 и ARMv5; в ARMv6 и более поздних версиях он присутствует всегда. Попытка переключения в режим Thumb при отсутствии его поддержки вызовет прерывание по неопределённой команде сразу после загрузки в CPSR значения с установленным битом T. В SPSR режима неопределённой команды бит T также будет установлен, что позволит обработчику правильно определить его причину.

Бит J реализован в ARMv5TEJ, ARMv6 и более поздних версиях. Заметим, что реализация бита J ещё не означает, что процессор поддерживает технологию Jazelle. В таком случае сразу после его установки при сброшенном бите T произойдёт прерывание по неопределённой команде, о причине которого обработчик сможет узнать, проанализировав флаг SPSR.J.

Переключение на систему команд Jazelle выполняется либо с помощью возврата из прерывания, либо специальной командой BXJ. Если технология Jazelle не реализована или запрещена, последняя будет выполнена как команда BX, и бит J останется сброшенным.

При считывании регистра CPSR командой MRS биты T и J будут прочитаны как нули. Попытка записи единицы хотя бы в один из этих разрядов командой MSR в версиях ARMv6T2 и ARMv7 будет проигнорирована, а в более ранних версиях — проигнорирована в режиме пользователя и приведёт к непредсказуемым последствиям в привилегированных режимах. Однако биты T и J регистров SPSR в режимах обработки прерываний могут читаться и записываться свободно.

Поле IT[]

Эти разряды появились в варианте ARMv6T2 и имеются в версии ARMv7. Они отражают текущее состояние выполнения команд набора Thumb, входящих в блок условного выполнения, начатый командой IT, а также прерываемых команд всех наборов, например, LDM.

В регистрах SPSR это поле может свободно считываться и записываться командами MRS и MSR. При считывании содержимого CPSR все разряды поля IT будут равны нулю. Попытка записи в него значения, отличного от 0, в процессорах ARMv6T2 и ARMv7 будет проигнорирована, а в процессорах более ранних вариантов, где оно отсутствует, а соответствующие разряды зарезервированы, приведёт к непредсказуемым последствиям.

Заметим, что изменение значения поля IT обычно требуется в том случае, если необходимо выполнить возврат внутрь блока условного выполнения или к прерываемой команде, но не в точку, соответствующую «нормальному» завершению обработки прерывания. Такое может понадобиться, например, при программной эмуляции отсутствующих у конкретного процессора команд.

Advertisement