2012-02-20 3 views
3

Я разрабатываю операционную систему на C, и я борется с поисковым вызовом. Я тестирую кучу ядра в цикле, выделяя память и выводя на экран вывод распределения памяти низкого уровня, который обрабатывает физическое и виртуальное распределение страниц.Перезагрузка инструкции после ошибки страницы

Когда PDE 0, все работает отлично подходит для страниц 0-1023 но как только распределения переходит к PDE 1, ошибка страницы поднимается с настоящим флагом, а иногда и rw флаг тоже, если я начинаю выделять из другого физического адреса.

Должен ли я получить адрес сбоя от cr2 и отобразить его обратно на PDE и страницу, к которой он принадлежит, а затем установить или адрес с 3? После этого мне нужно перезапустить инструкцию, но как мне это сделать? Какие-либо предложения?

+0

Я не уверен, что понимаю, что вы спрашиваете в своем первом вопросе. Похоже, вы уже знаете, что делать с адресом, вызывающим ошибку? Что касается возврата: ошибки страницы такие же, как и любое другое прерывание - EIP/RIP (в этом случае, указывая на * инструкцию, вызвавшую ошибку страницы), сохраняется в стек до того, как вызывается обработчик ошибок на странице. – pmdj

+0

Спасибо за ваш ответ. Ошибка страницы была вызвана неправильным распределением фрейма, который был выделен ранее выделенным кадром. Кроме того, проблема была связана с байтами в килоблоке, которые прошли границу страницы. Но все решено сейчас. Благодаря! –

ответ

2

Page Fault - это ошибка, что означает, что обработчик ошибок на странице вызывается непосредственно процессором, как если бы произошло прерывание.

После того, как вы обслуживали ошибку страницы и хотели бы вернуться к вызывающему абоненту, вам необходимо вернуться с неисправности с помощью инструкции IRET. Это вернет код-сегмент, регистр eflags и EIP (и, возможно, SS и ESP пользовательского режима, если ошибка была вызвана кольцом 3) назад к инструкции, вызвавшей ошибку.