Почему мы вычитаем 4 из arm926ejs_reset перед загрузкой в ​​sp? - PullRequest
2 голосов
/ 06 марта 2012

У меня есть код запуска для ARM926ej-s, который поддерживает ISA ARMv5TEJ.Код запуска выглядит, как показано ниже, но я переключил некоторые команды / данные с комментариями для ясности.Строки, которые мне до сих пор неясны, помечены комментарием "@???????????????????????????????????????????????????????".

Интересно, зачем нам вычитать "#4" из сохраненного значения (местоположение "arm926ejs_reset")?в регистре "r3"?А затем загрузите его в указатель стека через 4 строки, где мы устанавливаем стеки для первого режима процессора, который является режимом быстрого прерывания.

__start:
arm926ejs_reset:

@here there is image header data needed by ISROM

arm926ejs_reset_handler:

    @here we disable MMU, I-cache, D-cache, flush them... and prepare the mcpu.

    LDR   r5, =inVirtMem

    @here we enable MMU.

    MOV   pc, r5 

    NOP
    NOP
    NOP

inVirtMem:
    ADR   r3, arm926ejs_reset @load location of "arm926ejs_reset" label in r3
    MOV   r1, #IF_MASK

    SUB   r3, r3, #4 @???????????????????????????????????????????????????????

    ORR   r0, r1, #MODE_FIQ
    MSR   cpsr_cxsf, r0
    MOV   sp, r3 @???????????????????????????????????????????????????????????
    SUB   r3, r3, #FIQ_STACK_SIZE

...

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Я нашел в сети такие же коды запуска, как и у вас, которые хорошо прокомментированы. В этом коде запуска на Line 186 видно, что r3 указывает на базовый адрес MMU. MMU охватывает перед своим базовым адресом. то есть, если MMU_BASE_ADDRESS = 0x400, MMU записи будут в 0x400, 0x404 0x408 и т. д. Теперь в Line 217 r3 вычитается на 4, а затем присваивается SP на Line 222. Если мы не вычтем 4, наша первая запись в стеке (наблюдаем, что стек растет в обратном направлении макета MMU) будет перезаписана при первой записи MMU! Отсюда вычитание.

Аналогично в вашем примере, если мы не вычтем 4, ваш стек будет перезаписан на самом обработчике сброса . Ваша программа пойдет на бросок.

Еще один пример - это код запуска , где они идут до конца IRAM и вычитаются 4. Конец IRAM подразумевает только за пределами IRAM и, следовательно, вычитание, которое должно прийти внутрь IRAM

Обратите внимание, что в данном конкретном примере стек растет вверх (или к младшим адресам) (стеки ARM могут расти в любом случае)

0 голосов
/ 07 марта 2012

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

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

Это может зарезервировать слово стекового пространства для собственного использования вне пределовфрагмент, который вы показываете?

...