Режимы ARM и почему их так много?
В настоящее время я читаю / изучаю архитектуру ARM... и мне было интересно, почему существует так много режимов (FIQ, Пользователь, Система, Supervisor, IRQ, ...).
Мой вопрос: зачем нам так много режимов? Разве только пользователя и системы будет достаточно?
Заранее спасибо.
2 ответа
Это просто архитектурное решение. Большим преимуществом нескольких режимов является то, что у них есть несколько зарегистрированных регистров. Эти дополнительные регистры позволяют писать гораздо менее сложные процедуры исключений.
Если бы вы выбрали только два, просто USR и SYS, вероятно, так же хороши, как и любой другой, но что произойдет, если вы возьмете исключение? Обычная модель ARM состоит в том, чтобы перейти в режим исключения, установить регистр банковских ссылок для этого режима исключения так, чтобы он указывал на инструкцию, к которой вы хотите вернуться после разрешения исключения, сохранить состояние процессора в регистре SPSR режима исключения, а затем перейти к вектору исключения. USR и SYS делят все свои регистры - используя эту модель, вы будете сбрасывать адрес возврата вашей функции (в LR) каждый раз, когда выполняете прерывание!
В частности, режим FIQ имеет больше регистров, чем другие режимы исключений. Эти дополнительные регистры соответствуют "F" части FIQ - это означает "Fast". Отсутствие необходимости сохранять и восстанавливать больше контекста процессора в программном обеспечении ускорит работу вашего обработчика прерываний.
Не слишком много, чтобы добавить к ответу Карла. Не уверен, о какой семействе / архитектуре процессоров ARM вы говорите, поэтому я просто предположу, основываясь на вашем вопросе (FIQ, IRQ и т. Д.), Что вы говорите о ARM7/9/11. Я не буду перечислять все различия между каждым режимом в каждом варианте архитектуры ARM.
В дополнение к тому, что сказал Карл, есть еще несколько преимуществ наличия разных режимов для разных обстоятельств:
например, в FIQ вам не нужно сразу переходить, вы можете просто продолжить выполнение. За другими исключениями, вы должны перейти прямо сейчас
в разных режимах у вас есть естественная поддержка отдельных стеков. Если вы работаете в многозадачном режиме (например, RTOS) и у вас нет отдельного стека, когда вы находитесь в режиме прерывания, вы должны встроить дополнительное пространство в каждый стек задач для ситуации прерывания в худшем случае
в разных режимах определенные регистры (например, CPSR, регистры MMU и т. д. - в зависимости от архитектуры) являются запрещенными. То же самое с определенными инструкциями. Вы не хотите, чтобы код пользователя изменял привилегированные регистры, не так ли?