Исключение Dabt во всех случаях?

Я пытаюсь найти объяснение своему наблюдению

а) Предполагается, что PERIPHBASE имеет значение 0x2c000000 и MMU отключен. Если доступ к адресу 0x21000000 будет ли DABT? Я получил DABT

б) Предполагается, что трансляция MMU включена и отображение 1:1 создается с использованием только блоков 1G (Lpae). Таким образом, существует отображение 1:1 для 0x2100000. Доступ к нему снова дает DABT.

c) MMU включен, но запись 1, которая содержит 0-1G, помечена как недействительная. Доступ к 0x21000000 снова дает DABT.

Если вы пишете обработчик исключений / ловушек, как бы вы узнали, какой из (a) (b) (c) вызвал исключение / ловушку.

Нужны входные данные, немного запутался здесь...

2 ответа

Решение

PERIPHBASE на самом деле не имеет отношения к вопросу.

Существует два основных типа прерывания данных (DABT):

  • Внутренний (генерируется MMU)
  • Внешний (возвращается через соединение или подчиненное устройство)

Таким образом, для (a) возможна только внешняя отмена (MMU будет запускать прерывания только при включении).

(b) Учитывая, что мы знаем, что попытка доступа к периферийному устройству по данному адресу вызовет прерывание, вполне вероятно, что прерывание с MMU и действительным отображением также является внешним прерыванием. Но в этом случае возможен любой из них (проверка выравнивания может привести к внутреннему прерыванию, даже если сопоставление допустимо).

(c) Если MMU включен и отображение недопустимо, внешний доступ не будет сделан, поэтому это будет внутренним прерыванием.

Как указывает Jitesh, регистр состояния сбоя данных (DFSR) может предоставить вам информацию о сбое. Поле Fault Status сообщит вам, как произошел сбой доступа, и, если прерывание было внешним, бит ExT сообщит вам о том, был ли сбой сгенерирован межсоединением (DECERR) или был ответом об ошибке от подчиненного устройства (SLVERR).

Это на самом деле довольно просто.

(a) Я подозреваю, что вы не можете прервать данные, когда MMU отключен. Из того, что я знаю, прерывание данных является собственностью MMU. В любом случае бит 0 SCTRL сообщит вам, включен ли MMU или нет.

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

Другие вопросы по тегам