Исключение 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, вы можете различать эти случаи. Если вы получаете прерывание данных при отображении, это, скорее всего, ошибка разрешения. Иначе, это просто ошибка перевода.