реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Пара вопросов по архитектуре
InsolentS
сообщение May 6 2008, 01:14
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



1) Как из супервизора обратиться к пользовательским CPSR и SP?
2) Можно ли как-нибудь отследить обращение пользователя к определенным адресам памяти?
Ассемблер и компилятор RV, ядро ARM7TDMI без MMU (SAM7..LPC).
Буду благодарен за любую информацию по теме.


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
defunct
сообщение May 6 2008, 02:27
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



1). CPRS у Вас будет в SPSR. А SP можно получить так - переключиться обратно в User mode сохранить SP и вернуться в режим супервизора. e.g:

.. сохранить R0 и R14

__asm{ MRS R0, CPSR};
__asm{ BIC R0, R0, #0x03 }; // Clear SV-mode bits
__asm{ MSR CPSR_c, R0 }; // Enter USER mode
// тут уже можно сохранять SP.
// Перейти из User mode в SV-mode - по SWI инструкции.
__asm{ MOV R0, R13 }; // store user SP
__asm{ SWI <код вашего обработчика> }; // call SV

2). Без MMU нельзя.
Go to the top of the page
 
+Quote Post
KRS
сообщение May 6 2008, 06:40
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(defunct @ May 6 2008, 06:27) *
А SP можно получить так - переключиться обратно в User mode сохранить SP и вернуться в режим супервизора. e.g:

IMHO проще переключиться в SYSTEM, тогда обратно можно будет так же переключиться без SWI
Go to the top of the page
 
+Quote Post
amw
сообщение May 6 2008, 07:45
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(InsolentS @ May 6 2008, 04:14) *
1) Как из супервизора обратиться к пользовательским CPSR и SP?

Вот тут приводил пример. Вроде работает.
http://electronix.ru/forum/index.php?showtopic=43839


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 6 2008, 09:28
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(KRS @ May 6 2008, 09:40) *
IMHO проще переключиться в SYSTEM, тогда обратно можно будет так же переключиться без SWI

Да, действительно.
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 6 2008, 10:51
Сообщение #6


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Если не ошибаюсь, то метод получения USP в режиме супервизора таков
Код
SUB SP,SP,#4
MOV R1,SP
STMIA R1,{R13}^
LDMFD SP!,{R0}


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
KRS
сообщение May 6 2008, 11:24
Сообщение #7


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Rst7 @ May 6 2008, 14:51) *
Если не ошибаюсь, то метод получения USP в режиме супервизора таков
Код
SUB SP,SP,#4
MOV R1,SP
STMIA R1,{R13}^
LDMFD SP!,{R0}


А так нельзя?
Код
STMFD SP!,{R13}^
LDMFD SP!,{R0}
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 6 2008, 11:40
Сообщение #8


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
А так нельзя?


Пробовать надо. По поводу того, какой SP для адресации стека будет использован в первой команде (Usr или Svc) документация молчит. Так что если нету времени пробовать - мой вариант, есть время - может Ваш, а может мой wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
InsolentS
сообщение May 6 2008, 11:55
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Всем огромное спасибо!
Ещё небольшой вопрос - как современные оси, например, RTX отслеживают переполнение стека у пользовательской задачи без MMU?


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 6 2008, 11:57
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(KRS @ May 6 2008, 15:24) *
А так нельзя?
Код
STMFD SP!,{R13}^
LDMFD SP!,{R0}

Нельзя:
Во-первых, нельзя модифицировать базовый регистр при работе с пользовательским банком.
Во-вторых, нельзя в следующей за тем инструкции пользоваться банкируемым регистром.

Можно так:
Код
stmdb    sp, {sp}^
mov      r0, r0
ldmdb    sp, {r0}


Но лучше так:
Код
sub        sp, sp, #0x04
stmia    sp, {sp}^
nop
ldmia    sp!, {r0}
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 6 2008, 12:00
Сообщение #11


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
А так нельзя?
Пробовать надо.


Для начала, надо внимательно читать документацию. Номер раз -
Цитата
Base register mode: For the purpose of address calculation, the base register is read from the current
processor mode registers, not the User mode registers.

Значит, годится STMxx SP,{R13}^

Но, имеем два -
Цитата
Banked registers: This instruction must not be followed by an instruction which accesses banked
registers (a following NOP is a good way to ensure this).


И три - нельзя writeback SP сделать

Значит, финальный вариант должен выглядеть так -
Код
SUB SP,SP,#4
STMEA SP,{R13}^
NOP
LDMFD SP!,{R0}


Цитата
Ещё небольшой вопрос - как современные оси, например, RTX отслеживают переполнение стека у пользовательской задачи без MMU?


За всех не отвечу, Nucleos при сборке с контролем стека банально внутри каждой ОСовской функции проверяет, не вышел ли стек за границу. Все. Полумера конечно, но бывает спасает.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
InsolentS
сообщение May 9 2008, 06:42
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Цитата(Rst7 @ May 6 2008, 18:00) *
Значит, финальный вариант должен выглядеть так -
Код
SUB SP,SP,#4
STMEA SP,{R13}^
NOP
LDMFD SP!,{R0}

Если честно, не совсем понял как работает этот код wacko.gif . Не могли бы Вы прокомментировать? Можно ли таким же макером достать пользовательский LR ?


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 9 2008, 11:30
Сообщение #13


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Можно ли таким же макером достать пользовательский LR ?


Конечно. Только меняем {R13} на {R14}.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
KRS
сообщение May 9 2008, 15:38
Сообщение #14


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(InsolentS @ May 9 2008, 10:42) *
Если честно, не совсем понял как работает этот код wacko.gif . Не могли бы Вы прокомментировать? Можно ли таким же макером достать пользовательский LR ?

используется команда STM для сохранения списка регистров в память и LDM для чтения списка регистров из памяти (память выделяется в стеке, но моможно использовать и статически выделенную область), плюс используются некоторые особенности ее работы о которых лучше почитать в ARM architecture reference manual. Конечно можно таким образом и LR достать, а проще сразу все необходимые регистры за один раз
Код
  SUB SP, SP, #8
  STMIA SP, {R13,R14}
  NOP
  LDMFD SP!,{R0,R1}
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 9 2008, 19:31
Сообщение #15


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
STMIA SP, {R13,R14}


забыли ^

Код
STMIA SP, {R13,R14}^


Без нее будут регистры супервизора, в ней самая соль.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
InsolentS
сообщение May 9 2008, 23:18
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Цитата(Rst7 @ May 10 2008, 01:31) *
Без нее будут регистры супервизора, в ней самая соль.

А, теперь дошло, спасибо beer.gif


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
InsolentS
сообщение May 12 2008, 09:45
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Есть ещё одна проблема, не стал создавать новую ветку.
Если прерывание возникает во время команды безусловного перехода ( B ), в LR сохраняется адрес следующей команды, а не той куда указывает B, т.е. прерывание как бы возникает по середине команды перехода, когда она уже загрузилась в конвейер, но ещё не выполнилась. Чувствую что надо поставить NOP чтобы прогнать конвейер, но не пойму где, посоветуйте пожалуйста как решить проблему эту 07.gif


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 12 2008, 10:05
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Все правильно: в LR_irq сохраняется адрес возврата + 0x04, в обработчике адрес модифицируется. Никаких NOP'ов не нужно.
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 12 2008, 10:12
Сообщение #19


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Если прерывание возникает во время команды безусловного перехода ( B ), в LR сохраняется адрес следующей команды


Не волнуйтесь. Костыль там уже вставлен на уровне ядра wink.gif В LRirq сохраняется именно адрес комманды на который происходит переход, точнее, +4. Хотя точно сейчас посмотрю даташит.

Да. Все правильно. Вот так надо возвращаться и из IRQ, и из FIQ.
Код
SUBS PC, R14, #4


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
InsolentS
сообщение May 12 2008, 10:13
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 414
Регистрация: 8-06-06
Пользователь №: 17 897



Да, спасибо большое, разобрался :-)
Более внимательно прочтение даташита на ядро показало, что когда возвращаемся из PABT, FIQ, IRQ, надо из LR вычитать 4, а если из DABT то 8.


--------------------
Курильщик даташитов со стажем
Go to the top of the page
 
+Quote Post
amw
сообщение May 12 2008, 10:14
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(InsolentS @ May 12 2008, 12:45) *
Есть ещё одна проблема, не стал создавать новую ветку.
Если прерывание возникает во время команды безусловного перехода ( B ), в LR сохраняется адрес следующей команды, а не той куда указывает B, т.е. прерывание как бы возникает по середине команды перехода, когда она уже загрузилась в конвейер, но ещё не выполнилась. Чувствую что надо поставить NOP чтобы прогнать конвейер, но не пойму где, посоветуйте пожалуйста как решить проблему эту 07.gif

Либо компилятор вставит сам нужные команды, либо Вы вручную вставляете что-то типа
Код
@ Adjust and save LR_irq to IRQ stack
    sub    lr, lr, #4
    stmdb    sp!, {r0, r1, lr}    @ Save IRQ mode registers
...........
@ Restore adjusted LR_irq from IRQ stack directly in the PC
    ldmia    sp!, {r0, r1, pc}^    @ Restore IRQ mode registers

Компиляторы имеют спец-средства для определения обработчика прерывания.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01566 секунд с 7
ELECTRONIX ©2004-2016