Это первая операционная система, которую я создал. Это написано на двух языках: C Язык и Ассамблее.
Этот проект был активирован с 15 декабря 2017 года

Рабочий план
Загрузчик
Обычай
Загрузочный сектор
Этап 2
Лиц
Ядро
Управление памятью
Распределение кадров страницы
Динамическое распределение памяти
Строительная система
Напишите текст в VGA
Прерывание процессора (IDT, ISRS, IRQ и т. Д.)
Читать символ с PS/2 клавиатуры
Читать строку с клавиатуры PS/2
Виртуальная память (пейджинг, рамки и т. Д.)
Распределение кадров и распределение распределения
Динамическое распределение памяти (Liballoc)
Таймер процессора
Получите информацию о процессоре
Часы в реальном времени: Итак, мы можем знать, когда начинается фильм
Трассия стека ядра
Многозадачность
Пользовательские процессы
Жесткий диск
Драйвер дисковода
Файловая система
Графический пользовательский интерфейс
В этой ОС используется 2-х погрузочный загрузчик. В случае, если второй этап - это когда мы ввели защищенный режим и вызовут ядро.
Первые 512 байт моего гибкого изображения содержит загрузочный сектор, который делает много вещей, которые не может сделать защищенный режим . (например, загрузка материала с диска). Затем он прыгает ко второму этапу, загруженному на 0x7E00 (сразу после загрузочного сектора).
Этот этап загружает GDT и входит в защищенный режим , затем копирует ядро, загружаемое загрузочным сектором, со скоростью от 0x1000 до 0x100000 (1 МБ). Последний прыжок!
Размер ядра всегда растет, но я не всегда могу увеличить загрузку секторов. Как решение. Я решаю использовать Grub. Ядро хранится в виде изображения ELF ( kernel.img ) на компакт -диске, который использует ISO 9660 в качестве файловой системы. Grub также поддерживает Multiboot, поэтому моя операционная система может работать вместе с другими (Windows, Linux и т. Д.).
Мы ввели защищенный режим, что означает, что у нас нет доступа к функциям BIOS. Таким образом, это ядро должно повторно внедрить эти функции для управления аппаратным обеспечением.
Теперь я повторно внедрил стандартные устройства: экран и клавиатура. В дальнейшем развитии. Я собираюсь реализовать драйвер диска.
Эта операционная система использует как сегментацию, так и пейджинг для обеспечения защиты памяти. В моей глобальной таблице дескрипторов я поместил 5 дескрипторов сегмента:
Нулевой сегмент
Сегмент кода для ядра : сегмент, в котором принадлежит код моего ядра
Сегмент данных для ядра : сегмент, где мои глобальные переменные, принадлежащие моим ядрам
Сегмент кода для пользователя : в настоящее время не используется
Сегмент данных для пользователя : так же, как 4
Я также включаю пейджинг. Теперь я намеренно нанести на карту четвертую страницу в таблице первой страницы, чтобы not-present и read-only , так что вы можете сгенерировать ошибку страницы , выполнив въезд bsod в командной строке моей ОС.

Это ядро предоставляет распределитель рамки страниц , поэтому управление памятью будет более удобным, и мне будет легче подходить к многозадачности.
Как предполагает учебник Джеймса, я буду использовать битсет, чтобы определить, является ли рама свободной или нет.
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
В настоящее время я внедрил Malloc размещения без свободного , потому что все переменные, используемые ядром
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
Поскольку я ленивый, я перенес сторонний распределитель памяти под названием liballoc , который требовало лишь несколько функций в моей ОС.
Этот проект использует GNU, чтобы построить. Таким образом, способ построения - это make , если какие -либо проблемы возникают во время сборки, тип make dep перед make . Откройте проблему, если все еще застрял.
Если вы не используете Linux или WSL (подсистема Windows для Linux), вам нужно будет загрузить Cross Compiler отсюда. Затем измените CC и LD в config.mk .