OSDev
http://osdev.su/

Аллокирование страниц
http://osdev.su/viewtopic.php?f=5&t=754
Страница 3 из 5

Автор:  phantom-84 [ 19 июн 2013, 12:25 ]
Заголовок сообщения:  Re: Аллокирование страниц

pavia писал(а):
Не вижу зачем или для чего нужно менять статус?
А для чего в виндах используется VirtualProtect (XxProtectVirtualMemory)?

Автор:  Yoda [ 19 июн 2013, 14:23 ]
Заголовок сообщения:  Re: Аллокирование страниц

phantom-84 писал(а):
Спору нет. Я говорил не о ВАП, а об окнах в ВАП.

Аааа, да, по поводу окон совершенно согласен.

pavia, о каких вообще деревьях ты говоришь, я не могу понять? Что за деревья?

Автор:  pavia [ 19 июн 2013, 14:35 ]
Заголовок сообщения:  Re: Аллокирование страниц

ВАП описывается деревом состоящим из корня(каталог таблиц страниц) ветвями дерева являются таблицы страниц. И листьями страницы. В общем случае такое дерево может быть многоуровневым.

Автор:  achesnokov [ 19 июн 2013, 15:39 ]
Заголовок сообщения:  Re: Аллокирование страниц

Я думаю не стоит мешать в одну кучу выделение/освобождение физических страниц и настройки виртуального адресного пространства. Это 2 независимых уровня.

Функции для работы с выделением освобождением физической памяти должны быть доступны исключительно внутри ядра, а функции для настройки виртуального адресного пространства должны быть доступны и в режиме ядра и в пользовательском режиме.

Чтобы обсуждать функции, работающие с виртуальной памятью для начала надо ввести понятную всем участникам обсуждения структуру виртуального адресного пространства процесса. Тогда можно будет говорить о функциях. В зависимости от структуры виртуального адресного пространства процесса, функции, которые потребуются для управления виртуальной памятью будут разные. В простейшем случае имеются 2 функции: увеличение размеров виртуального пространства процесса (выделение процессу дополнительной виртуальной памяти) и уменьшение виртуального адресного пространства процесса (освобождение памяти). И кроме обычного выделения - запрос разделяемой памяти. Обычно в Unix-like операционках для этих нужд используется (реализуется) системный вызов mmap(). Выделение разделяемой памяти может быть обычным. Т.е. ядро выделяет любую доступную память и делает ее доступной процессу. Или ядро выделяет конкретный диапозон физической памяти и делает ее доступной процессу (возможно нескольким процессам). Такой механизм необходим для написания драйверов устройств.

Думаю, чтобы от такого обсуждения был толк, формата обычных текстовых сообщений в форуме не достаточно. Вопрос достаточно обширный. Нужны картинки, а также нужны четко введенные предварительно сущности, на основе которых делается то или иное действие. Нужна статья, как минимум, которую можно обсудить.

Автор:  pavia [ 19 июн 2013, 16:35 ]
Заголовок сообщения:  Re: Аллокирование страниц

achesnokov писал(а):
Я думаю не стоит мешать в одну кучу выделение/освобождение физических страниц и настройки виртуального адресного пространства. Это 2 независимых уровня.

Уровень деления скорее всего один и тот же. А вот объекты да разные и права доступа тоже разные.

achesnokov писал(а):
Чтобы обсуждать функции, работающие с виртуальной памятью для начала надо ввести понятную всем участникам обсуждения структуру виртуального адресного пространства процесса. Тогда можно будет говорить о функциях.
Мы уже пробовали ввести это понятие. Так и не договорились.


achesnokov писал(а):
В зависимости от структуры виртуального адресного пространства процесса, функции, которые потребуются для управления виртуальной памятью будут разные. В простейшем случае имеются 2 функции: увеличение размеров виртуального пространства процесса (выделение процессу дополнительной виртуальной памяти) и уменьшение виртуального адресного пространства процесса (освобождение памяти).

В моем понимание ВАП это все 4ГБ(имею в виду частную реализацию), оно имеет строго определённый размер. А вот увлечение/уменьшение доступной памяти процессу может идти по разному. Поэтому как таковые функции сейчас не рассматриваются, а просто используются функции отображения и отмены отображения.

achesnokov писал(а):
И кроме обычного выделения - запрос разделяемой памяти. Обычно в Unix-like операционках для этих нужд используется (реализуется) системный вызов mmap(). Выделение разделяемой памяти может быть обычным. Т.е. ядро выделяет любую доступную память и делает ее доступной процессу. Или ядро выделяет конкретный диапозон физической памяти и делает ее доступной процессу (возможно нескольким процессам). Такой механизм необходим для написания драйверов устройств.

Я не придерживаюсь не юникса не виндоуса. Буду создавать свой идеальный интерфейс. Драйверам как раз общая память не нужна. Она нужна только для ускорения работы некоторых функций.
Для драйверов введено выделение непрерывного физического диапазона.

achesnokov писал(а):
Думаю, чтобы от такого обсуждения был толк, формата обычных текстовых сообщений в форуме не достаточно. Вопрос достаточно обширный. Нужны картинки, а также нужны четко введенные предварительно сущности, на основе которых делается то или иное действие. Нужна статья, как минимум, которую можно обсудить.
Если есть предлагайте.
На данный момент провожу мозговой штурм. Который должен ответить на вопрос, а что же надо? Знал бы где упадёшь соломки бы подстелил. А на данный момент мне трудно угадать. А схемы диаграммы статьи и прочая документация у меня ведётся. Просто публиковать буду по мере готовности.

Понятно что окончательный состав менеджера памяти будет виден после того, как я нарисую все схемы связи. А на данный момент это просто невозможно.

Автор:  achesnokov [ 19 июн 2013, 18:09 ]
Заголовок сообщения:  Re: Аллокирование страниц

pavia писал(а):

achesnokov писал(а):
Думаю, чтобы от такого обсуждения был толк, формата обычных текстовых сообщений в форуме не достаточно. Вопрос достаточно обширный. Нужны картинки, а также нужны четко введенные предварительно сущности, на основе которых делается то или иное действие. Нужна статья, как минимум, которую можно обсудить.
Если есть предлагайте.
На данный момент провожу мозговой штурм. Который должен ответить на вопрос, а что же надо? Знал бы где упадёшь соломки бы подстелил. А на данный момент мне трудно угадать. А схемы диаграммы статьи и прочая документация у меня ведётся. Просто публиковать буду по мере готовности.


Готовое могут предложить, пожалуй, только авторы уже реализовавшие распределение памяти. У меня пока есть пост, близко подобравшийся к теме. http://dev64.wordpress.com/2013/03/21/virtual-address-space-in-kernel/. Пост дает представление о некоторых концепциях связанных с вопросом менеджмента физической и виртуальной памяти. Тема, однако, требует развития, и разбития на отдельные треды, если ее обсуждать серьезно.

Вот ещё один пост, о базовой настройке страничного механизма. Думаю в нем тоже есть ряд полезных, относящихся к обсуждению мыслей.
http://dev64.wordpress.com/2013/03/17/simple-paging-setup-in-os-kernel/

Автор:  phantom-84 [ 19 июн 2013, 19:39 ]
Заголовок сообщения:  Re: Аллокирование страниц

Как-то все сыровато, т.е. не разделяю ни одной из представленных идей.

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

Почему в прикладном пространстве секция кода так резко поменяла свое местоположение в сравнении с традиционными взглядами на этот вопрос, не понятно. А как вы планируете размещать код других прикладных модулей (библиотек) в ВАП?

Таблица страниц, включая каталог, также традиционно относится к пространству ядра, хотя в ней естественно есть и "локальные" страницы. Да и без того в пространстве ядра должны быть локальные участки. Кстати если локальные участки и таблицу страниц разместить в начале пространства ядра, то можно добиться полного разделения локальной и глобальной памяти на две области.

Автор:  phantom-84 [ 19 июн 2013, 20:12 ]
Заголовок сообщения:  Re: Аллокирование страниц

Я писал(а):
Почему в прикладном пространстве секция кода так резко поменяла свое местоположение в сравнении с традиционными взглядами на этот вопрос, не понятно. А как вы планируете размещать код других прикладных модулей (библиотек) в ВАП?
Для примера мой вариант разметки прикладного пространства:
1) stop frame (guard page(s));
2) секция кода;
3) секция данных;
4) секция bss - изначально не выравнивается на границу страницы;
5) секция rma (предназначена для резервирования участка ВАП) - изначально не выравнивается на границу страницы;
6) свободное пространство - здесь может быть размещен след. модуль;
7) здесь могут быть размещены стеки доп. потоков;
8) стековый stop frame (guard page(s));
9) стековый резерв;
10) стек.
В принципе начальный состав секций отдельно взятого модуля может меняться, но в данный момент я использую такой формат исполняемых файлов, при котором это невозможно.

Автор:  achesnokov [ 19 июн 2013, 20:28 ]
Заголовок сообщения:  Re: Аллокирование страниц

phantom-84 писал(а):
В рамках этой темы инициализация не так важна. Хотя если все-таки говорить об инициализации памяти, я не использую базовую память для каких-либо структур управления памятью кроме временного хранения описателей блоков памяти, полученных от BIOS.


Под базовой вы понимаете память статически выделенную в исходном коде? Статически - всмысле константный адрес. Правильно?

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


Я делал отображение в виде 4M страницы по двум причинам. Во-первых, мне хотелось съэкономить на коде. Во-вторых, проэкспериментировать с режимом PSE в 32-битном страничном режиме. Проверить как это работает. Поэтому именно так и сделано.

Ядро с логической точки зрения тоже своего рода процесс, со своими сегментами кода, констант, данных и стека. Соответственно размер отображенной в память части ядра может быть минимальным.

phantom-84 писал(а):
Почему в прикладном пространстве секция кода так резко поменяла свое местоположение в сравнении с традиционными взглядами на этот вопрос, не понятно. А как вы планируете размещать код других прикладных модулей (библиотек) в ВАП?


Спасибо за комментарий. Насчет традиционных взглядов на вопрос, я давно не обновлял свои знания, и если есть на эту тему ссылка, буду благодарен. Насчет размещения кода shared libraries, честно скажу над вопросом не думал. Вопрос действительно интересный. Т.е. они явно где-то должны располагаться... Причем должна быть защита от записи кодовых страниц, а также страниц константных данных.

phantom-84 писал(а):
Таблица страниц, включая каталог, также традиционно относится к пространству ядра, хотя в ней естественно есть и "локальные" страницы.


В моем случае ядро вместе со всеми управляющими структурами находится в 1М мегабайте и оно вместе со всеми управляющими структурами отображено в старшие 4M памяти.

phantom-84 писал(а):
Да и без того в пространстве ядра должны быть локальные участки. Кстати если локальные участки и таблицу страниц разместить в начале пространства ядра, то можно добиться полного разделения локальной и глобальной памяти на две области.


Что такое "локальные участки", какое их назначение? Собственно память в примере и разделена как раз на 2 части: прикладную и последние 4М виртуального адресного пространства - область ядра.

Конечно это всё сыро. Чтобы доводить до ума, нужно с кем-то обсуждать. У меня 99% времени уходит на Java в данный момент... Я собственно не разрабатываю операционную систему. Я лишь провожу эксперимменты с концепциями. На большее вряд ли когда либо будет мотивация.

Нужно выбирать какие-то управляющие структуры для выделения физической памяти для начала. А поверх них прикручивать работу с виртуальным адресным пространстом. Но, тут нужны концепции структур, относящихся к процессам....

Что касается выделения физической памяти. Самый простой концепт - битовая маска, скорее всего, будет медленно работать. Да и память занимать будет. Список свободных блоков, возможно вариант лучше. У James Molloy был описан подобный вариант... Есть куча классических механизмов, последний из которых, кажется Slub Allocation.... Было бы много что интересно обсудить...

Автор:  achesnokov [ 19 июн 2013, 20:49 ]
Заголовок сообщения:  Re: Аллокирование страниц

phantom-84 писал(а):
Я писал(а):
Почему в прикладном пространстве секция кода так резко поменяла свое местоположение в сравнении с традиционными взглядами на этот вопрос, не понятно. А как вы планируете размещать код других прикладных модулей (библиотек) в ВАП?
Для примера мой вариант разметки прикладного пространства:
1) stop frame (guard page(s));
2) секция кода;
3) секция данных;
4) секция bss - изначально не выравнивается на границу страницы;
5) секция rma (предназначена для резервирования участка ВАП) - изначально не выравнивается на границу страницы;
6) свободное пространство - здесь может быть размещен след. модуль;
7) здесь могут быть размещены стеки доп. потоков;
8) стековый stop frame (guard page(s));
9) стековый резерв;
10) стек.
В принципе начальный состав секций отдельно взятого модуля может меняться, но в данный момент я использую такой формат исполняемых файлов, при котором это невозможно.


- Стековый резерв - судя по всему пространство зарезервированное под увеличение стека, если его не хватит. Правильно?
- Где размещается heap программы? В какой секции? Возможно ли выделение дополнительной памяти процессу, после загрузки в память? Куда это делается?

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