Разработка ОС - обработка ошибок страниц и драйвер диска - PullRequest
0 голосов
/ 25 февраля 2020

В настоящее время я разрабатываю крошечную операционную систему для целей обучения (см. здесь для кода), и в настоящее время я работаю с пейджингом и управлением памятью.

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

Кто-нибудь может предоставить некоторую помощь или какой-либо онлайн-справочник?

1 Ответ

3 голосов
/ 25 февраля 2020

для обработчика ошибок страницы; Для начала определите причину сбоя страницы и что с ней делать - это может быть недопустимый доступ (отправить сигнал? дамп ядра? pani c?), может быть «отложенная недействительность TLB» (аннулировать запись TLB и больше ничего не делать) , может быть «копировать при записи» (копировать данные на вновь выделенную страницу и заменять старую страницу новым копированием и настраивать права доступа к странице), может быть «извлекать из другого места» (swap? memory mapped file?) и может «извлекаться» "(скажите, что поток планировщика должен ждать).

Для" извлечения из другого места "; пометить страницу как «извлекаемую» каким-либо образом (так что, если другие потоки в том же процессе пытаются получить доступ к странице, они знают, что могут просто подождать, и вы не закончите получать одни и те же данные несколько раз); и создавать и отправлять (асинхронный) запрос ввода-вывода к чему угодно (файловая система, менеджер подкачки); и скажите планировщику: «Не давайте этому потоку никакого времени ЦП, пока менеджер виртуальной памяти не скажет, что он может продолжить» (возможно, вызовет переключение задач).

Когда запрос ввода-вывода завершается (и прерывает что-то еще); изучить статус. Если запрос ввода-вывода завершился неудачно (например, неисправный диск), вам придется как-то обработать его (обработать как неисправимую ошибку / cra sh?). В случае успеха сопоставьте данные с процессом (удаляя при этом маркер «извлекается»), а затем сообщите планировщику, что любые задачи / потоки, которые ожидали страницу, могут теперь продолжаться (возможно, вызывая переключение задач).

Примечания:

  • вам понадобится схема для отправки страниц в пространство подкачки, а в некоторых случаях (исчерпание памяти) вам может потребоваться отправить несколько страниц / страниц, чтобы обменять пространство на свободной оперативной памяти, что вам нужно для извлечения страниц из пространства подкачки. Для этого вы можете по-разному относиться к некоторым вещам, чтобы лучше справляться с условиями «переброса» (например, чтобы такие процессы, как системные утилиты и GUI, оставались отзывчивыми и могли использоваться для уничтожения других процессов)

  • вам могут потребоваться приоритеты ввода / вывода - например, чтобы отправка данных в своп была наивысшим приоритетом, выборка данных из свопа была вторым наивысшим приоритетом, а все остальное имеет более низкий приоритет Это гарантирует, что (например) неважная фоновая задача, пытающаяся прочитать файл размером 1234 ГБ, не приведет к остановке всей ОС.

  • , возможно, вы захотите выполнить предварительную выборку - например, когда огромный процесс завершается, и вы внезапно обнаруживаете, что у вас много свободной оперативной памяти, начните предварительную выборку данных из пространства подкачки (в «наиболее важном порядке»?) до того, как это потребуется.

  • сторона дискового ввода-вывода полностью отделена; и, вероятно, должны быть реализованы и протестированы, прежде чем вы добавите поддержку файлов подкачки или сопоставленных файлов памяти.

...