Я работаю над дизайном ядра, и у меня есть несколько вопросов, касающихся подкачки.
Основная идея, которую я имею до сих пор, заключается в следующем: каждая программа получает свои собственные (или, по ее мнению, 4G) памяти, за исключением раздела где-то, который я резервирую для функций ядра, которые программа может вызывать. Итак, ОС должна найти способ загрузки страниц в память, которые программа должна использовать во время работы.
Теперь, предполагая, что у нас было бесконечное количество памяти и процессорного времени, я мог загружать / выделять любую страницу, на которую программа писала или читала, как это происходило, используя ошибки страниц для страниц, которые не существовали (или были выгружены) поэтому операционная система может быстро выделить их или поменять их местами. Однако в реальном мире мне нужно оптимизировать этот процесс, чтобы у нас не было программы, постоянно потребляющей всю память, к которой она когда-либо обращалась.
Так что я думаю, мой вопрос, как ОС обычно это делает? Моя первоначальная мысль состояла в том, чтобы создать функцию, которую программа вызывает для установки / освобождения страниц, которую она затем может самостоятельно управлять памятью, но обычно ли программа делает это, или компилятор предполагает, что она имеет свободное управление? Кроме того, как компилятор обрабатывает ситуации, когда ему нужно выделить довольно большой сегмент памяти? Нужно ли предоставлять функцию, которая пытается привести X страниц в порядок?
Это, очевидно, не специфический для языка вопрос, но я неравнодушен к стандарту C и хорош в C ++, поэтому я хотел бы, чтобы любые примеры кода были либо в этом, либо в сборке. (Сборка не обязательна, я полностью намереваюсь заставить ее работать с как можно большим количеством кода C и оптимизировать как последний шаг.)
Еще одна вещь, на которую также должно быть легче ответить: как обычно обрабатывают функции ядра, которые должна вызывать программа? Можно ли просто иметь установленную область памяти (я думал о конце виртуального пространства), которая содержит большинство основных функций / памяти, специфичных для процесса, которые может вызывать программа? Я подумал, что функции ядра должны сделать что-то очень причудливое и поменять страницы (чтобы программы не могли видеть чувствительные функции ядра в своем собственном пространстве), когда программы должны были сделать что-то серьезное, но я не совсем сосредоточив внимание на безопасности на данный момент.
Так что, я думаю, меня больше волнуют общие идеи дизайна, чем специфика. Я хотел бы сделать ядро полностью совместимым с GCC (каким-то образом), и мне нужно убедиться, что оно обеспечивает все, что потребуется нормальной программе.
Спасибо за любой совет.