https://github.com/alexeev-prog/kintsugios
Minimalistic and rich x86_64 operation system in (F)ASM and C
https://github.com/alexeev-prog/kintsugios
asm c fasm i386 i386-elf-gcc operating-system os osdev x86 x86-assembly
Last synced: about 1 month ago
JSON representation
Minimalistic and rich x86_64 operation system in (F)ASM and C
- Host: GitHub
- URL: https://github.com/alexeev-prog/kintsugios
- Owner: alexeev-prog
- License: mit
- Created: 2025-08-19T14:23:34.000Z (about 2 months ago)
- Default Branch: main
- Last Pushed: 2025-08-19T16:32:17.000Z (about 2 months ago)
- Last Synced: 2025-08-19T17:42:57.486Z (about 2 months ago)
- Topics: asm, c, fasm, i386, i386-elf-gcc, operating-system, os, osdev, x86, x86-assembly
- Language: Shell
- Homepage:
- Size: 83 MB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# KintsugiOS
Минималистичная операционная 32 разрядная система с монолитным ядром и собственным загрузчиком на (N)ASM и GCC 15
![]()
KintsugiOS — это минималистичная x86 операционная система, написанная на (N)ASM и C, созданная в образовательных целях для глубокого понимания принципов работы операционных систем. Название проекта отсылает к японскому искусству Kintsugi, где разбитая керамика восстанавливается золотым лаком, подчеркивая красоту несовершенства и непрерывного развития.
Текущая нестабильная версия: v0.2.0a
Последняя стабильная версия: [v0.1.1a](https://github.com/alexeev-prog/KintsugiOS/releases/tag/v0.1.1a)> [!CAUTION]
> KintsugiOS еще в активной стадии разработки и многие решения не финальные или нестабильные.> Также я занимаюсь [переводом OSDEV-Notes](https://github.com/alexeev-prog/Osdev-Notes-RU)

## Особенности
### Реализовано
- **Собственный загрузчик** с переходом из реального режима в защищённый
- **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)
- Библиотека дополнительных типов данных (datatypes)
- Вектора (vector.h)
- Библиотека стандартных методов (stdlib.h)### В разработке
- [ ] Файловая система Fat12
- [ ] Файловая система ext2
- [ ] Планировщик задач
- [ ] Пользовательское пространство
- [ ] Inter-Process Communication
- [ ] Загрузка ELF
- [ ] Графический интерфейс
- [ ] Многозадачность
- [ ] Пользовательский режим
- [ ] Сетевой стек
- [ ] Псевдографический интерфейс
- [ ] Полностью реализованный LibC### Готово
- [x] Виртуальная память (Paging)
- [x] Динамические аллокаторы памяти
- [x] Чувствительность к регистру
- [x] Драйвер ATA PIO
- [x] Система прерываний с обработкой исключений
- [x] Полноценная shell-оболочка## Требования
Для сборки и запуска KintsugiOS необходим следующий инструментарий:
- [Кросс-компилятор i386 ELF GCC](http://newos.org/toolchains/i386-elf-15.1.0-Linux-x86_64.tar.xz)
- FASM
- NASM
- GDB для отладки
- MTools и Xorriso
- QEMU или BochsПроверить готовность окружения можно скриптом:
```bash
./check-env.sh
```## Сборка и запуск
### Базовая сборка
```bash
make
```### Создание образа диска (hdd) и запуск в QEMU
```bash
make run
```### Создание образа диска fda и запуск в QEMU
```bash
make run_fda
```### Очистка проекта
```bash
make clean # Удаление бинарных файлов
make clean_all # Полная очистка
```## Отладка
Для отладки KintsugiOS запустите систему в режиме отладки:
```bash
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 ` - выделение памяти (куча)
- `free
- `info` - информация о системе
- `memdump` - дамп памяти
- `echp ` - вывод текста
- `help` - справка по командам
- `sleep ` - ожидать N секунд
- `reboot` - перезагрузка
- `rand ` - генерация случайного числа по алгоритму xorshift32
- `randrange ` - генерация случайного числа в диапазоне при помощи xorshift32
- `binpow ` - бинарное возведение в степень
- `fib ` - алгоритм фибоначчи## 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.).
+ **`datatypes/vector.h` / `vector.c`**: Реализация динамического массива (вектора) — фундаментальной структуры данных, которая будет полезна для управления списками процессов, дескрипторов файлов и т.д.
+ **`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
- **Пользовательский режим:** Разграничение привилегий
- **Сетевой стек:** Базовая поддержка сетевых протоколов
- **Графический интерфейс:** Псевдографическая оболочка## Литература и источники
### Ассемблер
- Зубков С. В. «Assembler для DOS, Windows и Unix»
- [Введение в машинный код](http://wasm.ru/article.php?article=1022001)
- [Программирование на ассемблере под DOS](http://wasm.ru/article.php?article=1022003)### Язык C
- Керниган Б., Ритчи Д. «Язык программирования C»
- Шилдт Г. «Полный справочник по C»
- [C standard library for embedded systems](https://github.com/peterzuger/libc)### Операционные системы
- Таненбаум Э. «Современные операционные системы»
- Таненбаум Э. «Операционные системы: Разработка и реализация»
- [OSDEV Wiki](http://osdev.org)
- [FlingOS™ Documentation](http://flingos.co.uk/docs/)### Архитектура ЭВМ
- Таненбаум Э. «Архитектура компьютера»
- Гук М. «Аппаратные средства IBM PC. Энциклопедия»---
Также вы можете подробно просмотреть в документе [DOCLINKS](./DOCLINKS.md) весь материал со ссылками.
## Лицензия
KintsugiOS распространяется под лицензией MIT. Подробнее см. в файле LICENSE.
## Вклад в проект
Приветствуются issues и pull requests. Перед внесением изменений пожалуйста:
1. Обсудите планируемые изменения в issue
2. Следуйте существующему кодстайлу
3. Добавляйте комментарии на русском языке
4. Тестируйте изменения в QEMU и Bochs## Благодарности
Особая благодарность сообществу OSDev и авторам учебных материалов, указанных в разделе "Литература и источники".
---
Название "Kintsugi" отсылает к японскому искусству восстановления керамики золотым лаком — метафора красоты в несовершенстве и постоянного развития.