Skip to content

alexeev-prog/KintsugiOS

Repository files navigation

KintsugiOS

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


docs Top Language Language Count License Issues Stars Last Commit Contributors

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

Последняя стабильная версия: v0.4.0a

Caution

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

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

Особенности

Реализовано

  • Собственный загрузчик с переходом из реального режима в защищённый

    • Двухэтапная загрузка: BIOS → загрузочный сектор → защищённый режим → ядро
    • Чтение ядра с диска через BIOS INT 0x13 (CHS/LBA)
    • Инициализация GDT, IDT и перепрограммирование PIC
    • Переход из реального режима (16-bit) в защищённый (32-bit)
    • Настройка сегментных регистров и стека
  • GDT (Глобальная таблица дескрипторов) с полноценной сегментацией памяти

    • Три дескриптора: нулевой, сегмент кода, сегмент данных
    • Настройка прав доступа: Present, DPL, Type биты
    • Гранулярность 4KB для доступа ко всей 4GB памяти
    • База 0x00000000, лимит 0xFFFFFFFF
  • Продвинутое управление памятью с двумя уровнями аллокации:

    • Аллокатор на основе связанных блоков памяти с разделением и слиянием
      • Структура блока: size, next pointer, is_free flag
      • Алгоритм best-fit для минимизации фрагментации
      • Автоматическое объединение соседних свободных блоков
      • Выравнивание на границу 16 байт
      • Динамическое расширение кучи от 1MB до 16MB
    • Функции диагностики:
      • kmemdump() — детальный дамп состояния кучи
      • get_meminfo() — статистика использования памяти
      • kmemcheck() — проверка целостности блоков
  • Драйверы оборудования:

    • VGA-экран с поддержкой цветного текста и прокрутки
      • Прямой доступ к видеопамяти 0xB8000
      • 16 цветов текста и фона
      • Автоматическая прокрутка при заполнении экрана
      • Позиционирование курсора через порты 0x3D4/0x3D5
      • Функции: kprint(), kprint_at(), kprint_colored()
    • Терминальный слой (terminal.h/terminal.c) — логическая абстракция над экраном
      • Виртуальный буфер 80x200 символов с атрибутами
      • Поддержка автоскролла и ручной прокрутки
      • Отложенный рендеринг (dirty flag)
      • Функции для работы с вводом: backspace, enter, стрелки
      • Управление цветом и позицией курсора
    • Клавиатура (PS/2) с обработкой модификаторов (Shift, Ctrl, Alt, Caps Lock)
      • Обработка скан-кодов через порт 0x60
      • Таблицы символов для верхнего/нижнего регистра
      • Поддержка backspace, enter, специальных комбинаций (Ctrl+C)
      • Состояния модификаторов: shift_pressed, ctrl_pressed, alt_pressed, caps_lock
      • Интеграция с терминальным слоем для обработки стрелок и модификаторов
    • Таймер с программными прерываниями
      • Настройка PIT на частоту 50 Гц
      • Глобальный счётчик тиков
      • Функция wait() для задержек в миллисекундах
    • ATA PIO с поддержкой LBA-адресации
      • Поддержка LBA28 (до 128GB дисков)
      • Идентификация устройств через команду IDENTIFY
      • Чтение/запись секторов (512 байт)
      • Ожидание готовности устройства с таймаутами
      • Поддержка master/slave устройств
  • Система прерываний (IDT, ISR, IRQ) с кастомными обработчиками

    • 48 записей в IDT (32 исключения + 16 аппаратных прерываний)
    • Ассемблерные заглушки для сохранения контекста
    • Ремаппинг PIC на вектора 32-47
    • Обработка исключений: деление на ноль, GPF, page fault и др.
    • API для регистрации обработчиков: register_interrupt_handler()
    • Автоматическая отправка EOI в контроллеры прерываний
  • Командная оболочка "Keramika Shell" с поддержкой команд:

    • help — список команд с описанием
    • clear — очистка экрана
    • end — остановка CPU (HLT инструкция)
    • malloc — выделение памяти с указанием размера
    • free — освобождение памяти по адресу
    • info — информация о системе: память, CPU, версия
    • memdump — дамп состояния кучи
    • echo — вывод текста с поддержкой аргументов
    • sleep — задержка в миллисекундах
    • reboot — перезагрузка системы
    • rand — генерация случайного числа по алгоритму xorshift32
    • randrange — случайное число в диапазоне
    • binpow — бинарное возведение в степень
    • ls — список файлов в корневой директории FAT12
    • cat — вывод содержимого файла
    • load — загрузка файла в память по адресу
    • fat12info — информация о файловой системе FAT12
    • qemushutdown — выключение QEMU через порт 0x604
    • del - удалить файл
    • create - создать файл
    • write - запись в файл
  • Файловая система FAT12 (Files Only) в kernel/fs/fat12.c

    • Чтение и парсинг загрузочного сектора FAT12
    • Извлечение параметров: bytes_per_sector, sectors_per_cluster, root_entries
    • Вычисление смещений: fat_start_sector, root_dir_start_sector, data_start_sector
    • Обход 12-битных записей FAT с учётом чётности/нечётности кластеров
    • Форматирование имён файлов из формата 8.3 (удаление пробелов)
    • Поиск файлов в корневом каталоге по имени
    • Чтение файлов через обход цепочек кластеров
    • Буферизация таблицы FAT для уменьшения обращений к диску
    • Поддержка специальных значений FAT: 0xFF7 (bad cluster), 0xFF8-0xFFF (end of chain)
    • Функции: fat12_init(), fat12_find_file(), fat12_read_file(), fat12_list_root(), fat12_write_file(), fat12_delete_file(), fat12_create_file()
    • Создание файлов
    • Удаление файлов
    • Запись (перезапись) текста в файлы
  • Библиотека KKLibC (Kintsugi Kernel LibC) включая:

    • Работу со строками, генерация числа и прочие стандартные вещи (stdlib.h)
      • strlen(), strcpy(), strcmp(), strtok(), strstr(), strchr()
      • itoa(), utoa(), atoi(), hex_strtoint()
      • strspn(), strcspn(), strpbrk()
    • Форматированный вывод (stdio.h)
      • printf(), printf_colored(), printf_at()
      • Поддержка форматирования: %d, %x, %s, %c, %u
      • Флаги: выравнивание, дополнение нулями, префиксы
      • sprintf(), snprintf(), vsnprintf()
    • Функции памяти (mem.h)
      • kmalloc(), kfree(), krealloc()
      • memcpy(), memset(), memmove(), memcmp(), memchr()
      • memory_set(), u32memory_set()
    • Библиотека для математики (math.h)
      • binary_pow() — бинарное возведение в степень
    • Типы данных (ctypes.h)
      • Стандартные типы: u8, u16, u32, s8, s16, s32
      • Функции классификации символов: isalpha(), isdigit(), etc.
      • Макросы: KB, MB, GB, ASSERT()
    • Общий заголовочный файл kklibc.h
      • Включение всех модулей библиотеки
      • Определение версии системы: VERSION
    • Библиотека стандартных методов (stdlib.h)
      • Генерация случайных чисел: rand(), rand_range() на основе xorshift32
      • Системные функции: reboot(), wait()
      • Функции поиска: fuzzy_search()

В разработке

  • CHS Issue - решить проблему с секторами загрузочного диска (СРОЧНО)
  • Файловая система Fat12 (Write+Read +Directories)
    • Запись новых данных без перезаписи в файл
    • Создание директорий
    • Удаление директорий
    • Перемеинование файлов, директорий
    • Перемещение и копирование файлов, директорий
  • Файловая система ext2
    • Исследование структуры ext2
    • Чтение суперблока и групповых дескрипторов
    • Работа с inode и блоками данных
    • Поддержка каталогов и длинных имён
  • Планировщик задач
    • Структуры данных для описания процессов
    • Механизм переключения контекста
    • Алгоритмы планирования (round-robin, приоритеты)
    • Очереди готовых и заблокированных процессов
  • Пользовательское пространство
    • Разделение привилегий (ring 0 vs ring 3)
    • Системные вызовы через прерывания
    • Защита памяти через сегментацию/страничность
    • Базовые библиотеки для пользовательских программ
  • Inter-Process Communication
    • Очереди сообщений
    • Разделяемая память
    • Семафоры и мьютексы
    • Каналы (pipes)
  • Загрузка ELF
    • Парсинг заголовков ELF
    • Загрузка сегментов в память
    • Настройка таблиц страниц
    • Передача управления точке входа
  • Графический интерфейс
    • Переход в графический режим VESA
    • Примитивы рисования: линии, прямоугольники, текст
    • Оконная система
    • Обработка событий мыши
  • Многозадачность
    • Создание и уничтожение процессов
    • Управление ресурсами процессов
    • Синхронизация и взаимное исключение
    • Сигналы и обработчики
  • Пользовательский режим
    • Механизм переключения между кольцами защиты
    • Проверка прав доступа
    • Обработка нарушений привилегий
    • API системных вызовов
  • Сетевой стек
    • Драйвер сетевой карты (например, RTL8139)
    • Протоколы: Ethernet, IP, ARP
    • Транспортные протоколы: TCP, UDP
    • Сокеты и API для сетевых операций
  • Псевдографический интерфейс
    • Текстовый режим с расширенными символами
    • Оконный менеджер в текстовом режиме
    • Диалоговые окна и элементы управления
    • Обработка фокуса ввода
  • Полностью реализованный LibC
    • Расширение KKLibC полным набором функций
    • Поддержка плавающей точки
    • Функции работы со временем и датой
    • Локализация и кодировки

Готово

  • Файловая система Fat12 (File Only)
    • Чтение загрузочного сектора и параметров
    • Обход корневого каталога
    • Чтение цепочек кластеров
    • Форматирование имён файлов 8.3
    • Удаление файлов
    • Запись в файлы
    • Создание файлов
  • Динамические аллокаторы памяти
    • Аллокатор кучи с best-fit алгоритмом
    • Разделение и слияние блоков
    • Диагностика и отладка памяти
  • Терминальный слой абстракции
    • Виртуальный буфер 80x200 символов
    • Отложенный рендеринг
    • Управление прокруткой и вводом
    • Интеграция с драйверами клавиатуры и экрана
  • Драйвер ATA PIO
    • LBA-адресация 28-бит
    • Идентификация устройств
    • Чтение/запись секторов
  • Система прерываний с обработкой исключений
    • Полная IDT с 48 записями
    • Обработчики всех стандартных исключений
    • API для регистрации обработчиков
  • Полноценная shell-оболочка
    • 16 встроенных команд
    • Разбор аргументов и история ввода
    • Интеграция с файловой системой
    • Управление памятью и системой

Архитектурные изменения

Терминальный слой

В системе появился новый уровень абстракции — терминальный слой (terminal.h/terminal.c). Это логический слой между низкоуровневым доступом к видеопамяти и высокоуровневыми функциями ввода-вывода ядра. Ключевые преимущества:

  • Виртуальный буфер: Теперь экран — это лишь окно в логический буфер размером 80x200 символов, что позволяет реализовать прокрутку истории.
  • Отложенный рендеринг: Обновление экрана происходит только когда это необходимо (флаг dirty), что оптимизирует производительность.
  • Унифицированный API: Все функции вывода (kprint, kprintln, kprint_colored) теперь используют единый интерфейс, который может работать либо напрямую с экраном, либо через терминальный слой.
  • Управление вводом: Добавлены функции для обработки специальных клавиш (backspace, enter, стрелки) в контексте терминала.

Система вывода

Реализован механизм переключения между режимами вывода (screen_output_switch.h):

  • OUTPUT_MODE_SCREEN — прямой вывод в видеопамять (совместимость со старым кодом)
  • OUTPUT_MODE_TERMINAL — вывод через терминальный слой

Это позволяет постепенно мигрировать код на использование новой системы без полного переписывания.

Требования

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

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

./check-env.sh

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

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

make quick

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

make run

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

make run_fda

Создание образа диска флоппи с fat12

make run_fat12

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

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

Отладка

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

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

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

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

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

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

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

  • 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. Загрузчик загружает ядро с диска в память по адресу 0x007e00, используя функции BIOS.
  4. Загрузчик загружает GDT и переключает процессор в защищенный режим.
  5. В защищенном режиме загрузчик выводит сообщение об успешном переходе и передает управление ядру по адресу 0x007e00.

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

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

  • end - остановка процессора
  • clear - очистка экрана
  • malloc <size> - выделение памяти (куча)
  • free <address> - освобождение памяти
  • info - информация о системе
  • memdump - дамп памяти
  • echo <text> - вывод текста
  • help - справка по командам
  • sleep <ms> - ожидать N миллисекунд
  • reboot - перезагрузка
  • rand <seed> - генерация случайного числа по алгоритму xorshift32
  • randrange <seed> <min> <max> - генерация случайного числа в диапазоне при помощи xorshift32
  • binpow <base> <exponent> - бинарное возведение в степень
  • ls - список файлов в корневой директории FAT12
  • cat <filename> - вывод содержимого файла
  • load <filename> [address] - загрузка файла в память по адресу (по умолчанию 0x007e0000)
  • fat12info - информация о файловой системе FAT12
  • qemushutdown - выключение QEMU через порт 0x604

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: Менеджер памяти (кучи) ядра. Реализует динамическое выделение памяти внутри ядра.

    • Аллокатор: Использует алгоритм с разделением и слиянием свободных блоков памяти для минимизации фрагментации.

    • API: Предоставляет знакомые API: kmalloc, kfree, krealloc.

    • Отладка: Содержит функции для отладки и мониторинга состояния кучи: kmemdump, get_meminfo.

  • math.h / math.c: Набор математических функций и алгоритмов, включая вычисление чисел Фибоначчи, бинарное возведение в степень, факториал и дискриминант.

  • ctypes.h / ctypes.c: Полная реализация стандартных функций классификации и преобразования символов (isalpha, isdigit, toupper, etc.).

  • kklibc.h: Главный заголовочный файл, который включает все модули библиотеки для удобства.

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

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

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" отсылает к японскому искусству восстановления керамики золотым лаком — метафора красоты в несовершенстве и постоянного развития.