mirror of
https://github.com/StepanovPlaton/OSin1000Lines.git
synced 2026-04-03 20:30:46 +04:00
4.9 KiB
4.9 KiB
🖥️ Операционная система в 1000 строках кода на С
Минимальная операционная система для архитектуры RISC-V 32-bit, реализованная по книге Operating System in 1,000 Lines
📋 Стек
- Архитектура: RISC-V 32-bit
- Компилятор: Clang с поддержкой RISC-V
- Язык: C11 (no std)
- Виртуализация: QEMU (для эмуляции)
🚀 О проекте
- Минимальная операционная система с полным набором базовых функций
- Управление памятью с поддержкой виртуальной адресации и страничной организации памяти (SV32)
- Выделение страниц памяти
- Маппинг виртуальных адресов на физические
- Изоляция адресных пространств процессов
- Многозадачность с поддержкой до 8 процессов одновременно
- Переключение контекста между процессами
- Планировщик задач с round-robin алгоритмом
- Изоляция процессов через отдельные page tables
- Системные вызовы для взаимодействия пользовательских программ с ядром
SYS_PUTCHAR— вывод символа в консольSYS_GETCHAR— чтение символа из консоли (с блокировкой)SYS_EXIT— завершение процессаSYS_READFILE— чтение файлаSYS_WRITEFILE— запись в файл
- Файловая система на основе формата tar (ustar)
- Поддержка чтения и записи файлов
- Автоматическая загрузка файлов из образа диска при старте
- Сохранение изменений на диск через VirtIO
- Работа с диском через интерфейс VirtIO Block Device
- Чтение и запись секторов диска
- Поддержка виртуальных очередей VirtIO
- Обработка исключений и прерываний через trap handler
- Обработка системных вызовов через инструкцию
ecall - Переключение между режимами supervisor и user
- Обработка системных вызовов через инструкцию
- Интерактивная оболочка (shell) в пользовательском пространстве
- Команда
hello— приветствие - Команда
exit— выход из shell - Команда
readfile— чтение файла - Команда
writefile— запись в файл
- Команда
- Разделение на kernel и user space
- Ядро работает в режиме supervisor
- Пользовательские программы работают в режиме user с ограниченными правами
- Защита памяти через page tables
📝 Структура проекта
OSIn1000Lines/
├── src/
│ ├── kernel.c # Основной код ядра (управление процессами, системные вызовы)
│ ├── kernel.h # Заголовочные файлы ядра
│ ├── kernel.ld # Скрипт линковки ядра
│ ├── user.c # Пользовательское пространство (системные вызовы)
│ ├── user.h # Заголовочные файлы пользовательского пространства
│ ├── user.ld # Скрипт линковки пользовательских программ
│ ├── shell.c # Код интерактивной оболочки
│ ├── common.c # Общие функции (printf, memset, memcpy, strcmp)
│ ├── common.h # Общие определения
│ ├── Makefile # Сборка проекта
│ ├── disk/ # Файлы для файловой системы
│ │ ├── hello.txt
│ │ └── meow.txt
│ └── run.sh # Скрипт запуска в QEMU для Linux
│ └── run.bat # Скрипт запуска в QEMU для Windows
└── README.md # Этот файл
🎯 Сборка и запуск
Требования
- Clang с поддержкой RISC-V target
- LLVM objcopy (llvm-objcopy)
- QEMU с поддержкой RISC-V 32-bit
Запуск
cd src
./run.sh
