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 и т.д. - зависит от архитектуры) являются запрещенными. То же самое с определенными инструкциями. Вы не хотите, чтобы пользовательский код менял привилегированные регистры, теперь вы?