2008-11-27 4 views
6

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

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

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

Благодаря

ответ

9

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

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

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

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

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

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

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

+0

Вау спасибо. Я никогда не замечал, что пользовательский режим и системный режим разделяют одни и те же регистры! Я буду взломать код. Боюсь, я не могу опубликовать его здесь, потому что это для куски курса, но я думаю, что вы описали принципы очень хорошо, что более важно. – Tarski 2008-11-28 12:59:37

+0

Добро пожаловать. Удачи в курсовой работе. – Dan 2008-11-28 18:16:53

3

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

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

Что-то вроде

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode 
nop 
sub r13, r13, #8  ;update stack pointer 

 Смежные вопросы

  • Нет связанных вопросов^_^