Skip to content

Fl1riX/PonOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

54 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🖥️ PonOS – Минимальная операционная система для x86-32

Образовательный проект ОС с нуля на ассемблере и C для глубокого понимания архитектуры x86


Status License Architecture [Language] Language Version

📖 Описание проекта

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 qemu

🔨 Сборка проекта

✅ Полная сборка

make 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 clean

🚀 Запуск системы

▶️ Обычный запуск

make run

Запускает PonOS в эмуляторе QEMU с графическим интерфейсом.

🔍 Отладка через GDB

Терминал 1 – запуск эмулятора:

make run-debug

Терминал 2 – подключение отладчика:

i686-elf-gdb
(gdb) target remote localhost:1234
(gdb) symbol-file build/kernel/kernel.elf
(gdb) break *0x1000
(gdb) continue

🖥️ Запуск без графики

make run-nographic

Полезно для удалённых серверов без X11.

❓ Справка

make help

🔑 Ключевые концепции

🔴 Real Mode (Реальный режим – 16-bit)

Характеристики:
  • Режим по умолчанию при включении CPU
  • Адресация: сегмент:смещение (16 + 16 бит)
  • Максимум памяти: ~1 МБ (0x00000 – 0xFFFFF)
  • Прямой доступ к оборудованию
  • Минимальная защита данных

🟢 Protected Mode (Защищённый режим – 32-bit)

Характеристики:
  • Включается установкой PE бита в регистр CR0
  • Плоское адресное пространство: 4 ГБ
  • Защита памяти через GDT/LDT
  • Необходим для современных функций ОС
  • Требует инициализации GDT перед включением

📋 GDT (Global Descriptor Table)

Таблица дескрипторов сегментов памяти:

Структура 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 Gate

Управление адресной линией A20:

Проблема:
  • В Real Mode: адрес переполняется на границе 1 МБ
  • Адрес 0xFFFF:0x0010 → 0x00000 (обёртывание)

Решение:
  • Включить A20 gate для доступа выше 1 МБ в Protected Mode
  • Код: mov al, 0x92 → or al, 2 → out 0x92, al

🐛 Отладка и анализ

🔎 Просмотр Bootloader'а

hexdump -C build/boot/boot.bin | head -20

📖 Дизассемблирование ядра

i686-elf-objdump -d build/kernel/kernel.elf | head -50

📊 Карта символов

i686-elf-nm build/kernel/kernel.elf | sort

📝 Листинг ассемблера NASM

nasm -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 В процессе
Пейджинг В планах
Прерывания В планах
Многозадачность 🚫 Сложно
Файловая система 🚫 Очень сложно

🎯 Roadmap развития

Версия 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! 🔧⚙️🖥️

About

Операционная система для архитектуры intel x86. Двухэтапная загрузка с загрузчиками на ассемблере и ядром на С.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors