Инициализация адресного пространстава для процесса
PDE то проблемы нету, выделилил page и все, но ведь PTE надо монтировать для последующего монтирования страниц в них же из создаваемого процесса!!!
А вновь созданная PDE пуста, и получается что я не могу примонтировать PTE в создаваемом процессе без PTE, тоесть тут замкнутый круг получается!!!
З.Ы.: Дайте, пожалуйста, ссылку на русский мануал Intel'а!
Вновь создаваемый каталог страниц не должен быть пустым, т.к. в нем сразу нужно проинициализировать глобальные входы, благодаря которым в новом процессе сможет выполняться код ядра. Для этого страницу, выделенную для каталога страниц нового процесса, ты предварительно должен примонтировать к уже имеющемуся адресному пространству, например, к пространству родительского процесса для вновь создаваемого.
Кажется причина еще раньше - допустим такая ситуация:
Ядро загрузилось, инициализировало paging, и тут ему необходимо память выделить - 1 PTE хватает на 4 метра, а если оно заполнело всю память разом и чтобы создать еще PTE нету места в существующей чтобы в неё что-то писать!!!
Как это предотвратить???
У меня просто на случай отсутствия PTE в PDE стоит выделение страницы под неё, но как я упомянул памяти навалом, хоть завались, а примонтировать её некуда!!!
Как это делается в существующих ОС???
Не знаю, как это делается в "существующих осях", но точно знаю, что память нужно прикреплять к адресным пространствам только по мере необходимости. У меня, например, для порождения новых процессов в области локальных данных ядра зарезервирован специальный фрейм, через который я формирую участки таблицы страниц (каталог страниц у меня является частью 4-мегабайтной таблицы страниц) для вновь создаваемых процессов. После того как страницы размечаются через фрейм, я их отключаю от родительского процесса, чтобы этот фрейм можно было использовать для порождения других дочерних процессов.
По идее у отдельно взятого процесса должно быть "навалом" места, куда можно примонтировать необходимую память! А чтобы была возможность монтировать память в контексте процесса, таблица страниц для этого процесса (включая каталог) также должна отображать в его адресном пространстве! В контексте родителя формируются только необходимые на начальном этапе фрагменты таблицы страниц для нового процесса. Далее работа с таблицей страниц выполняется уже в контексте владельца этой таблицы страниц. Например, у меня во всех процессах последние 4 Мб вирт. адресного пространства зарезервированы для таблицы страниц, в которой последние 4 Кб являются одновременно каталогом страниц и транс-страницей для всей 4-мегабайтной таблицы страниц. После создания процесса все манипуляции с его адресным пространством выполняются через эту таблицу, естественно, в контексте данного процесса.
Тоесть у тебя у каждого процесса птешок на все 4 Гб зарезервированно?
Естественно, нет! Только место для них!
Цитата: Phantom-84
Естественно, нет! Только место для них!
Хм, а что!
4 последних метра да еще и с PDE+PTE шкой позволит упростить многое!
Не возражаешь, если я позаимствую эту идею???
Мне не жалко :D
Спасибо!