У меня есть концептуальный вопрос относительно операционных систем и обработчиков ошибок страниц. Рассмотрим случай, когда ядро имеет виртуальное адресное пространство. Поэтому, если есть ошибка страницы, и выполнение переходит к обработчику ошибок страницы. И если стек для выполнения обработчика ошибок страницы вызывает ошибку страницы, что происходит тогда?Рекурсивный обработчик ошибок страницы
ответ
Если стек для выполнения обработчика ошибок страницы вызывает ошибку страницы, что происходит тогда?
Для обработчиков нет зарезервированного стека.
Процедура обработки ошибок страницы является частью ядра операционной системы и, следовательно, в пространстве ядра. Несмотря на то, что память ядра по-прежнему организована на страницы, эти страницы остаются в физической памяти и не выгружаются на диск. Вещи, которые выгружаются на диск, находятся в пользовательском пространстве. Таким образом, поскольку память ядра не будет заменена, ошибки страницы не будут генерироваться, когда ядро пытается обработать ошибку страницы.
Это имеет смысл, если вы думаете об этом. Ядро не сможет обрабатывать какие-либо ошибки страницы, если код для обработки ошибок страницы должен требовать, чтобы обработчик ошибок страницы возвращался в физическую память. Он не сможет этого сделать.
В принципе, если мы все-таки попытаться предположить свой сценарий, то я думаю, что ядро будет:
- необходимости стать более сложной для того, чтобы справиться с этим делом вы воспитаны;
- не может работать или поддерживать виртуальные адресные пространства и/или свопировать память;
- обрушится, как только занимает первое место ошибка страницы (например, вероятно, паника ядра)
Извините, что я опубликовал комментарий выше, плохо просто скопируйте его здесь. Но что, если стек исполнения для подпрограммы растет до такой степени, что он попадает в часть памяти, которая сопоставляется с виртуальным адресом для какого-то другого процесса? – Curious
@ Curious: Я не уверен, что следую вашему вопросу. Я думаю, вы можете смешать несколько вещей. Виртуальные адреса сопоставляются с физическими адресами, а не наоборот. В конечном счете, если в ядре должен произойти серьезный беспорядок, который не может быть обработан, то, скорее всего, вы получите непредсказуемое поведение, тупик или, в худшем случае, панику. Эта [osdev wiki] (http://wiki.osdev.org/Paging) может быть полезна для вас. – ray
Извините, что не ясны! Это то, что я имел в виду. Предположим, что процесс A обращается к памяти в ячейке памяти 4000, а затем возникает ошибка страницы, выполнение переключается на обработчик ошибок страницы (предположим в этой схеме, что у нас есть ядро с виртуальным адресным пространством), теперь, когда запущен обработчик ошибок страницы, и он увеличивает указатель стека и сохраняет что-то в стеке по адресу 4020, есть еще одна ошибка страницы. Что происходит тогда? – Curious
- 1. главный обработчик ошибок страницы в ядре Linux
- 2. Обработчик ошибок CakePHP
- 3. Обработчик ошибок флэш-памяти
- 4. Рекурсивный QuickSort несколько ошибок
- 5. Трассировка стека Обработчик ошибок и Promises Обработчик ошибок
- 6. Обработчик ошибок HTTP в Odoo
- 7. Пользовательский обработчик ошибок PHP
- 8. MonoDroid: глобальный обработчик ошибок
- 9. [papaparse] Обработчик ошибок Parse
- 10. libxml_get_errors custom обработчик ошибок
- 11. backbonejs collection.fetch обработчик ошибок
- 12. php custom обработчик ошибок
- 13. ColdFusion тегов Обработчик ошибок
- 14. Обработчик ошибок в python
- 15. дооснащения Rxjava обработчик ошибок
- 16. Http-обработчик ошибок загрузки
- 17. Обработчик ошибок уровня модуля
- 18. WCF обработчик ошибок
- 19. Обработчик ошибок Ajax не выполнен
- 20. Какой стек выполняет обработчик ошибок страницы в операционной системе на
- 21. Как обработчик ошибок страницы знает, где получить байты 4K?
- 22. Swift: Сделать обработчик ошибок AVAudioPlayer
- 23. Слим 3 активировать обработчик ошибок
- 24. Обработчик ошибок хранимой процедуры MariaDB
- 25. Пользовательский обработчик ошибок в Zone.js
- 26. Redirect stderr to обработчик ошибок
- 27. Угловой обработчик ошибок HTTP HTTP
- 28. Kohana не отображает обработчик ошибок
- 29. Общие обработчик ошибок для Restangular
- 30. Общий обработчик ошибок для Backbone
Я не могу ответить на ваш вопрос полностью, но само ядро имеет полное господство над памятью, и может гарантировать, что жизненно важно такие подпрограммы не выгружаются на диск. Фактически вы можете заблокировать страницы в приложении пользовательского пространства, используя [mlock] (http://man7.org/linux/man-pages/man2/mlock.2.html). – Yuushi
Ничего себе, я не знал, что существует млеконик! Спасибо, что сказали мне это! Итак, существует зарезервированный стек для каждого обработчика в таблице векторов прерываний? – Curious
@ Curious: для обработчиков нет зарезервированного стека. Они всегда в физической памяти и никогда не выгружаются. Они находятся в пространстве ядра, а не в пространстве пользователя. – ray