ошибка страницы, нехватка страницы или нарушение прав доступа? - PullRequest
3 голосов
/ 18 марта 2012

Известно, что при доступе к странице, которая не существует в памяти, может произойти сбой страницы, но запись страницы только для чтения также может вызвать сбой страницы? Как определить два типа ошибок страницы в обработчике исключений?

Ответы [ 3 ]

7 голосов
/ 18 марта 2012

Вы прочитали код ошибки исключения, который ЦП помещает в стек, прежде чем вызывать обработчик ошибок вашей страницы. Этот код ошибки содержит 5 битов, из которых вас интересуют эти 4:

  • P = 0: ошибка вызвана отсутствующей страницей.
    P = 1: ошибка вызвана нарушением защиты на уровне страницы.
  • W / R = 0: доступ, вызвавший ошибку, был считан.
    W / R = 1: доступ, вызвавший ошибку, был записью.
  • U / S = 0: доступ, вызвавший ошибку, возник, когда процессор выполнялся в режиме супервизора.
    U / S = 1: доступ, вызвавший ошибку, возник, когда процессор выполнялся в режиме пользователя.
  • I / D = 0: ошибка не была вызвана извлечением инструкции.
    I / D = 1: ошибка вызвана извлечением команды.

Если вы получите P = 0, страницы нет.

Если вы получите P = 1, привилегий недостаточно для доступа к странице. U / S сообщает вам, находится ли оно в ядре или приложении. I / D говорит вам, если это из-за чтения инструкции кода или нет (чтение / запись данных). W / R скажет вам, если это чтение или запись, которые нельзя сделать.

Это описано в разделе Interrupt 14—Page-Fault Exception (#PF) Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3: System Programming Guide.

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

Ответ Алекса совершенно правильный, однако вам также необходимо объединить эту информацию с некоторой собственной информацией (например, просмотрев данные менеджера памяти).Например, некоторые операционные системы не выделяют страницы для резервного копирования до тех пор, пока на них не ссылаются в первый раз, поэтому, если вы получаете чтение или запись на страницу, которой нет, вы можете обнаружить, что причина ее отсутствия заключается в том, чтоВы еще не распределили его, и вы должны выделить его и продолжить с исключения.Точно так же запись на страницу только для чтения может происходить как часть механизма копирования при записи (многие системы делают это, особенно системы в стиле posix при выполнении fork ()), поэтому вы обнаруживаете запись на страницу только для чтенияпроверьте таблицы диспетчера памяти и убедитесь, что страница должна быть скопирована, скопируйте страницу, обновите таблицы страниц и продолжите.

Я обнаружил, что, как правило, единственный интересный флаг из списка, который упоминает Алекс, этотот, который говорит, было ли это чтение или запись.Кроме того, вам все равно нужно проверить все остальное из таблиц MM.

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

Попытка записи только для чтения обычно вызывает ошибку сегментации (SIGSEGV).

http://en.wikipedia.org/wiki/Segmentation_fault

Я думаю, что это называется исключением нарушения прав доступа (нарушение доступа к памяти) на языке x86.

...