Почему адреса возврата прерывания предварительной выборки и прерывания данных различаются в исключениях ARM? - PullRequest
7 голосов
/ 09 июня 2011

для предварительной выборки, адрес возврата: R14_abt = адрес прерванной инструкции + 4

, а для сброса данных адрес возврата: R14_abt = адрес прерванной инструкции + 8

Ответы [ 3 ]

14 голосов
/ 09 июня 2011

Эти смещения связаны с конвейерной обработкой процессора и этапами выборки / декодирования / выполнения.

Счетчик программ процессора (ПК) обновляется в определенные моменты во время выполнения.Исключения могут возникать на разных этапах извлечения / декодирования / выполнения.

В случае прерывания предварительной выборки инструкция не может быть (не была выполнена);исключение возникает только тогда, когда процессор фактически пытается выполнить инструкцию (некоторые предварительно выбранные инструкции могут не выполняться).

В случае сброса данных выполняется инструкция, и выполнение инструкции вызывает исключение.

Из документации ARM:

Относительно прерывания предварительной выборки:

[Исключение прерывания предварительной выборки] Происходит, когда процессор пытается выполнитьинструкция, предварительно извлеченная с недопустимого адреса, то есть адреса, определенного подсистемой управления памятью, недоступна процессору в его текущем режиме.

... Инструкции, уже находящиеся в конвейере, продолжают выполняться до тех пор, пока недопустимая инструкция будет достигнута, и в этот момент будет сгенерировано прерывание предварительной выборки.

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

и относительно сброса данных:

[Исключение сброса данных] Происходит, когдакоманда передачи данных пытается загрузить или сохранить данные по недопустимому адресу.

Когда команда загрузки или сохранения пытается получить доступ к памяти, счетчик программ был обновлен. Сохраненное значение (pc- 4) в lr_ABT указывает на вторую инструкцию за пределами адреса, где было сгенерировано исключение.Когда MMU загрузит соответствующий адрес в физическую память, обработчик должен вернуться к исходной прерванной инструкции, чтобы можно было предпринять вторую попытку выполнить ее. Адрес возврата, следовательно, на два слова (восемь байтов) меньше, чем в lr_ABT

Таким образом, другими словами, для сброса данных обработчик должен вернуться к lr_ABT- 8 (двумя словами / инструкциями ранее)

2 голосов
/ 09 июня 2011

Не помню, чтобы я видел официальное объяснение, но если подумать, это довольно логично.

Давайте рассмотрим этот пример:

00000 INSN1 [PC = 08]
00004 INSN2 [PC = 0C]
00008 INSN3 [PC = 10]

Если процессор не может извлечь INSN3, прерывание происходит перед его выполнением, поэтому значение ПК по-прежнему равно INSN2, то есть 0C.

Если во время выполнения INSN3 происходит прерывание данных, значение ПК уже обновляется до 10.

0 голосов
/ 28 апреля 2019

Для прерывания предварительной выборки

new_lr_value = if CPSR.T == ‘1’ then PC else PC-4

Для прерывания данных

new_lr_value = if CPSR.T == ‘1’ then PC+4 else PC;

Ссылка TRM TakePrefetchAbortException () и TakeDataAbortException ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...