phantom-84 писал(а):
Лично я для подобных модулей использую формат файла, который в принципе не поддерживает релокацию (однако имеет поле для хранения базового адреса, правда, ядро все равно не "проглотит" любой адрес, а часто ему нужен вполне определенный адрес; я уже очень давно компилирую приложения только по адресу 400000h). Некоторые используют формат с поддержкой релокации, но только ради унификации формата основных модулей и библиотек.
Вообще говоря, отсутствие поддержки релокации не есть хорошо. DLL-библиотеки нельзя скомпилировать на фиксированные адреса, т.к. никогда не знаешь, когда и в каком составе они потребуются в адресном пространстве текущего процесса.
Станислав писал(а):
Получается, что для процесса важен не сам адрес процесса, а адрес каталога страниц, после загрузки которого в CR3 адрес будут с 0.
Не, не так. Адрес не будет ни с нуля, ни с какого другого значения. Виртуальная память - это отображение одних адресов (любых) на другие (тоже любые). То, что отображаем, называется логическим или виртуальным адресом, т.е. программа обращается по этому адресу и не знает, где
на самом деле находится то, что она читает/пишет. Да ей это и не важно. Куда отображаем - называется физическим адресом. Это та страница памяти, где реально будут данные этой программы. Отображение происходит блоками по 4кБ или по 4МБ. 4МБ используются редко, обычно предпочитают 4к. Эти блоки называют страницами памяти. Отобразить можно любую страницу из адресного пространства 4Гб на любую физическую страницу.
Станислав писал(а):
Как я понял, главный каталог страниц = 4мб, а для процессов можно делать и меньше.
Не, это тоже не так. Размер всего каталога зависит от того, сколько памяти ты отобразил. В простейшем случае, есть два уровня (для страниц размером 4к). Первый уровень - таблица Page Directory, размером 4к. На неё указывает содержимое регистра CR3. Каждый элемент этой таблицы указывает на таблицу другого уровня - Page Table. А уже элементы этой таблицы указывают нужное расположение физической страницы памяти.
В минимальном варианте (со страницами размером 4к) возможно использование только двух таблиц - одна PD и одна PT, получается 8к, что позволит использовать 4МБ памяти. Совокупный размер таблиц в 4М это только в случае, если у тебя ВСЁ адресное пространство отображено на какие-то страницы, но реально этого почти никогда не требуется.
Если владеешь английским, почитай эту статью:
http://wiki.osdev.org/Paging