Когда подкачка включена и возникает исключение, происходит ли обход таблицы преобразования для доступа к таблице векторов исключений по адресу 0x00000000?
Почти все процессоры ARM имеют средства для настройки адреса таблицы исключений. Поэтому в большинстве систем таблица векторов исключений не находится по адресу 0x00000000. Однако MMU включается, когда принимаются исключения. TLB (кеш таблицы MMU / страницы) будет содержать физический адрес таблицы векторов.
В некоторых SOC таблица загрузочных векторов может быть в 0x0, но это обычно переконфигурируется загрузочным кодом.
- Если подкачка по-прежнему включена, то как процессы пользовательского режима и таблица векторов совместно используют адрес 0x00000000 - TTBR (базовый регистр таблицы трансляции) не обновляется при записи исключения, а TTBR не является регистром, зарегистрированным в банке (мы не здесь речь идет о переключении между безопасным и небезопасным миром).
Если вам нужна таблица векторов по адресу 0x00000000, то это то, что увидит пользовательское пространство, если вы не запретите это. Запрет доступа к 0x0 может быть желательным для предотвращения использования указателя NULL. Во многих ОС пользовательское пространство не запускается с 0x0, а адрес, например, 0x8000.
Наличие ошибки пространства пользователя, основанной на параметре, может быть очень полезным, поскольку вы можете перехватить доступ к нулевому указателю во время разработки процесса. Я бы рекомендовал всегда оставлять это включенным, но некоторые люди допускают NULL-доступ к производственному коду.
- Если нет, тогда мы должны вводить исключения, используя физическую адресацию, в этом случае подкачка теперь отключена?
Нет подкачки, поскольку кэш, вероятно, также включен. Модуль загрузки / хранения ЦП будет более сложным, если некоторые доступы будут физическими, а другие - виртуальными; тем более что кеши заполнены виртуальным адресом в традиционных процессорах ARM.