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