Пишемо свою операційну систему

Пишемо свою операційну систему. Менеджер пам'яті

Прийшов час почати писати менеджер пам'яті - найважливіший компонент будь-якої операційної системи. Однак до його реалізації в коді чомусь не дійшла жодна з відомих мені розсилок.

Напишемо заголовки memory_manager.h, позначивши завдання на цей випуск:

Почнемо писати memory_manager.c з простої функції ініціалізації:

Ця функція зберігає поточне значення CR3 в змінну kernel_page_dir (потім нам стане в нагоді для виклику map_pages), а також інтерпретує карту пам'яті, отриману колись від BIOS. Для всіх блоків пам'яті, які вище 1-ого мегабайта, а також доступні для використання (тип 1) викликається функція free_phys_pages, яка повинна позначати вказаний регіон фізичної пам'яті як вільний. Паралельно з цим init_memory_manager обчислює повний обсяг оперативної пам'яті, який буде доступний в глобальній змінній memory_size.

Тепер напишемо пару маленьких функцій, одна з яких корисна для інших модулів, а друга взагалі буде однією з найбільш часто використовуваних:

Управління фізичними сторінками вимагає окремого обговорення і якщо менеджер фізичної пам'яті описати в цьому ж випуску, він вийде занадто великим, тому поки зробимо лише функції-заглушки, а повний код розглянемо наступного разу:

Тепер ми можемо змінити виділення пам'яті під таблицю переривань в функції init_interrupts файлу interrupts.c на більш зручне:

Залишилося додати код ініціалізації в kernel_main (менеджер пам'яті слід ініціалізувати найпершим, до всіх інших підсистем ядра):

Крім власне ініціалізації менеджера пам'яті цей код демонструє, щоб окремі функції. На екрані має з'явиться:

Для компіляції слід дописати Makefile:

От і все! На закінчення приведу повний код memory_manager.c:

Схожі статті