2016-01-28 4 views
0

У меня есть концептуальный вопрос относительно операционных систем и обработчиков ошибок страниц. Рассмотрим случай, когда ядро ​​имеет виртуальное адресное пространство. Поэтому, если есть ошибка страницы, и выполнение переходит к обработчику ошибок страницы. И если стек для выполнения обработчика ошибок страницы вызывает ошибку страницы, что происходит тогда?Рекурсивный обработчик ошибок страницы

+1

Я не могу ответить на ваш вопрос полностью, но само ядро ​​имеет полное господство над памятью, и может гарантировать, что жизненно важно такие подпрограммы не выгружаются на диск. Фактически вы можете заблокировать страницы в приложении пользовательского пространства, используя [mlock] (http://man7.org/linux/man-pages/man2/mlock.2.html). – Yuushi

+0

Ничего себе, я не знал, что существует млеконик! Спасибо, что сказали мне это! Итак, существует зарезервированный стек для каждого обработчика в таблице векторов прерываний? – Curious

+1

@ Curious: для обработчиков нет зарезервированного стека. Они всегда в физической памяти и никогда не выгружаются. Они находятся в пространстве ядра, а не в пространстве пользователя. – ray

ответ

3

Если стек для выполнения обработчика ошибок страницы вызывает ошибку страницы, что происходит тогда?

Для обработчиков нет зарезервированного стека.

Процедура обработки ошибок страницы является частью ядра операционной системы и, следовательно, в пространстве ядра. Несмотря на то, что память ядра по-прежнему организована на страницы, эти страницы остаются в физической памяти и не выгружаются на диск. Вещи, которые выгружаются на диск, находятся в пользовательском пространстве. Таким образом, поскольку память ядра не будет заменена, ошибки страницы не будут генерироваться, когда ядро ​​пытается обработать ошибку страницы.

Это имеет смысл, если вы думаете об этом. Ядро не сможет обрабатывать какие-либо ошибки страницы, если код для обработки ошибок страницы должен требовать, чтобы обработчик ошибок страницы возвращался в физическую память. Он не сможет этого сделать.

В принципе, если мы все-таки попытаться предположить свой сценарий, то я думаю, что ядро ​​будет:

  • необходимости стать более сложной для того, чтобы справиться с этим делом вы воспитаны;
  • не может работать или поддерживать виртуальные адресные пространства и/или свопировать память;
  • обрушится, как только занимает первое место ошибка страницы (например, вероятно, паника ядра)
+0

Извините, что я опубликовал комментарий выше, плохо просто скопируйте его здесь. Но что, если стек исполнения для подпрограммы растет до такой степени, что он попадает в часть памяти, которая сопоставляется с виртуальным адресом для какого-то другого процесса? – Curious

+1

@ Curious: Я не уверен, что следую вашему вопросу. Я думаю, вы можете смешать несколько вещей. Виртуальные адреса сопоставляются с физическими адресами, а не наоборот. В конечном счете, если в ядре должен произойти серьезный беспорядок, который не может быть обработан, то, скорее всего, вы получите непредсказуемое поведение, тупик или, в худшем случае, панику. Эта [osdev wiki] (http://wiki.osdev.org/Paging) может быть полезна для вас. – ray

+0

Извините, что не ясны! Это то, что я имел в виду. Предположим, что процесс A обращается к памяти в ячейке памяти 4000, а затем возникает ошибка страницы, выполнение переключается на обработчик ошибок страницы (предположим в этой схеме, что у нас есть ядро ​​с виртуальным адресным пространством), теперь, когда запущен обработчик ошибок страницы, и он увеличивает указатель стека и сохраняет что-то в стеке по адресу 4020, есть еще одна ошибка страницы. Что происходит тогда? – Curious

Смежные вопросы