OSDev
http://osdev.su/

Менеджер памяти
http://osdev.su/viewtopic.php?f=5&t=963
Страница 1 из 2

Автор:  Rammstein [ 14 июл 2014, 19:13 ]
Заголовок сообщения:  Менеджер памяти

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

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

что посоветуете?

Автор:  phantom-84 [ 14 июл 2014, 19:45 ]
Заголовок сообщения:  Re: Менеджер памяти

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

Автор:  Rammstein [ 14 июл 2014, 19:57 ]
Заголовок сообщения:  Re: Менеджер памяти

а как по памяти это? не сильно много занимает? к примеру чтобы описать 4 гб памяти 4-х килобайтными страницами это надо 4 метра. не сильно ли это много? плюс еще добавить байт занята страница или нет.

Автор:  phantom-84 [ 14 июл 2014, 20:14 ]
Заголовок сообщения:  Re: Менеджер памяти

В стеке находятся только адреса свободных страниц. Когда стек опустошается, для распределения можно использовать память самого стека. Естественно, изначально объем памяти самого стека соответствует тому максимуму свободных страниц, который не должен быть превышен на протяжении всего времени работы системы, т.е. под стек не нужно выделять 4 мега, если во время работы системы не будет появляться свободных страниц общим объемом 4 гига. Даже участок в ВАП можно резервировать в точности под максимальный размер стека страниц.

Автор:  pavia [ 14 июл 2014, 22:33 ]
Заголовок сообщения:  Re: Менеджер памяти

4 МБ от 4ГБ это менее 1%. Но если в эмуляторе 32 МБ то много. Поэтому под размер под структуры рассчитывается из сходя из имеющейся памяти.

Что касается байта. То это можно до битов ужать и совместить с адресом.
Списком конечно компактнее пока фрагментация не появится. И код сложнее будет чем с массивом. По скорости не знаю пока не тестировал. Лично я пока остановился на втором варианте. Потом когда будет время может вернусь и сделаю 1 вариант.

PS. А у кого нибудь есть красивый код менеджера памяти или он у всех ужастный?

Автор:  Yoda [ 15 июл 2014, 10:37 ]
Заголовок сообщения:  Re: Менеджер памяти

Pavia,
Красивый код - не значит эффективный алгоритм.
Самый простой алгоритм менеджера, к тому же вообще не расходующий память под хранение каких-либо структур, - стек свободных страниц. Он же, пожалуй, самый красивый. В каком-то смысле даже самый эффективный, т.к. аллокирование/освобождение страницы делается за постоянное время - буквально за несколько инструкций. Но не универсальный, т.к. выделение подряд идущих физических страниц в такой схеме - сильная головная боль, и для такого функционала он не самый эффективный.

Rammstein,
Я рекомендую вам подходить к менеджеру памяти, как к отдельному, легко заменяемому модулю (вообще модульный подход - это то, на что должен молиться Software Architect). У него должны быть вызовы типа выделить страницу, освободить страницу, узнать кол-во занятой и свободной памяти и пр. Далее в рамках интерфейса можете реализовать простой менеджер. Когда вам потребуется дополнительный функционал или улучшение характеристик работы, поменяете/модифицируете алгоритм без ущерба работоспособности системы.
Да, ещё, до поры до времени вам не потребуются слитные интервалы физической памяти, так что пока что можете делать стек.

Автор:  Rammstein [ 15 июл 2014, 15:14 ]
Заголовок сообщения:  Re: Менеджер памяти

а можно что-нибудь прочитать про этот стек? уйдем опять в кройности: для того, чтобы адресовать 4 гига виртуальной памяти мне нужно 4 метра под таблицы страниц, дак еще и почти 4 метра под стек?

Автор:  phantom-84 [ 15 июл 2014, 15:52 ]
Заголовок сообщения:  Re: Менеджер памяти

Не нужно сюда приплетать адресуемую память. Для стека, рассчитанного на хранение адресов страниц общим объемом 4 гига, достаточно одной таблицы страниц процессора (транс-страницы). Свободные страницы не обязаны отображаться в ВАП. Нужно отображать только страницы самого стека и хранить их адреса в соответствующей транс-странице, не дублируя в стеке. Сама структура стека элементарна. Это массив переменной длины. Индекс элемента, находящегося после последнего валидного элемента, определяет количество свободных страниц в стеке без учета страниц, занятых самим стеком. Извлечение/размещение страниц в стеке также осуществляется элементарно: чтение/запись последнего элемента с декрементом/инкрементом индекса.

Автор:  Rammstein [ 15 июл 2014, 16:16 ]
Заголовок сообщения:  Re: Менеджер памяти

а сколько ACPI таблиц может выдавать SMAP? т.е. участков памяти с кодом 3

Автор:  pavia [ 15 июл 2014, 18:07 ]
Заголовок сообщения:  Re: Менеджер памяти

Цитата:
а сколько ACPI таблиц может выдавать SMAP? т.е. участков памяти с кодом 3

Насколько знаю не ограниченно. Я для хранения SMAP использую динамическую память и принципе можно сколько угодно записей разместить пока она не закончиться, а это порядка 600 кБ. Но я на всякий случай ограничил 1000 структурами SMAP.

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