OSDev

для всех
Текущее время: 29 апр 2024, 18:12

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 12:25 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
pavia писал(а):
Не вижу зачем или для чего нужно менять статус?
А для чего в виндах используется VirtualProtect (XxProtectVirtualMemory)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 14:23 
Аватара пользователя

Зарегистрирован: 14 мар 2011, 12:31
Сообщения: 970
Откуда: Дагоба
phantom-84 писал(а):
Спору нет. Я говорил не о ВАП, а об окнах в ВАП.

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

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

_________________
Yet Other Developer of Architecture.
The mistery of Yoda’s speech uncovered is:
Just an old Forth programmer Yoda was.

<<< OS Boot Tools. >>>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 14:35 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
ВАП описывается деревом состоящим из корня(каталог таблиц страниц) ветвями дерева являются таблицы страниц. И листьями страницы. В общем случае такое дерево может быть многоуровневым.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 15:39 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
Я думаю не стоит мешать в одну кучу выделение/освобождение физических страниц и настройки виртуального адресного пространства. Это 2 независимых уровня.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 16:35 
Аватара пользователя

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

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

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


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

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

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 18:09 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
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/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 19:39 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Как-то все сыровато, т.е. не разделяю ни одной из представленных идей.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 20:12 

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 20:28 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
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.... Было бы много что интересно обсудить...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Аллокирование страниц
СообщениеДобавлено: 19 июн 2013, 20:49 

Зарегистрирован: 19 май 2011, 14:54
Сообщения: 73
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 программы? В какой секции? Возможно ли выделение дополнительной памяти процессу, после загрузки в память? Куда это делается?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB