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