Большое начинается с малого. Например,
ядро 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
Учебная операционка xv6 — повторная реализация оригинальной 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
Даже если она окажется неприменима на практике, фундаментальная польза от любых инноваций всегда несомненна, ведь они двигают человечество вперёд.
Telegram-канал со скидками, розыгрышами призов и новостями IT 💻