OSDev
http://osdev.su/

Память
http://osdev.su/viewtopic.php?f=26&t=623
Страница 1 из 10

Автор:  Станислав [ 25 авг 2012, 19:19 ]
Заголовок сообщения:  Память

Посоветуйте с переходом на страничную организацию памяти, как сделать и где можно прочитать.
Для страничной организации нужно создавать Page Directory Entry и Page Table Entry и загружать в CR3, кстати как вариант сделать начальные значения адресов одинаковыми с виртуальными.
Я недопонимаю, как создавать таблицы для каждого процесса и при переключении процессов загружать таблицу процесса в CR3

Автор:  Nable [ 26 авг 2012, 16:41 ]
Заголовок сообщения:  Re: Память

Как говорил один персонаж борды, "а вы пробовали доку почитать?"
Начиная с http://wiki.osdev.org/Memory_management и далее там по ссылкам.

Автор:  Станислав [ 26 авг 2012, 18:21 ]
Заголовок сообщения:  Re: Память

Как я понял фишки две, одна позволяет разбросанным кускам памяти казаться непрерывными, а вторая это организация адресного пространства для программ и там у нас может быть выделенные страницы для программы и страницы с системными данными для программы, причём в режиме только для чтения.
Как только эта таблица создаётся для программ?

Автор:  phantom-84 [ 26 авг 2012, 22:59 ]
Заголовок сообщения:  Re: Память

Какая-то странная у тебя последовательность разработки...

Т.к. по существу вопроса говорить можно очень много, просто отвечу на поставленные вопросы.

Цитата:
Посоветуйте с переходом на страничную организацию памяти, как сделать и где можно прочитать.
Основные доказавшие свою эффективность и простоту фишки - это размещение ядра в верхней части ВАП, отображение ядра во все ВАП по одним и тем же адресам, рекурсивное отображение каталога, защита страниц ядра на уровне таблиц самого высокого уровня (например, для PM32 на уровне PDE, а не PTE).

Цитата:
Для страничной организации нужно создавать Page Directory Entry и Page Table Entry и загружать в CR3, кстати как вариант сделать начальные значения адресов одинаковыми с виртуальными.
Нужно создавать таблицы страниц. В CR3 нужно загружать физический адрес каталога страниц (PM32). Тождественное отображение необходимо только для инициализационного кода. Я при старте выполняю тождественное отображение только первого мега (или даже первых 640 Кб), причем это из-за того, что я выполняю физический перенос основных секций ядра из базовой памяти, а если бы использовалось переотображение страниц, то участок тождественно отображенной памяти мог бы быть вообще "микроскопическим".

Цитата:
Я недопонимаю, как создавать таблицы для каждого процесса и при переключении процессов загружать таблицу процесса в CR3
Отображаешь вновь выделенную страницу (желательно сразу обнуленную) во временный фрейм, копируешь в нее все глобальные входы ядра из текущего каталога и записываешь ссылку на себя (физический адрес этой страницы и флаги). Переключение - mov cr3,eax (eax должен содержать физический адрес каталога того процесса, на который переключаешься; если переключаешься на другой поток текущего процесса, то cr3 можно не перезагружать).

Цитата:
Как я понял фишки две, одна позволяет разбросанным кускам памяти казаться непрерывными, а вторая это организация адресного пространства для программ и там у нас может быть выделенные страницы для программы и страницы с системными данными для программы, причём в режиме только для чтения.
Да, конструировать непрерывные участки памяти вне зависимости от фрагментации физической памяти, управлять доступом к образовавшимся "дырам" ("ругаться", отображать или отображать и подкачивать память по требованию).

Цитата:
Как только эта таблица создаётся для программ?
См. выше. При использовании рекурсивно отображенного каталога ты будешь иметь в каждом ВАП таблицу страниц размером 4 Мб (конечно реально отображена в ВАП может быть лишь малая часть таблицы), а в этой таблице текущий каталог размером 4 Кб (PM32). К примеру чтобы отобразить 1 страницу по адресу 400000h в user space (младшая часть ВАП), ты должен проверить (или опять-таки использовать отображение по требованию), имеется ли для данного участка ВАП соответствующая транс-страница (мой термин, в терминологии Интел "таблица страниц" - я ее называю иначе, чтобы не путать с моей 4-мегабайтной таблицей страниц; отдельная транс-страница отвечает за отображение участка размером 4 Мб, т.е. 1024 конечных страниц размером 4 Кб), т.е. соответствующий вход в каталоге должен иметь установленный бит присутствия. Если транс-страница присутствует, ты должен сразу записать в ее первый вход (а фактически в 1025-ый вход таблицы страниц) физический адрес новой страницы и флаги. Если транс-страницы нет, то сначала проинициализировать ее, а потом конечную страницу (для этого тебе понадобятся две новые страницы). Походу нужно делать валидацию страниц, если отображение инициировано страничным сбоем.

Ну и естественно первоначально нужно четко знать матчасть.

Автор:  SII [ 27 авг 2012, 08:59 ]
Заголовок сообщения:  Re: Память

phantom-84 писал(а):
Ну и естественно первоначально нужно четко знать матчасть.


А ещё -- для чего это вообще нужно и как памятью настоящие оси управляют. Это не курсоры на экране в Дельфях рисовать, это нечто совершенно иное.

Автор:  phantom-84 [ 27 авг 2012, 12:13 ]
Заголовок сообщения:  Re: Память

Я об этом же. Если мы начнем углубляться в управление памятью, а ТС не подтянет матчасть, то толку от этого будет мало.

Автор:  Станислав [ 27 авг 2012, 14:08 ]
Заголовок сообщения:  Re: Память

Я реализовываю страничную память для своей ОС, а у меня объекты нафаршированы адресами объектов, функций и ресурсов. У меня есть бинарное ядро которое работает по своему адресу загрузки, и если его проецировать на верхние адреса, то при компиляции надо тупо ставить ORG верхние адреса, и тогда все адреса в моём ядре настроятся сами.
А что по поводу того, что мы на каждый загружаемый процесс будем создавать свою таблицу страниц, получается, что у всех процессов может быть один и тот же начальный адрес.

Автор:  Yoda [ 27 авг 2012, 15:23 ]
Заголовок сообщения:  Re: Память

Станислав писал(а):
получается, что у всех процессов может быть один и тот же начальный адрес.

Легко. Мало того, его адресное пространство может быть организовано так, как ему необходимо. Например, без дырок в памяти в первом, шестнадцатом и прочих мегабайтах.

Автор:  phantom-84 [ 27 авг 2012, 15:38 ]
Заголовок сообщения:  Re: Память

Станислав писал(а):
Я реализовываю страничную память для своей ОС, а у меня объекты нафаршированы адресами объектов, функций и ресурсов. У меня есть бинарное ядро которое работает по своему адресу загрузки, и если его проецировать на верхние адреса, то при компиляции надо тупо ставить ORG верхние адреса, и тогда все адреса в моём ядре настроятся сами.
Если кратко, то да. Вообще существуют перемещаемые ядра, в которых настройка адресов может выполняться динамически загрузчиком или в собственном позиционно независимом инициализационном коде. Лично я использую статическую привязку, но в файле ядра содержатся инициализационные секции, привязанные к нижним адресам, и основные секции, привязанные к верхним адресам.

Цитата:
А что по поводу того, что мы на каждый загружаемый процесс будем создавать свою таблицу страниц, получается, что у всех процессов может быть один и тот же начальный адрес.
Если кратко, то да. Вообще основной исполняемый модуль приложения может быть перемещаемым, но в этом нет особой нужды. Лично я для подобных модулей использую формат файла, который в принципе не поддерживает релокацию (однако имеет поле для хранения базового адреса, правда, ядро все равно не "проглотит" любой адрес, а часто ему нужен вполне определенный адрес; я уже очень давно компилирую приложения только по адресу 400000h). Некоторые используют формат с поддержкой релокации, но только ради унификации формата основных модулей и библиотек.

Автор:  Станислав [ 27 авг 2012, 15:46 ]
Заголовок сообщения:  Re: Память

Получается, что для процесса важен не сам адрес процесса, а адрес каталога страниц, после загрузки которого в CR3 адрес будут с 0. А функция добавления памяти будет добавлять страницы из любого места оперативки и ставить подряд в каталоге страниц.
Как я понял, главный каталог страниц = 4мб, а для процессов можно делать и меньше.

Страница 1 из 10 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/