Как написать свою маленькую ОС

в 9:00, , рубрики: BearSSL, Fomos, Godot Engine, GodotOS, javascript, linux, Oasis, OSDev, Rust, ruvds_статьи, SerenityOS, servo, shadow, UNIX, xv6, браузерный движок, операционная система, статическая связанность, экзоядро
Как написать свою маленькую ОС - 1

Большое начинается с малого. Например, ядро Linux 0.0.1 состояло всего из 10 239 строк кода, из них 20% комментарии. Такой проект вполне может осилить студент в качестве курсовой или дипломной работы, программируя по вечерам на домашнем ПК (собственно, Линус и написал его во время учёбы в университете, когда вернулся из армии).

Если один студент смог это сделать тогда, то почему нельзя повторить? И действительно, в интернете есть даже специальные обучающие ресурсы для написания новых ОС и целые сообщества энтузиастов, которые помогают друг другу в этом непростом деле.

Например, на сайте OSDev.org представлено буквально пошаговое руководство для новичков по написанию собственной ОС с нуля.

Здесь представлена обучающая информация по всем компонентам операционной системы: документация по аппаратному обеспечению и архитектуре, памяти, прерываниям, часам и таймерам, обработке графики, звука, системе ввода-вывода, системе хранения, PCI, USB, сетевым картам, беспроводным сетям и т. д.

Насчёт «пошагового» руководства не шутка — есть раздел «Создание ОС» и отдельная страничка «В каком порядке всё делать».

Советы для начинающих:

  1. Безусловно [в первую очередь] необходим вывод на экран строк и целых чисел (как десятичных, так и шестнадцатеричных). Это один из самых простых способов отладки. Практически каждый из нас в версии 0.01 проходил через kprint() или kout.
  2. Вывод на последовательный порт сэкономит массу времени на отладку, исключив потерю информации из-за прокрутки. Вы сможете тестировать свою ОС с консоли, фильтровать интересные отладочные сообщения и автоматизировать некоторые тесты.
  3. Очень полезно наличие работающей и надёжной системы обработки прерываний/исключений, которая может сбрасывать содержимое регистров (и, возможно, адрес ошибки).
  4. Спланируйте карту памяти (виртуальную и физическую): решите, куда записывать данные.
  5. Практически невозможно обойтись без выделения памяти во время выполнения программ (т. е. malloc и free), так что желательно как можно скорее реализовать кучу.

Есть довольно интересные проекты, которые выросли из сообщества разработчиков новых операционных систем. Например, Fomos — экспериментальная ОС, написанная на Rust.

▍ Экспериментальная ОС на Rust

Fomos — это чистый эксперимент по изучению экзоядер, а также насколько Rust упрощает написание таких систем.

Как написать свою маленькую ОС - 2

Автор реализовал базовый минимум для ядра: графический вывод, динамическое распределение памяти, загрузку и запуск параллельных приложений (написано пять приложений: 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.

Как написать свою маленькую ОС - 3

Главная особенность 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 выглядит и ведёт себя как настоящая система, не являясь таковой на самом деле. В интернет-демонстрации вы можете просматривать папки, редактировать текстовые файлы, просматривать изображения, играть в игры и многое другое. Всё это в едином консистентном интерфейсе, причём очень красивом.

Как написать свою маленькую ОС - 4
Демо-версия 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.

Как написать свою маленькую ОС - 5
Компоненты Shadow

На специальной демо-страничке можно посмотреть, как Shadow парсит разные сайты. Пока что он справляется только с относительно простыми для рендеринга веб-страничками. Например, Хабр для него слишком сложен, как и большинство других сайтов.

А вот домашнюю страничку SerenityOS он парсит практически без ошибок:

Как написать свою маленькую ОС - 6

Для сравнения, скриншот той же странички в Chrome (попробуйте найти отличия):

Как написать свою маленькую ОС - 7

Кстати, SerenityOS (на КДПВ) — ещё один пример альтернативной ОС в стиле Unix, с графическим интерфейсом в стиле 90-х и функциями из разных современных операционных систем. Об этой необычной системе уже рассказывали на Хабре. Причём на Хабре была новость, что разработчики SerenityOS выпустили кроссплатформенный браузер Ladybird на собственном движке. Тоже в своём роде рекурсия.

Как написать свою маленькую ОС - 8
Кроссплатформенный браузер Ladybird от создателей SerenityOS

В отличие от Shadow, этот браузер поддерживает все современные стандарты по тестам Acid3.

И это далеко не единственный браузерный движок от независимых разработчиков. В качестве примеров можно вспомнить Servo (движок на Rust, изначально разработанный Mozilla, сейчас поддерживается силами Linux Foundation) и Flow. Как и с операционными системами, здесь огромное поле для экспериментов.

Разработка собственной ОС даже с практическим руководством — долгий и трудный путь, но в то же время увлекательный и полезный. Можно представить, как начинающий разработчик сперва строго придерживается пошаговых советов и плана, а потом всё дальше отходит от них и принимает собственные решения о дизайне своей операционной системы. В итоге он может создать нечто действительно уникальное и революционное, как Дмитрий Завалишин с операционной системой «Фантом».

Как написать свою маленькую ОС - 9
Phantom OS

Даже если она окажется неприменима на практике, фундаментальная польза от любых инноваций всегда несомненна, ведь они двигают человечество вперёд.

Автор: Анатолий Ализар

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js