Как мы знаем, ARM имеет некоторые накренился регистры, такие как SP и Л.Р.. Другими словами, в то время как в IRQ режиме, sp_usr (и lr_usr) невидима, то есть, затененное sp_irq. Итак, мой вопрос заключается в том, как обработчик прерываний сохраняет sp_usr. Некоторые люди могут подумать, что это не нужно, потому что sp_usr автоматически останется неизменным во время обработки прерывания, так как он невидим и недоступен в irq. Тем не менее, это не всегда так. Рассмотрим следующий сценарий:На ARM, как сохранить sp_usr регистр, если поток работает в пользовательском режиме прерывается
a) Thread A работает в пространстве пользователя.
b) Возникает внешнее прерывание.
c) Обработчик работает и обнаруживает, что Thread B с более высоким приоритетом получил ресурс, который он ожидал, поэтому решает перепланировать.
d) Сохраняет контекст резьбы A. Теперь Thread B работает, первым в режиме SVC, а затем обратно в пользователе режима. Это как раз в тот момент, когда значение sp_usr переопределяется нити В.
е) Thread B вызывает что-то вроде сна. Thread A возобновит работу с того места, где оно было прервано.
Итак, если sp_usr не был сохранен, когда поток A был прерван, как бы поток A восстановил его контекст?
Очевидно, что SP & LR необходимо сохранить и позже восстановить. Они должны храниться, когда процессор находится в режиме пользователя или системы. –
Вы должны уточнить, какую версию архитектуры ARM вы рассматриваете, это может повлиять на деталь ответа. –
@Sean Houlihane Я использую ARMv7 Cortex-A9 – xiaokaoy