diff --git a/README.md b/README.md new file mode 100644 index 0000000..d6f9e57 --- /dev/null +++ b/README.md @@ -0,0 +1,95 @@ +# 🖥️ Операционная система в 1000 строках кода на С + +> Минимальная операционная система для архитектуры RISC-V 32-bit, реализованная по книге [Operating System in 1,000 Lines](https://operating-system-in-1000-lines.vercel.app/en/) + +![](./screenshot.png) + +--- + +## 📋 Стек + +- **Архитектура:** RISC-V 32-bit +- **Компилятор:** Clang с поддержкой RISC-V +- **Язык:** C11 (freestanding) +- **Виртуализация:** 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 + +### Запуск + +```bash +cd src +./run.sh +``` \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..e27ffdf Binary files /dev/null and b/screenshot.png differ