Образовательный проект ОС с нуля на ассемблере и C для глубокого понимания архитектуры x86
PonOS – это минималистичная операционная система, разработанная полностью с нуля для архитектуры i386 (32-bit x86). Проект демонстрирует фундаментальные концепции разработки ОС: загрузку системы, переход из реального режима в защищённый режим, управление памятью через сегментацию и инициализацию ядра.
Проект охватывает изучение:
- 🔧 Процесс загрузки – MBR, bootloader, загрузка ядра с диска
- 🔄 Переход режимов – из Real Mode (16-bit) в Protected Mode (32-bit)
- 💾 Управление памятью – GDT, сегментация, подготовка к пейджингу
- ⚙️ Низкоуровневое программирование – прямое взаимодействие с оборудованием
- 🛠️ Инструменты разработки – кроссплатформенная компиляция (NASM, i686-elf-gcc, linker scripts)
Система использует классическую трёхстадийную схему загрузки:
╔═════════════════════════════════════════════════════╗
║ ЭТАП 1️⃣ – MBR (Master Boot Record) ║
║ • Адрес: Сектор 0 (0x0000:0x7C00) – 512 байт ║
║ • Функция: Чтение bootloader'а в память (0x8000) ║
║ • Проверка сигнатуры диска (0xAA55) ║
║ • Передача управления bootloader'у ║
╚═════════════════════╤═══════════════════════════════╝
↓
╔═════════════════════════════════════════════════════╗
║ ЭТАП 2️⃣ – Bootloader (вторая стадия загрузки) ║
║ • Адрес: Сектора 1–2 (0x8000) – 1024 байта ║
║ • Инициализация дискового контроллера (LBA/CHS) ║
║ • Загрузка ядра с диска (сектора 3+) ║
║ • Активация A20 gate (доступ выше 1 МБ) ║
║ • Загрузка таблицы дескрипторов (GDT) ║
║ • Включение защищённого режима (Protected Mode) ║
║ • Прыжок на ядро (0x1000) ║
╚═════════════════════╤═══════════════════════════════╝
↓
╔═════════════════════════════════════════════════════╗
║ ЭТАП 3️⃣ – Ядро ОС (Kernel) ║
║ • Адрес: Сектор 3+ (0x1000 в Protected Mode) ║
║ • Точка входа (32-bit ассемблер) ║
║ • Инициализация сегментов памяти и стека ║
║ • Вызов main() – основной код ядра ║
║ • Начало работы операционной системы ║
╚═════════════════════════════════════════════════════╝
PonOS/
│
├── 📂 boot/ # Этапы загрузки (MBR + Bootloader)
│ ├── mbr.asm # ▶ Первая стадия загрузки (512 байт)
│ ├── bootloader.asm # ▶ Вторая стадия загрузки (1024 байта)
│ └── gdt.inc # Определение таблицы дескрипторов (справка)
│
├── 📂 kernel/ # Ядро операционной системы
│ ├── entry.asm # ▶ Точка входа ядра (32-bit)
│ └── main.c # ▶ Основной код ядра на C
│
├── 📂 apps/ # Примеры приложений (будущее расширение)
│ └── calculator.asm # Заготовка приложения
│
├── 📂 build/ # 🔨 Артефакты сборки (авто-генерируется)
│ ├── boot/
│ ├── kernel/
│ └── ponos.img # 💿 Финальный образ диска
│
├── 📂 screenshots/ # 📸 Скриншоты документации
│ ├── help.png
│ └── menu.png
│
├── Makefile # ⚙️ Скрипт сборки и запуска
├── linker.ld # 🔗 Linker script для ядра
├── CHANGELOG.md # 📝 История версий
├── LICENSE # 📜 MIT License
└── README.md # 📖 Этот файл
| Инструмент | Назначение | Установка |
|---|---|---|
| NASM | Ассемблер x86 | pacman -S nasm |
| GCC (i686-elf) | C компилятор | pacman -S i686-elf-gcc |
| Binutils | Линкер и утилиты | pacman -S i686-elf-binutils |
| Make | Автоматизация сборки | pacman -S make |
| QEMU | Эмулятор системы | pacman -S qemu-system-x86 |
🐧 Arch Linux:
sudo pacman -S nasm i686-elf-{gcc,binutils} make qemu-system-x86🐧 Ubuntu / Debian:
sudo apt-get install nasm gcc-i686-linux-gnu binutils-i686-linux-gnu make qemu-system-x86🍎 macOS (Homebrew):
brew install nasm i686-elf-gcc make qemumake clean # Очистить предыдущую сборку
make # Собрать весь проектГенерируемые файлы:
build/boot/mbr.bin– MBR (512 байт)build/boot/boot.bin– Bootloader (1024 байта)build/kernel/kernel.bin– Ядро ОСbuild/ponos.img– Готовый образ диска (20 МБ)
make infoВыводит размеры компонентов и карту секторов диска.
make cleanmake runЗапускает PonOS в эмуляторе QEMU с графическим интерфейсом.
Терминал 1 – запуск эмулятора:
make run-debugТерминал 2 – подключение отладчика:
i686-elf-gdb
(gdb) target remote localhost:1234
(gdb) symbol-file build/kernel/kernel.elf
(gdb) break *0x1000
(gdb) continuemake run-nographicПолезно для удалённых серверов без X11.
make helpХарактеристики:
• Режим по умолчанию при включении CPU
• Адресация: сегмент:смещение (16 + 16 бит)
• Максимум памяти: ~1 МБ (0x00000 – 0xFFFFF)
• Прямой доступ к оборудованию
• Минимальная защита данных
Характеристики:
• Включается установкой PE бита в регистр CR0
• Плоское адресное пространство: 4 ГБ
• Защита памяти через GDT/LDT
• Необходим для современных функций ОС
• Требует инициализации GDT перед включением
Таблица дескрипторов сегментов памяти:
Структура GDT в PonOS:
┌──────────────────────────────────────────┐
│ 0x00 – Null Descriptor (обязателен) │
├──────────────────────────────────────────┤
│ 0x08 – Code Segment (CODE_SEG) │
│ Base: 0x00000000 │
│ Limit: 0xFFFFFFFF (4 ГБ) │
│ Тип: Execute / Read │
├──────────────────────────────────────────┤
│ 0x10 – Data Segment (DATA_SEG) │
│ Base: 0x00000000 │
│ Limit: 0xFFFFFFFF (4 ГБ) │
│ Тип: Read / Write │
└──────────────────────────────────────────┘
Управление адресной линией A20:
Проблема:
• В Real Mode: адрес переполняется на границе 1 МБ
• Адрес 0xFFFF:0x0010 → 0x00000 (обёртывание)
Решение:
• Включить A20 gate для доступа выше 1 МБ в Protected Mode
• Код: mov al, 0x92 → or al, 2 → out 0x92, al
hexdump -C build/boot/boot.bin | head -20i686-elf-objdump -d build/kernel/kernel.elf | head -50i686-elf-nm build/kernel/kernel.elf | sortnasm -f bin boot/bootloader.asm -l build/boot/bootloader.lst| Тема | Ресурс |
|---|---|
| 🌐 Разработка ОС | OSDev.org Wiki |
| 🔧 x86 Архитектура | Intel 80386 Manual |
| 🏗️ NASM Ассемблер | NASM Manual |
| 🔗 GNU Linker | GNU LD Docs |
| 📖 GDB Отладчик | GDB Manual |
| Компонент | Статус | Заметки |
|---|---|---|
| MBR загрузка | ✅ | Готово |
| Bootloader | ✅ | Готово |
| Protected Mode | ✅ | Готово |
| Дисковый I/O (LBA) | ✅ | Полная поддержка |
| GDT Setup | ✅ | Готово |
| IDT Setup | ⏳ | В процессе |
| Пейджинг | ⏳ | В планах |
| Прерывания | ⏳ | В планах |
| Многозадачность | 🚫 | Сложно |
| Файловая система | 🚫 | Очень сложно |
Версия 0.0.6
→ IDT (таблица дескрипторов прерываний)
→ Простая обработка исключений
Версия 0.0.7
→ Базовая поддержка пейджинга
→ Виртуальная память
Версия 0.0.8
→ Обработчик клавиатуры
→ Прерывание от таймера
Версия 0.1.0
→ Простая файловая система (FAT12)
→ Загрузка программ с диска
make # 🔨 Собрать проект
make run # ▶️ Запустить в QEMU
make run-debug # 🔍 Запустить с GDB на порту 1234
make run-nographic # 🖥️ Запустить без графики
make info # 📊 Показать информацию о сборке
make clean # 🗑️ Очистить артефакты
make help # ❓ Справка по доступным командам| Параметр | Значение |
|---|---|
| Лицензия | MIT – свободно использовать в образовательных целях |
| Версия | 0.0.5.6 |
| Статус | 🚀 Активная разработка |
| Обновлено | Ноябрь 2025 |
| Язык | Ассемблер x86 + C (i686-elf) |
| Целевая архитектура | Intel i386 (32-bit x86) |
Made with ❤️ and Assembly
Happy OS hacking! 🔧⚙️🖥️