Простое игрушечное управление памятью ОС - PullRequest
2 голосов
/ 17 марта 2011

Я занимаюсь разработкой простой маленькой игрушечной ОС на С и сборке в качестве эксперимента, но начинаю беспокоиться из-за недостатка знаний о системной памяти.

Мне удалось скомпилироватьядро, запустите его в Bochs (загружается GRUB) и напечатайте "Hello, world!"Сейчас я пытаюсь сделать простой диспетчер памяти, чтобы начать эксперименты с другими вещами.

Я нашел некоторые ресурсы по управлению памятью, но у них не было достаточно кода, чтобы уйти (какя понял эту концепцию, но не знал, как ее реализовать).

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

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

I 'Мы также читали о некоторой форме косвенных указателей, где приложение содержит указатель, который перенаправляется диспетчером памяти в его реальное местоположение.Я уверен, что это довольно далеко, но мне кажется важным, если я когда-нибудь захочу попробовать виртуальную память или дефрагментацию.

А также, куда я должен поместить смещение моей памяти?Я понятия не имел, какое место было лучше, поэтому я просто случайно выбрал 0x1000, и я уверен, что он вернется ко мне позже, когда я перезапишу свое ядро ​​или что-то в этом роде.

Я бы тожехотелось бы знать, чего ожидать от производительности (например, значение big-O для выделения и освобождения) и каково будет разумное соотношение структур управления памятью к фактической управляемой памяти.

Конечно, не стесняйтесьответить только на подмножество этих вопросов.Любая обратная связь с благодарностью!

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

Если вы еще не знаете об этом, http://wiki.osdev.org/ является хорошим ресурсом в целом и содержит несколько статей по управлению памятью. Если вы ищете конкретный алгоритм выделения памяти, я бы посоветовал прочитать о методе «система собеседников» (http://en.wikipedia.org/wiki/Buddy_memory_allocation).. Я думаю, вы можете найти пример реализации в Интернете. Если вы можете найти копию в библиотека, также, вероятно, стоит прочитать раздел «Искусство компьютерного программирования», посвященный управлению памятью (том 1, раздел 2.5).

Я не знаю, куда вы должны поместить смещение памяти (если честно, я никогда не писал ядро), но мне пришло в голову одно, что может сработать, это поместить статическую переменную в конец ядра. и начать распределение после этого адреса. Что-то вроде:

(In the memory manager)
extern char endOfKernel;
... (also in the memory manager)
myOffset = &endOfKernel;
... (at the end of the file that gets placed last in the binary)
char endOfKernel;

Полагаю, само собой разумеется, но в зависимости от того, насколько серьезно вы относитесь к операционной системе, вам, вероятно, понадобятся книги по дизайну операционной системы, и если вы учитесь в школе, вам не помешает взять ОС. класс.

2 голосов
/ 29 марта 2011

Если вы используете GCC с LD, вы можете создать скрипт компоновщика, который определяет символ в конце раздела .BSS (который даст вам полный размер памяти ядра).Фактически многие ядра используют это значение в качестве параметра для заголовка GRUB AOUT_KLUDGE.

См. http://wiki.osdev.org/Bare_bones#linker.ld для получения более подробной информации, обратите внимание на объявление символа ebss в сценарии компоновщика.

...