Минималистичная операционная 32 разрядная система с монолитным ядром и собственным загрузчиком на (N)ASM и GCC 15
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 необходим следующий инструментарий:
Проверить готовность окружения можно скриптом:
Сборка и запуск
Базовая сборка
Создание образа диска (hdd) и запуск в QEMU
Создание образа диска fda и запуск в QEMU
Очистка проекта
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 из ядра.
Процесс загрузки:
- BIOS загружает первый сектор диска (512 байт) по адресу 0x7c00 и передает управление на его начало.
- Загрузчик инициализирует стек и выводит сообщение о запуске в реальном режиме.
- Загрузчик загружает ядро с диска в память по адресу 0x1000, используя функции BIOS.
- Загрузчик загружает GDT и переключает процессор в защищенный режим.
- В защищенном режиме загрузчик выводит сообщение об успешном переходе и передает управление ядру по адресу 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
Операционные системы
Архитектура ЭВМ
- Таненбаум Э. «Архитектура компьютера»
- Гук М. «Аппаратные средства IBM PC. Энциклопедия»
Также вы можете подробно просмотреть в документе DOCLINKS весь материал со ссылками.
Лицензия
KintsugiOS распространяется под лицензией MIT. Подробнее см. в файле LICENSE.
Вклад в проект
Приветствуются issues и pull requests. Перед внесением изменений пожалуйста:
- Обсудите планируемые изменения в issue
- Следуйте существующему кодстайлу
- Добавляйте комментарии на русском языке
- Тестируйте изменения в QEMU и Bochs
Благодарности
Особая благодарность сообществу OSDev и авторам учебных материалов, указанных в разделе "Литература и источники".
Название "Kintsugi" отсылает к японскому искусству восстановления керамики золотым лаком — метафора красоты в несовершенстве и постоянного развития.