Kintsugi OS 0.2.0
x86 Monolithic OS
Loading...
Searching...
No Matches
KintsugiOS

Минималистичная операционная 32 разрядная система с монолитным ядром и собственным загрузчиком на (N)ASM и GCC 15


docs Top Language Language Count License Issues Stars Last Commit Contributors

KintsugiOS — это минималистичная x86 операционная система, написанная на (N)ASM и C, созданная в образовательных целях для глубокого понимания принципов работы операционных систем. Название проекта отсылает к японскому искусству Kintsugi, где разбитая керамика восстанавливается золотым лаком, подчеркивая красоту несовершенства и непрерывного развития.

Текущая нестабильная версия: v0.2.1a Последняя стабильная версия: v0.2.0a

‍[!CAUTION] KintsugiOS еще в активной стадии разработки и многие решения не финальные или нестабильные.

‍Также я занимаюсь переводом OSDEV-Notes

Особенности

Реализовано

  • Собственный загрузчик с переходом из реального режима в защищённый
  • GDT (Глобальная таблица дескрипторов) с полноценной сегментацией памяти
  • Продвинутое управление памятью с двумя уровнями аллокации:
    • Аллокатор на основе связанных блоков памяти с разделением и слиянием
    • Страничная организация памяти (Paging) с интеграцией в аллокацию
  • Драйверы оборудования:
    • VGA-экран с поддержкой цветного текста и прокрутки
    • Клавиатура (PS/2) с обработкой модификаторов (Shift, Ctrl, Alt, Caps Lock)
    • Таймер с программными прерываниями
    • ATA PIO с поддержкой LBA-адресации
  • Система прерываний (IDT, ISR, IRQ) с кастомными обработчиками
  • Командная оболочка "Keramika Shell" с поддержкой команд:
    • help — список команд
    • clear — очистка экрана
    • end — остановка CPU
    • malloc — выделение памяти
    • free — освобождение памяти
    • info — информация о системе
    • memdump — дамп памяти
    • И другие...
  • Библиотека KKLibC (Kintsugi Kernel LibC) включая:
    • Работу со строками, генерация числа и прочие стандартные вещи (stdlib.h)
    • Форматированный вывод (stdio.h)
    • Функции памяти (mem.h)
    • Библиотека для математики (math.h)
    • Типы данных (ctypes.h)
    • Общий заголовочный файл kklibc.h
    • Страничная обработка памяти (paging.h)
    • Библиотека стандартных методов (stdlib.h)

В разработке

  • [ ] Файловая система Fat12
  • [ ] Файловая система ext2
  • [ ] Планировщик задач
  • [ ] Пользовательское пространство
  • [ ] Inter-Process Communication
  • [ ] Загрузка ELF
  • [ ] Графический интерфейс
  • [ ] Многозадачность
  • [ ] Пользовательский режим
  • [ ] Сетевой стек
  • [ ] Псевдографический интерфейс
  • [ ] Полностью реализованный LibC

Готово

  • [x] Виртуальная память (Paging)
  • [x] Динамические аллокаторы памяти
  • [x] Чувствительность к регистру
  • [x] Драйвер ATA PIO
  • [x] Система прерываний с обработкой исключений
  • [x] Полноценная shell-оболочка

Требования

Для сборки и запуска KintsugiOS необходим следующий инструментарий:

Проверить готовность окружения можно скриптом:

./check-env.sh

Сборка и запуск

Базовая сборка

make

Создание образа диска (hdd) и запуск в QEMU

make run

Создание образа диска fda и запуск в QEMU

make run_fda

Очистка проекта

make clean # Удаление бинарных файлов
make clean_all # Полная очистка

Отладка

Для отладки KintsugiOS запустите систему в режиме отладки:

make debug # образ диска hdd
make debug_fda # образ диска fda

И подключитесь через ваш дебаггер (например gdb).

Как работает загрузка

Загрузчик KintsugiOS — это критически важный компонент, написанный на ассемблере, который выполняет следующие задачи:

  • Инициализация и переход в защищенный режим: Загрузчик начинает работу в реальном режиме (16-бит), инициализирует стек, загружает GDT (Глобальную таблицу дескрипторов) и переключает процессор в 32-битный защищенный режим.
  • Загрузка ядра: С помощью функций BIOS загрузчик считывает ядро с диска в память по адресу 0x1000.
  • Подготовка к выполнению ядра: После перехода в защищенный режим управление передается ядру.

Компоненты загрузчика:

  • bootsector.asm — основной загрузочный сектор, который загружается BIOS по адресу 0x7c00. Устанавливает стек, загружает ядро и переключается в защищенный режим.
  • diskload.asm — содержит функцию disk_load для чтения секторов с диска с помощью прерываний BIOS.
  • gdt.asm — определяет GDT (Глобальную таблицу дескрипторов) для защищенного режима, включая дескрипторы для сегментов кода и данных.
  • switch_to32.asm — код переключения в защищенный режим, включая отключение прерываний, загрузку GDT и установку бита в регистре cr0.
  • puts_chars.asm и puts_chars32.asm — функции для вывода строк в реальном и защищенном режимах соответственно. В защищенном режиме вывод осуществляется напрямую в видеопамять VGA.
  • puts_hex.asm — функция для вывода чисел в шестнадцатеричном формате (используется для отладки).
  • kernel_entry.asm — точка входа для ядра, которая вызывает функцию kmain из ядра.

Процесс загрузки:

  1. BIOS загружает первый сектор диска (512 байт) по адресу 0x7c00 и передает управление на его начало.
  2. Загрузчик инициализирует стек и выводит сообщение о запуске в реальном режиме.
  3. Загрузчик загружает ядро с диска в память по адресу 0x1000, используя функции BIOS.
  4. Загрузчик загружает GDT и переключает процессор в защищенный режим.
  5. В защищенном режиме загрузчик выводит сообщение об успешном переходе и передает управление ядру по адресу 0x1000.

Команды оболочки

KintsugiOS включает оболочку "Keramika Shell" со следующими командами:

  • end - остановка процессора
  • clear - очистка экрана
  • malloc <size> - выделение памяти (куча)
  • free <address> - освобождение памяти
  • info - информация о системе
  • memdump - дамп памяти
  • echp <text> - вывод текста
  • help - справка по командам
  • sleep <ms> - ожидать N секунд
  • reboot - перезагрузка
  • rand <seed> - генерация случайного числа по алгоритму xorshift32
  • randrange <seed> <min> <max> - генерация случайного числа в диапазоне при помощи xorshift32
  • binpow <base> <exponent> - бинарное возведение в степень
  • fib <num> - алгоритм фибоначчи

Kintsugi Kernel LibC

KKLibc — это собственная реализация стандартной библиотеки языка C, разработанная специально для нужд ядра Kintsugi OS. В отличие от пользовательских libc (вроде glibc), она тесно интегрирована с архитектурой ядра, лишена избыточности и содержит только самые необходимые функции для работы в пространстве ядра.

Структура и основные модули:

Библиотека организована в набор модулей, каждый из которых отвечает за свою предметную область:

  • **stdlib.h / stdlib.c**: Ядро библиотеки. Содержит:
    • Преобразования данных: itoa, utoa, atoi, hex_strtoint для конвертации между числами и строками в различных системах счисления.
    • Работа со строками: Полный набор функций для манипуляций со строками: strlen, strcpy/strncpy, strcmp/strncmp, strcat/strncat, strchr, strstr, strtok, strspn, strcspn.
    • Работа с памятью: Аналоги стандартных memcpy, memset, memmove, memcmp, memchr, а также низкоуровневые memory_set, u32memory_set.
    • Генерация псевдослучайных чисел: Реализация на основе быстрого алгоритма xorshift32 (rand) и функция для получения числа в диапазоне (rand_range).
    • Управление системой: Функции reboot() и wait(int ms) для взаимодействия с железом.
    • Форматированный вывод в буфер: Реализации sprintf, snprintf и vsnprintf для безопасного и небезопасного формирования строк.
    • Утилиты: Алгоритм нечеткого поиска fuzzy_search для будущего использования в интерфейсах.
  • **stdio.h / stdio.c**: Модуль форматированного вывода. Реализует функции printf, printf_colored и printf_at, которые напрямую взаимодействуют с драйвером экрана (screen.h), обеспечивая вывод текста в заданном месте и цвете.
  • **mem.h / mem.c**: Менеджер памяти (кучи) ядра. Реализует динамическое выделение памяти внутри ядра.
    • Аллокатор: Использует алгоритм с разделением и слиянием свободных блоков памяти для минимизации фрагментации.
    • Интеграция с Paging: Функция expand_heap динамически запрашивает новые физические страницы через менеджер виртуальной памяти (paging.h) при нехватке памяти в куче, что делает кучу по-настоящему расширяемой.
    • API: Предоставляет знакомые API: kmalloc, kfree, krealloc.
    • Отладка: Содержит функции для отладки и мониторинга состояния кучи: kmemdump, get_meminfo.
  • **paging.h / paging.c**: Менеджер виртуальной памяти. Один из самых низкоуровневых и критичных модулей.
    • Организует 4-гигабайтное виртуальное адресное пространство ядра.
    • Реализует механизм страничной адресации x86 с двумя уровнями таблиц (Page Directory и Page Table).
    • Предоставляет функции для выделения (alloc_frame) и освобождения (free_frame) физических кадров памяти.
    • Содержит обработчик исключения Page Fault.
    • Предоставляет интерфейс pkmalloc для выделения выровненных по странице блоков памяти с возможностью получения физического адреса, что необходимо для работы с DMA и другими hardware.
  • **math.h / math.c**: Набор математических функций и алгоритмов, включая вычисление чисел Фибоначчи, бинарное возведение в степень, факториал и дискриминант.
  • **ctypes.h / ctypes.c**: Полная реализация стандартных функций классификации и преобразования символов (isalpha, isdigit, toupper, etc.).
  • **kklibc.h**: Главный заголовочный файл, который включает все модули библиотеки для удобства.

Философия дизайна:

  • Префиксы k и p: Префикс k (например, kmalloc) означает принадлежность к ядру (kernel) и его куче. Префикс p (например, pkmalloc) означает работу с низкоуровневой страничной памятью (paging).
  • Самостоятельность: Библиотека минимально зависима от внешнего кода, что является обязательным требованием для кода ядра.
  • Производительность над избыточностью: Функции реализованы с оглядкой на скорость и минимальный расход памяти, а не на абсолютную совместимость со стандартом.

KKLibc является живым, развивающимся проектом и продолжает обрастать новыми функциями и оптимизациями по мере развития самой Kintsugi OS. Развитие KKLibc напрямую связано с развитием Kintsugi OS. Каждый новый системный вызов, драйвер или компонент ядра будет опираться на ее надежное и эффективное API.

Планы на будущее

Для KKLibc

  • Решение проблем с кучей: Текущая архитектура с двумя аллокаторами (kmalloc и pkmalloc) мощная, но требует доработки для полной стабильности. Основная задача — устранить все возможные scenarious повреждения кучи, особенно в моменты, когда kmalloc вызывает expand_heap, который, в свою очередь, через pkmalloc и alloc_frame запрашивает новые физические страницы. Необходимо тщательно протестировать это взаимодействие на предмет race condition и корректности обновления внутренних структур данных аллокатора.
  • Внедрение кананингов (Canaries): Для отладки повреждения кучи планируется добавить механизм "канареек" — специальных значений, размещаемых вокруг выделенных блоков памяти. При освобождении памяти или в отладочной сборке будет проверяться целостность этих канареек, что позволит сразу обнаружить операции записи за пределами выделенного блока (buffer overflow).
  • Отладочный аллокатор: Реализация специальной версии kmalloc, которая ведет логи всех операций выделения/освобождения памяти (с указанием размера, адреса и callstack'а). Это незаменимый инструмент для поиска утечек памяти (memory leaks) в ядре.
  • Планировщик и синхронизация: Когда будет реализован планировщик задач и многозадачность, критически важным станет сделать аллокатор потокобезопасным. Это потребует добавления механизмов синхронизации (спинлоков или мьютексов) внутрь функций kmalloc и kfree.
  • Поддержка пользовательского пространства: В будущем, когда появится разграничение на режим ядра и пользовательский режим, KKLibc будет разделена. Большая часть останется в ядре, а для пользовательского пространства будет создана отдельная, возможно, урезанная и более безопасная версия библиотеки.
  • Оптимизация производительности: Постоянный процесс: переписывание ключевых функций (например, memcpy, memset) на ассемблере для максимальной скорости, внедрение более эффективных алгоритмов поиска свободных блоков памяти.
  • Новые модули: По мере необходимости будут добавляться новые структуры данных (связные списки, хэш-таблицы), функции для работы со строками в кодировке UTF-8 и другие утилиты, требуемые развивающейся операционной системой.

Для ядра

  • Файловые системы: Реализация FAT12 и ext2
  • Многозадачность: Планировщик задач и механизмы IPC
  • Пользовательский режим: Разграничение привилегий
  • Сетевой стек: Базовая поддержка сетевых протоколов
  • Графический интерфейс: Псевдографическая оболочка

Литература и источники

Ассемблер

Язык C

Операционные системы

  • Таненбаум Э. «Современные операционные системы»
  • Таненбаум Э. «Операционные системы: Разработка и реализация»
  • OSDEV Wiki
  • FlingOS™ Documentation

Архитектура ЭВМ

  • Таненбаум Э. «Архитектура компьютера»
  • Гук М. «Аппаратные средства IBM PC. Энциклопедия»

Также вы можете подробно просмотреть в документе DOCLINKS весь материал со ссылками.

Лицензия

KintsugiOS распространяется под лицензией MIT. Подробнее см. в файле LICENSE.

Вклад в проект

Приветствуются issues и pull requests. Перед внесением изменений пожалуйста:

  1. Обсудите планируемые изменения в issue
  2. Следуйте существующему кодстайлу
  3. Добавляйте комментарии на русском языке
  4. Тестируйте изменения в QEMU и Bochs

Благодарности

Особая благодарность сообществу OSDev и авторам учебных материалов, указанных в разделе "Литература и источники".


Название "Kintsugi" отсылает к японскому искусству восстановления керамики золотым лаком — метафора красоты в несовершенстве и постоянного развития.