Пишемо свою операційну систему. Менеджер пам'яті
Прийшов час почати писати менеджер пам'яті - найважливіший компонент будь-якої операційної системи. Однак до його реалізації в коді чомусь не дійшла жодна з відомих мені розсилок.
Напишемо заголовки 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: