РУКА.Доступ к пользователю R13 и R14 из режима супервизора

StackOverflow https://stackoverflow.com/questions/324704

  •  11-07-2019
  •  | 
  •  

Вопрос

Как мне получить доступ к пользователям R13 и R14, которые сохраняются при входе в режим супервизора?Я использую ARM7TDMI.

И.Е.Я не хочу получать доступ к супервизору R14, который теперь содержит адрес возврата в пользовательский режим, вместо этого мне нужно значение регистра связи пользовательского режима.Это часть отладчика, который я пишу.

Существуют ли специальные псевдонимы для этих регистров?

Спасибо

Это было полезно?

Решение

Я опишу ответ на ваш конкретный вопрос, но тот же подход применим и к другим режимам.

Вам нужно будет изменить режим процессора, изменив биты режима в CPSR на системный режим.Это даст вам доступ к SP/LR пользовательского режима (R13 и R14).Помните, что системный режим является привилегированным, но его R13 и R14 такие же, как R13 и R14 пользовательского режима.

Перейдя в системный режим, прочитайте R13 и R14 и поместите их туда, куда хотите.Затем просто переключите биты режима обратно в предыдущий режим (я полагаю, что в вашем примере это был режим супервизора), и все готово.

Обратите внимание, что мы не переключились из режима супервизора в пользовательский режим. Если вы перешли от супервизора к пользователю, ты не смог вернуться в режим супервизора.(В противном случае не было бы защиты от повышения привилегий пользовательского кода).Вот почему мы использовали системный режим — системный режим является привилегированным, но регистры такие же, как и в пользовательском режиме.

Вы можете переключаться между любыми привилегированными режимами по своему желанию, манипулируя битами режима в CPSR.Я думаю, это младшие 5 бит?Я в дороге и у меня нет информации под рукой.В противном случае я бы предоставил вам ассемблерный код того, что я описал выше.На самом деле, если вы хотите, чтобы у вас на груди появились волосы, возьмите то, что я дал вам выше, реализуйте это, протестируйте и опубликуйте здесь.:-D

(Одну вещь я должен добавить для «общего случая» (ваш очень конкретен) — вы можете проверить SPSR, чтобы узнать, «откуда вы пришли» — и использовать это, чтобы определить, в какой режим вам нужно переключиться.)

Кстати, я недавно сделал это для одного из моих клиентов....мир тесен, я думаю.

Другие советы

Я нашел лучший способ:-

При выполнении STM, если r15 не является одним из операндов, то ^ предоставляет доступ к регистрам пользовательского режима.Однако автоинкремент, похоже, не работает в инструкции, и после этого требуется nop, если вы хотите получить доступ к банку регистров.

Что-то вроде

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top