|
1 | 1 | # KintsugiOS |
2 | | -Минималистичная x86 операционная система на (N)ASM и С. |
| 2 | + |
| 3 | +Минималистичная x86 операционная система на (N)ASM и C, созданная в образовательных целях для глубокого понимания принципов работы операционных систем. |
3 | 4 |
|
4 | 5 | <div align="center"> |
5 | 6 | <img src=https://img.shields.io/github/languages/top/alexeev-prog/KintsugiOS> |
|
8 | 9 | <img src="https://img.shields.io/github/issues/alexeev-prog/KintsugiOS"> |
9 | 10 | </div> |
10 | 11 |
|
11 | | -## Requirements |
12 | | -Этот проект использует [кросс компилятор i386 ELF GCC](http://newos.org/toolchains/i386-elf-15.1.0-Linux-x86_64.tar.xz), FASM 1.73, NASM 2.16 и GDB, MTools, Xorriso. |
| 12 | + |
| 13 | + |
| 14 | +## Особенности |
| 15 | + |
| 16 | +### Реализовано |
| 17 | +- **Загрузчик** с переходом из реального режима в защищённый |
| 18 | +- **GDT** (Глобальная таблица дескрипторов) |
| 19 | +- **Управление памятью** с двумя аллокаторами: |
| 20 | + - Арена-аллокатор (legacy) |
| 21 | + - Аллокатор на основе связанных блоков памяти |
| 22 | +- **Драйверы**: |
| 23 | + - VGA-экран с поддержкой цветного текста |
| 24 | + - Клавиатура (PS/2) |
| 25 | + - Таймер |
| 26 | +- **Система прерываний** (IDT, ISR, IRQ) |
| 27 | +- **Командная оболочка** "Keramika Shell" с поддержкой команд: |
| 28 | + - `HELP` - список команд |
| 29 | + - `CLEAR` - очистка экрана |
| 30 | + - `END` - остановка CPU |
| 31 | + - `AMALLOC`/`MALLOC` - выделение памяти |
| 32 | + - `FREE` - освобождение памяти |
| 33 | + - `INFO` - информация о системе |
| 34 | + - `MEMDUMP` - дамп памяти |
| 35 | + - И другие... |
| 36 | +- **Библиотека LibC** включая: |
| 37 | + - Работу со строками (string.h) |
| 38 | + - Форматированный вывод (stdio.h) |
| 39 | + - Функции памяти (mem.h) |
| 40 | + |
| 41 | +### В разработке |
| 42 | +- [ ] Виртуальная память (Paging) |
| 43 | +- [ ] Файловая система |
| 44 | +- [ ] Многозадачность |
| 45 | +- [ ] Пользовательский режим |
| 46 | +- [ ] Сетевой стек |
| 47 | + |
| 48 | +## Требования |
| 49 | + |
| 50 | +Для сборки и запуска KintsugiOS необходим следующий инструментарий: |
| 51 | + |
| 52 | +- [Кросс-компилятор i386 ELF GCC](http://newos.org/toolchains/i386-elf-15.1.0-Linux-x86_64.tar.xz) |
| 53 | +- FASM 1.73.31 или новее |
| 54 | +- NASM 2.16 или новее |
| 55 | +- GDB для отладки |
| 56 | +- MTools и Xorriso для создания образов дисков |
| 57 | +- QEMU или Bochs для эмуляции |
| 58 | + |
| 59 | +Проверить готовность окружения можно скриптом: |
| 60 | +```bash |
| 61 | +./check-env.sh |
| 62 | +``` |
13 | 63 |
|
14 | | -Пожалуйста, скачайте тулчейн компилятора и переместите его в директорию `toolchain/`. Также вы можете изменить `shell.nix`: |
| 64 | +## Структура проекта |
15 | 65 |
|
16 | | -```nix |
17 | | -let |
18 | | - customToolchainPath = "toolchain/i386-elf-15.1.0-Linux-x86_64/bin"; # ваш путь до бинарников компилятора |
19 | | -in |
| 66 | +``` |
| 67 | +src/ |
| 68 | +├── bootloader/ # Код загрузчика |
| 69 | +│ ├── bootsector.asm # Главная загрузочная запись |
| 70 | +│ ├── diskload.asm # Чтение с диска |
| 71 | +│ ├── gdt.asm # Глобальная таблица дескрипторов |
| 72 | +│ ├── kernel_entry.asm # Точка входа в ядро |
| 73 | +│ ├── puts_chars.asm # Вывод текста (16-бит) |
| 74 | +│ ├── puts_chars32.asm # Вывод текста (32-бит) |
| 75 | +│ ├── puts_hex.asm # Вывод hex-чисел |
| 76 | +│ └── switch_to32.asm # Переход в защищённый режим |
| 77 | +└── kernel/ # Ядро ОС |
| 78 | + ├── cpu/ # Центральные модули процессора |
| 79 | + │ ├── idt.[ch] # Таблица дескрипторов прерываний |
| 80 | + │ ├── interrupt.asm # Обработчики прерываний |
| 81 | + │ ├── isr.[ch] # Службы прерываний |
| 82 | + │ ├── ports.[ch] # Работа с портами ввода-вывода |
| 83 | + │ ├── timer.[ch] # Системный таймер |
| 84 | + │ └── type.h # Общие типы данных |
| 85 | + ├── drivers/ # Драйверы устройств |
| 86 | + │ ├── keyboard.[ch] # Драйвер клавиатуры |
| 87 | + │ ├── lowlevel_io.[ch] # Низкоуровневый ввод-вывод |
| 88 | + │ └── screen.[ch] # Драйвер экрана |
| 89 | + ├── kernel/ # Основное ядро |
| 90 | + │ ├── kernel.[ch] # Главные функции ядра |
| 91 | + │ ├── utils.[ch] # Вспомогательные утилиты |
| 92 | + └── libc/ # Стандартная библиотека C - KKLIBC (Kintsugi Kernel LibC) |
| 93 | + ├── function.h # Вспомогательные макросы |
| 94 | + ├── mem.[ch] # Управление памятью |
| 95 | + ├── stdio.[ch] # Стандартный ввод-вывод |
| 96 | + └── string.[ch] # Работа со строками |
20 | 97 | ``` |
21 | 98 |
|
22 | | -Перел разработкой, проверьте вывод `check-env.sh`: |
| 99 | +## Сборка и запуск |
23 | 100 |
|
| 101 | +### Базовая сборка |
24 | 102 | ```bash |
25 | | - $ ./check-env.sh |
26 | | - |
27 | | -KintsugiOS Development Environment Check |
28 | | -======================================== |
29 | | - |
30 | | -Cross Compiler Tools: |
31 | | -[PASS] i386-elf-gcc |
32 | | -[PASS] i386-elf-ld |
33 | | -[PASS] i386-elf-objcopy |
34 | | - |
35 | | -Assemblers: |
36 | | -[PASS] FASM |
37 | | -[PASS] NASM |
38 | | - |
39 | | -Emulators: |
40 | | -[PASS] QEMU i386 |
41 | | -[PASS] Bochs |
42 | | - |
43 | | -Utilities: |
44 | | -[PASS] GDB |
45 | | -[PASS] MTools |
46 | | -[PASS] Xorriso |
47 | | - |
48 | | -Environment Check Summary: |
49 | | -========================== |
50 | | -Total checks: 10 |
51 | | -Passed: 10 |
52 | | -Environment is fully ready for KintsugiOS development! |
| 103 | +make |
53 | 104 | ``` |
54 | 105 |
|
55 | | -## Сборка и запуск |
| 106 | +### Создание образа диска и запуск в QEMU |
| 107 | +```bash |
| 108 | +make run |
| 109 | +``` |
| 110 | + |
| 111 | +### Запуск в QEMU с отладкой |
| 112 | +```bash |
| 113 | +make debug |
| 114 | +``` |
56 | 115 |
|
| 116 | +### Очистка проекта |
57 | 117 | ```bash |
58 | | -make # сборка |
59 | | -make run # сборка и запуск в qemu |
| 118 | +make clean # Удаление бинарных файлов |
| 119 | +make clean_all # Полная очистка |
60 | 120 | ``` |
61 | 121 |
|
62 | | -## Фичи |
| 122 | +## Отладка |
63 | 123 |
|
64 | | - + bootloader: |
65 | | - + gdt |
66 | | - + diskload |
67 | | - + switch to 32 |
68 | | - + kernel: |
69 | | - + drivers |
70 | | - + libc |
71 | | - + CPU |
72 | | - + basic shell |
| 124 | +Для отладки KintsugiOS запустите систему в режиме отладки: |
| 125 | +```bash |
| 126 | +make debug |
| 127 | +``` |
73 | 128 |
|
74 | | -## Литература, источники |
| 129 | +И подключитесь через ваш дебаггер (например gdb). |
75 | 130 |
|
76 | | -По языку ассемблера: |
| 131 | +## Как работает загрузка |
77 | 132 |
|
78 | | - + Зубков С. В. «Assembler для DOS, Windows и Unix» |
79 | | - + [Введение в машинный код](http://wasm.ru/article.php?article=1022001) |
80 | | - + [Программирование на ассемблере под DOS](http://wasm.ru/article.php?article=1022003) |
81 | | - + [Введение в ассемблер](https://hackware.ru/?p=8654) |
82 | | - + [ASCII таблица](https://www.asciitable.com/) |
83 | | - + [Погружение в ассемблер](https://xakep.ru/2017/09/11/asm-course-1/) |
84 | | - + [От изучающего ассемблер до взломщика программ](https://wasm.in/attachments/skljarov-i-izuchaem-assembler-za-7-dnej-pdf.2906/) |
85 | | - + [Руководство по ассемблеру MASM intel x86_64](https://metanit.com/assembler/tutorial/) |
| 133 | +1. **BIOS** загружает первый сектор диска (512 байт) по адресу 0x7C00 |
| 134 | +2. **Загрузчик** инициализирует стек, загружает GDT и переключается в защищённый режим |
| 135 | +3. **Ядро** загружается по адресу 0x1000 и получает управление |
| 136 | +4. **Ядро** инициализирует драйверы, менеджер памяти и командную оболочку |
86 | 137 |
|
87 | | -По языку Си: |
| 138 | +## Команды оболочки |
88 | 139 |
|
89 | | - + Керниган Б., Ритчи Д. «Язык программирования C» |
90 | | - + Шилдт Г. «Полный справочник по C» |
| 140 | +KintsugiOS включает оболочку "Keramika Shell" со следующими командами: |
91 | 141 |
|
92 | | -По устройству операционных систем: |
| 142 | +- `END` - остановка процессора |
| 143 | +- `CLEAR` - очистка экрана |
| 144 | +- `AMALLOC <size>` - выделение памяти (арена) |
| 145 | +- `MALLOC <size>` - выделение памяти (куча) |
| 146 | +- `FREE <address>` - освобождение памяти |
| 147 | +- `INFO` - информация о системе |
| 148 | +- `MEMDUMP` - дамп памяти |
| 149 | +- `ECHO <text>` - вывод текста |
| 150 | +- `HELP` - справка по командам |
93 | 151 |
|
94 | | - + Таненбаум Э. «Современные операционные системы» |
95 | | - + Таненбаум Э. «Операционные системы: Разработка и реализация» |
96 | | - + Олифер В., Олифер Н. «Сетевые операционные системы» |
97 | | - + [OSDEV Wiki](http://osdev.org) |
| 152 | +## Литература и источники |
98 | 153 |
|
99 | | -По архитектуре ЭВМ: |
| 154 | +### Ассемблер |
| 155 | +- Зубков С. В. «Assembler для DOS, Windows и Unix» |
| 156 | +- [Введение в машинный код](http://wasm.ru/article.php?article=1022001) |
| 157 | +- [Программирование на ассемблере под DOS](http://wasm.ru/article.php?article=1022003) |
100 | 158 |
|
101 | | - + Таненбаум Э. «Архитектура компьютера» |
102 | | - + Гук М. «Аппаратные средства IBM PC. Энциклопедия» |
103 | | - + Петцольд Ч. «Код. Тайный язык информатики» |
| 159 | +### Язык C |
| 160 | +- Керниган Б., Ритчи Д. «Язык программирования C» |
| 161 | +- Шилдт Г. «Полный справочник по C» |
| 162 | + |
| 163 | +### Операционные системы |
| 164 | +- Таненбаум Э. «Современные операционные системы» |
| 165 | +- Таненбаум Э. «Операционные системы: Разработка и реализация» |
| 166 | +- [OSDEV Wiki](http://osdev.org) |
| 167 | + |
| 168 | +### Архитектура ЭВМ |
| 169 | +- Таненбаум Э. «Архитектура компьютера» |
| 170 | +- Гук М. «Аппаратные средства IBM PC. Энциклопедия» |
| 171 | + |
| 172 | +## Лицензия |
| 173 | + |
| 174 | +KintsugiOS распространяется под лицензией MIT. Подробнее см. в файле LICENSE. |
| 175 | + |
| 176 | +## Вклад в проект |
| 177 | + |
| 178 | +Приветствуются issues и pull requests. Перед внесением изменений пожалуйста: |
| 179 | +1. Обсудите планируемые изменения в issue |
| 180 | +2. Следуйте существующему кодстайлу |
| 181 | +3. Добавляйте комментарии на русском языке |
| 182 | +4. Тестируйте изменения в QEMU и Bochs |
| 183 | + |
| 184 | +## Благодарности |
| 185 | + |
| 186 | +Особая благодарность сообществу OSDev и авторам учебных материалов, указанных в разделе "Литература и источники". |
| 187 | + |
| 188 | +--- |
| 189 | + |
| 190 | +<div align="center"> |
| 191 | +<sub>Название "Kintsugi" отсылает к японскому искусству восстановления керамики золотым лаком — метафора красоты в несовершенстве и постоянного развития.</sub> |
| 192 | +</div> |
0 commit comments