Цитата:
Но в любом случае, для хранения битмапы, стэка, дерева или еще чего нужна физическая память, которую нужно выделить.
Вот простейший вариант. У нас битмап. При старте ОС мы определяем общее кол-во памяти: X гигабайт. Для битмапы X гигабайт нужно Y байт битовой карты. Значит мы заявляем, что по физическому адресу A будет находиться Y байт карты памяти. И карту памяти сразу создаем так, что она сразу содержит "занятые" страницы на системные нужды, т.е. прямо при формировании битовой карты мы начиная со страницы floor(A/size_of_page) и до адреса floor(A/size_of_page) + ceil(Y/size_of_page) ставим единички, а остальное помечаем ноликами. Проблема решена.
У меня сейчас страницы по 2 мегабайта, а не по 4 кб, поэтому битмап вполне применим даже на больших объемах памяти. И я при старте определяю, сколько мне понадобится занять памяти для базовых системных структур (таблицы GDT, IDT, битмап физ памяти, место под некоторые системные переменные и т.д.) и после этого сразу в памяти формирую битмап, в котором отмечены занятыми все страницы, в которые попадают системные данные. Потом я сливаю эти данные с таблицей "дырок" в ОП, получаемой от биоса. При этом я предполагаю, что некоторый объем памяти от 0 до определенных границ (уже не помню точно, каких) присутствует всегда. Да, я знаю, что при наличии шины ISA могут быть дыры в этом диапазоне, но я решил меньше придерживаться требований совместимости с
настолько ископаемым оборудованием в изначально 64-битной ОС.