для обработчика ошибок страницы; Для начала определите причину сбоя страницы и что с ней делать - это может быть недопустимый доступ (отправить сигнал? дамп ядра? pani c?), может быть «отложенная недействительность TLB» (аннулировать запись TLB и больше ничего не делать) , может быть «копировать при записи» (копировать данные на вновь выделенную страницу и заменять старую страницу новым копированием и настраивать права доступа к странице), может быть «извлекать из другого места» (swap? memory mapped file?) и может «извлекаться» "(скажите, что поток планировщика должен ждать).
Для" извлечения из другого места "; пометить страницу как «извлекаемую» каким-либо образом (так что, если другие потоки в том же процессе пытаются получить доступ к странице, они знают, что могут просто подождать, и вы не закончите получать одни и те же данные несколько раз); и создавать и отправлять (асинхронный) запрос ввода-вывода к чему угодно (файловая система, менеджер подкачки); и скажите планировщику: «Не давайте этому потоку никакого времени ЦП, пока менеджер виртуальной памяти не скажет, что он может продолжить» (возможно, вызовет переключение задач).
Когда запрос ввода-вывода завершается (и прерывает что-то еще); изучить статус. Если запрос ввода-вывода завершился неудачно (например, неисправный диск), вам придется как-то обработать его (обработать как неисправимую ошибку / cra sh?). В случае успеха сопоставьте данные с процессом (удаляя при этом маркер «извлекается»), а затем сообщите планировщику, что любые задачи / потоки, которые ожидали страницу, могут теперь продолжаться (возможно, вызывая переключение задач).
Примечания:
вам понадобится схема для отправки страниц в пространство подкачки, а в некоторых случаях (исчерпание памяти) вам может потребоваться отправить несколько страниц / страниц, чтобы обменять пространство на свободной оперативной памяти, что вам нужно для извлечения страниц из пространства подкачки. Для этого вы можете по-разному относиться к некоторым вещам, чтобы лучше справляться с условиями «переброса» (например, чтобы такие процессы, как системные утилиты и GUI, оставались отзывчивыми и могли использоваться для уничтожения других процессов)
вам могут потребоваться приоритеты ввода / вывода - например, чтобы отправка данных в своп была наивысшим приоритетом, выборка данных из свопа была вторым наивысшим приоритетом, а все остальное имеет более низкий приоритет Это гарантирует, что (например) неважная фоновая задача, пытающаяся прочитать файл размером 1234 ГБ, не приведет к остановке всей ОС.
, возможно, вы захотите выполнить предварительную выборку - например, когда огромный процесс завершается, и вы внезапно обнаруживаете, что у вас много свободной оперативной памяти, начните предварительную выборку данных из пространства подкачки (в «наиболее важном порядке»?) до того, как это потребуется.
сторона дискового ввода-вывода полностью отделена; и, вероятно, должны быть реализованы и протестированы, прежде чем вы добавите поддержку файлов подкачки или сопоставленных файлов памяти.