Большое начинается с малого. Например, ядро Linux 0.0.1 состояло всего из 10 239 строк кода, из них 20% комментарии. Такой проект вполне может осилить студент в качестве курсовой или дипломной работы, программируя по вечерам на домашнем ПК (собственно, Линус и написал его во время учёбы в университете, когда вернулся из армии).
Если один студент смог это сделать тогда, то почему нельзя повторить? И действительно, в интернете есть даже специальные обучающие ресурсы для написания новых ОС и целые сообщества энтузиастов, которые помогают друг другу в этом непростом деле.
Например, на сайте OSDev.org представлено буквально пошаговое руководство для новичков по написанию собственной ОС с нуля.
Здесь представлена обучающая информация по всем компонентам операционной системы: документация по аппаратному обеспечению и архитектуре, памяти, прерываниям, часам и таймерам, обработке графики, звука, системе ввода-вывода, системе хранения, PCI, USB, сетевым картам, беспроводным сетям и т. д.
Насчёт «пошагового» руководства не шутка — есть раздел «Создание ОС» и отдельная страничка «В каком порядке всё делать».
Советы для начинающих:
- Безусловно [в первую очередь] необходим вывод на экран строк и целых чисел (как десятичных, так и шестнадцатеричных). Это один из самых простых способов отладки. Практически каждый из нас в версии 0.01 проходил через
kprint()
илиkout
.- Вывод на последовательный порт сэкономит массу времени на отладку, исключив потерю информации из-за прокрутки. Вы сможете тестировать свою ОС с консоли, фильтровать интересные отладочные сообщения и автоматизировать некоторые тесты.
- Очень полезно наличие работающей и надёжной системы обработки прерываний/исключений, которая может сбрасывать содержимое регистров (и, возможно, адрес ошибки).
- Спланируйте карту памяти (виртуальную и физическую): решите, куда записывать данные.
- Практически невозможно обойтись без выделения памяти во время выполнения программ (т. е.
malloc
иfree
), так что желательно как можно скорее реализовать кучу.
Есть довольно интересные проекты, которые выросли из сообщества разработчиков новых операционных систем. Например, Fomos — экспериментальная ОС, написанная на Rust.
▍ Экспериментальная ОС на Rust
Fomos — это чистый эксперимент по изучению экзоядер, а также насколько Rust упрощает написание таких систем.
Автор реализовал базовый минимум для ядра: графический вывод, динамическое распределение памяти, загрузку и запуск параллельных приложений (написано пять приложений: app_background, app_c, app_console, app_cursor, app_test), поддержку мыши и клавиатуры (драйверы являются асинхронными задачами), все приложения тоже запускаются в асинхронном цикле, кооперативное планирование (приложения передают контроль как можно чаще).
Из уникальных функций автор называет то, что здесь приложения представляют собой просто функции контекста, а системные вызовы в этой ОС отсутствуют как явление. Когда приложение заканчивает работу (return;
), контроль автоматически возвращается ядру.
Даже память приложения находится в контексте, который можно автоматически сохранить перед выходом:
//kernel just started
...
let app = App::new(..);
let ctx = disk.load(app.id).unwrap_or(Context::new(..));
loop{
app._start(ctx);
if restart_request{
disk.save(app.id, ctx)
break;
}
}
//handle restart
...
См. также статьи Филиппа Оперманна про написание маленькой ОС на Rust.
▍ Статически связанный мини-линукс
Недалеко от «собственной ОС» стоит создание собственного дистрибутива Linux или кастомной сборки Windows (с удалением лишних программ, блокировкой телеметрии и т. д.).
В качестве примера можно посмотреть на Oasis — «минимальный дистрибутив Linux». Это маленькая Linux-система, которая довольно сильно отличается от привычных дистрибутивов Linux, а скорее ближе к BSD.
Главная особенность Oasis — полная статическая связанность. Это значит, что всё программное обеспечение в базовой системе статически связано, включая сервер отображения (velox) и веб-браузер (netsurf). Самое значительное преимущество статического связывания заключается в том, что приложение может быть уверено в наличии всех своих библиотек и в том, что все они правильной версии. Это позволяет избежать проблем с зависимостями (DLL Hell), а также позволяет заключить приложение в один исполняемый файл. Полностью самодостаточный бинарник, который легко копировать с компьютера на компьютер — и запускать.
Другие особенности Oasis:
- Быстрая сборка со 100%-ной воспроизводимостью. Все пакеты собираются с помощью samurai, используя манифесты сборки, которые генерируются скриптами Lua. Это даёт множество преимуществ: оптимальное время сборки, предсказуемость и воспроизводимость билдов и уменьшение зависимостей во время сборки.
- Минимальные требования для загрузки. Загрузка Oasis возможна на любой POSIX-системе с git, lua, curl, утилитой sha256, стандартными утилитами сжатия и кросс-компилятором
x86_64-linux-musl
. - BearSSL как системная TLS и криптобиблиотека. BearSSL на С — это невероятно эффективная, лаконичная и красивая библиотека (20 КБ скомпилированного кода, занимает 25 КБ в памяти), которая не получила широкого распространения, но Oasis использует её повсеместно вместо LibreSSL. Кроме того, дистрибутив использует и другие более легковесные альтернативы распространённым инструментам:
sbase
вместоcoreutils
,ubase
вместоutil-linux
,pigz
вместоgzip
,mandoc
вместоman-db
,bearssl
вместоopenssl
,oksh
вместоbash
,sdhcp
вместоdhclient
илиdhcpcd
,vis
вместоvim
илиemacs
,byacc
вместоbison
,perp
иsinit
вместоsysvinit
илиsystemd
, Netsurf вместо Chromium/Firefox и т. д. - Отсутствие менеджера пакетов. Вместо этого задаётся набор спецификаций, какие файлы из каких пакетов следует включить в систему, а система сборки записывает полученное дерево файловой системы в git-репозиторий.
- Хорошая интеграция с независимыми пакетными системами, такими как pkgsrc и nix.
- Чрезвычайно простая настройка. Самый сложный файл в конфигурации по умолчанию — это скрипт инициализации системы
/etc/rc.init
из 16 строк. - Соответствие стандарту ISO C (в целом). Основной целью является сборка с помощью cproc, компилятора C, который гораздо строже относится к стандарту ISO C, чем gcc или clang, и на порядки меньше по размеру. Большинство пакетов Oasis уже успешно собираются с помощью cproc, над остальными идёт работа.
Подробнее о процессе установки и администрирования Oasis см. в вики проекта.
▍ Интерфейс ОС на игровом движке
Кроме настоящих ОС, бывают и ненастоящие, то есть фейковые «оболочки», просто создающие видимость операционной системы, но не имеющие ядра. Например, GodotOS выглядит и ведёт себя как настоящая система, не являясь таковой на самом деле. В интернет-демонстрации вы можете просматривать папки, редактировать текстовые файлы, просматривать изображения, играть в игры и многое другое. Всё это в едином консистентном интерфейсе, причём очень красивом.
Демо-версия GodotOS, трейлер
GodotOS — скорее игрушка, чем серьёзный проект. Его цель — сделать минималистичный и эстетически приятный рабочий стол. Разработчики креативно использовали игровой 2D- и 3D-движок Godot Engine не совсем по назначению. Оказывается, с его помощью можно создавать UI для десктопных приложений, а не только игры.
▍ Ядро xv6
Учебная операционка x86 — повторная реализация оригинальной Unix Version 6 (v6) от Денниса Ритчи и Кена Томпсона. Как известно, на этой фундаментальной исторической ОС основаны многие популярные системы современности, в том числе Linux и macOS (через ответвление BSD из Unix-семейства).
Эта учебная ОС изучается на курсе «Разработка операционных систем» Массачусетского технологического института (лабораторные задания по курсу).
Недавно на Хабре был опубликован цикл статей с переводом книги Расса Кокса и соавторов «xv6: простая, Unix-подобная учебная операционная система».
▍ Браузерные движки
Современные браузеры по своей сложности вплотную приблизились к операционным системам. Собственно, и по функциональности они уже не слишком уступают им, ведь в браузере можно запускать практически любые приложения, написанные на любых языках, и даже на ассемблере (WebAssembly), то есть на языке низкого уровня. Например, «хромбуки» от Google работают на операционной системе ChromeOS, а она по сути представляет собой браузер Chrome, который загружается поверх ядра Linux.
Поэтому создание новых браузерных движков по сложности может быть близко к написанию новых ОС. Из интересных новинок в этой области можно упомянуть Shadow — браузерный движок, почти полностью написанный на JavaScript.
Компоненты Shadow
На специальной демо-страничке можно посмотреть, как Shadow парсит разные сайты. Пока что он справляется только с относительно простыми для рендеринга веб-страничками. Например, Хабр для него слишком сложен, как и большинство других сайтов.
А вот домашнюю страничку SerenityOS он парсит практически без ошибок:
Для сравнения, скриншот той же странички в Chrome (попробуйте найти отличия):
Кстати, SerenityOS (на КДПВ) — ещё один пример альтернативной ОС в стиле Unix, с графическим интерфейсом в стиле 90-х и функциями из разных современных операционных систем. Об этой необычной системе уже рассказывали на Хабре. Причём на Хабре была новость, что разработчики SerenityOS выпустили кроссплатформенный браузер Ladybird на собственном движке. Тоже в своём роде рекурсия.
Кроссплатформенный браузер Ladybird от создателей SerenityOS
В отличие от Shadow, этот браузер поддерживает все современные стандарты по тестам Acid3.
И это далеко не единственный браузерный движок от независимых разработчиков. В качестве примеров можно вспомнить Servo (движок на Rust, изначально разработанный Mozilla, сейчас поддерживается силами Linux Foundation) и Flow. Как и с операционными системами, здесь огромное поле для экспериментов.
Разработка собственной ОС даже с практическим руководством — долгий и трудный путь, но в то же время увлекательный и полезный. Можно представить, как начинающий разработчик сперва строго придерживается пошаговых советов и плана, а потом всё дальше отходит от них и принимает собственные решения о дизайне своей операционной системы. В итоге он может создать нечто действительно уникальное и революционное, как Дмитрий Завалишин с операционной системой «Фантом».
Phantom OS
Даже если она окажется неприменима на практике, фундаментальная польза от любых инноваций всегда несомненна, ведь они двигают человечество вперёд.
Автор: Анатолий Ализар