- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор реализовал базовый минимум для ядра: графический вывод, динамическое распределение памяти, загрузку и запуск параллельных приложений (написано пять приложений: app_background [8], app_c [9], app_console [10], app_cursor [11], app_test [12]), поддержку мыши и клавиатуры (драйверы являются асинхронными задачами), все приложения тоже запускаются в асинхронном цикле, кооперативное планирование (приложения передают контроль как можно чаще).

Из уникальных функций автор называет то, что здесь приложения представляют собой просто функции контекста, а системные вызовы в этой ОС отсутствуют как явление. Когда приложение заканчивает работу (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 [13].

▍ Статически связанный мини-линукс

Недалеко от «собственной ОС» стоит создание собственного дистрибутива Linux или кастомной сборки Windows (с удалением лишних программ, блокировкой телеметрии и т. д.).

В качестве примера можно посмотреть на Oasis [14] — «минимальный дистрибутив Linux». Это маленькая Linux-система, которая довольно сильно отличается от привычных дистрибутивов Linux, а скорее ближе к BSD.

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

Главная особенность Oasis — полная статическая связанность [15]. Это значит, что всё программное обеспечение в базовой системе статически связано, включая сервер отображения (velox [16]) и веб-браузер (netsurf [17]). Самое значительное преимущество статического связывания заключается в том, что приложение может быть уверено в наличии всех своих библиотек и в том, что все они правильной версии. Это позволяет избежать проблем с зависимостями (DLL Hell [18]), а также позволяет заключить приложение в один исполняемый файл. Полностью самодостаточный бинарник, который легко копировать с компьютера на компьютер — и запускать.

Другие особенности Oasis:

  • Быстрая сборка со 100%-ной воспроизводимостью. Все пакеты собираются с помощью samurai [19], используя манифесты сборки, которые генерируются скриптами Lua [20]. Это даёт множество преимуществ: оптимальное время сборки, предсказуемость и воспроизводимость билдов и уменьшение зависимостей во время сборки.
  • Минимальные требования для загрузки. Загрузка Oasis возможна на любой POSIX-системе с git, lua, curl, утилитой sha256, стандартными утилитами сжатия и кросс-компилятором x86_64-linux-musl.
  • BearSSL как системная TLS и криптобиблиотека. BearSSL [21] на С — это невероятно эффективная, лаконичная и красивая библиотека (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 и т. д.
  • Отсутствие менеджера пакетов. Вместо этого задаётся набор спецификаций [22], какие файлы из каких пакетов следует включить в систему, а система сборки записывает полученное дерево файловой системы в git-репозиторий.
  • Хорошая интеграция с независимыми пакетными системами, такими как pkgsrc [23] и nix [24].
  • Чрезвычайно простая настройка. Самый сложный файл в конфигурации по умолчанию — это скрипт инициализации системы /etc/rc.init [25] из 16 строк.
  • Соответствие стандарту ISO C (в целом). Основной целью является сборка с помощью cproc [26], компилятора C, который гораздо строже относится к стандарту ISO C, чем gcc или clang, и на порядки меньше по размеру. Большинство пакетов Oasis уже успешно собираются с помощью cproc, над остальными идёт работа [27].

Подробнее о процессе установки и администрирования Oasis см. в вики [28] проекта.

▍ Интерфейс ОС на игровом движке

Кроме настоящих ОС, бывают и ненастоящие, то есть фейковые «оболочки», просто создающие видимость операционной системы, но не имеющие ядра. Например, GodotOS [29] выглядит и ведёт себя как настоящая система, не являясь таковой на самом деле. В интернет-демонстрации [30] вы можете просматривать папки, редактировать текстовые файлы, просматривать изображения, играть в игры и многое другое. Всё это в едином консистентном интерфейсе, причём очень красивом.

Как написать свою маленькую ОС - 4
Демо-версия [30] GodotOS, трейлер [31]

GodotOS — скорее игрушка, чем серьёзный проект. Его цель — сделать минималистичный и эстетически приятный рабочий стол. Разработчики креативно использовали игровой 2D- и 3D-движок Godot Engine [32] не совсем по назначению. Оказывается, с его помощью можно создавать UI для десктопных приложений [33], а не только игры.

▍ Ядро xv6

Учебная операционка x86 [34] — повторная реализация оригинальной Unix Version 6 (v6) от Денниса Ритчи и Кена Томпсона. Как известно, на этой фундаментальной исторической ОС основаны многие популярные системы современности, в том числе Linux и macOS (через ответвление BSD из Unix-семейства).

Эта учебная ОС изучается на курсе «Разработка операционных систем» [35] Массачусетского технологического института (лабораторные задания [36] по курсу).

Недавно на Хабре был опубликован цикл статей [37] с переводом книги Расса Кокса и соавторов «xv6: простая, Unix-подобная учебная операционная система» [38].

▍ Браузерные движки

Современные браузеры по своей сложности вплотную приблизились к операционным системам. Собственно, и по функциональности они уже не слишком уступают им, ведь в браузере можно запускать практически любые приложения, написанные на любых языках, и даже на ассемблере (WebAssembly), то есть на языке низкого уровня. Например, «хромбуки» от Google работают на операционной системе ChromeOS, а она по сути представляет собой браузер Chrome, который загружается поверх ядра Linux.

Поэтому создание новых браузерных движков по сложности может быть близко к написанию новых ОС. Из интересных новинок в этой области можно упомянуть Shadow [39] — браузерный движок, почти полностью написанный на JavaScript.

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

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

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

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

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

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

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

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

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

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

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

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

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

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻 [51]

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

Источник [52]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/390429

Ссылки в тексте:

[1] Image: https://habr.com/ru/companies/ruvds/articles/796087/

[2] ядро Linux 0.0.1: https://habr.com/ru/articles/754322/

[3] OSDev.org: https://wiki.osdev.org/Main_Page

[4] «Создание ОС»: https://wiki.osdev.org/Creating_an_Operating_System

[5] «В каком порядке всё делать»: https://wiki.osdev.org/What_Order_Should_I_Make_Things_In%3F#Style_Extremes

[6] Fomos: https://github.com/Ruddle/Fomos

[7] экзоядер: https://en.wikipedia.org/wiki/Exokernel

[8] app_background: https://github.com/Ruddle/Fomos/tree/main/app_background

[9] app_c: https://github.com/Ruddle/Fomos/tree/main/app_c

[10] app_console: https://github.com/Ruddle/Fomos/tree/main/app_console

[11] app_cursor: https://github.com/Ruddle/Fomos/tree/main/app_cursor

[12] app_test: https://github.com/Ruddle/Fomos/tree/main/app_test

[13] статьи Филиппа Оперманна про написание маленькой ОС на Rust: https://os.phil-opp.com/

[14] Oasis: https://github.com/oasislinux/oasis

[15] статическая связанность: https://en.wikipedia.org/wiki/Static_library

[16] velox: https://github.com/michaelforney/velox

[17] netsurf: https://www.netsurf-browser.org/

[18] DLL Hell: https://en.wikipedia.org/wiki/DLL_Hell

[19] samurai: https://github.com/michaelforney/samurai

[20] скриптами Lua: https://github.com/oasislinux/oasis/blob/master/pkg/nasm/gen.lua

[21] BearSSL: https://bearssl.org/

[22] спецификаций: https://github.com/oasislinux/oasis/blob/master/config.def.lua#L12-L15

[23] pkgsrc: https://github.com/oasislinux/oasis/wiki/pkgsrc

[24] nix: https://nixos.org/nix

[25] /etc/rc.init: https://github.com/oasislinux/etc/blob/master/rc.init

[26] cproc: https://sr.ht/~mcf/cproc

[27] идёт работа: https://github.com/oasislinux/oasis/issues/13

[28] вики: https://github.com/oasislinux/oasis/wiki

[29] GodotOS: https://github.com/popcar2/GodotOS

[30] интернет-демонстрации: https://popcar2.itch.io/godotos

[31] трейлер: https://www.youtube.com/watch?v=44LcozXequw

[32] Godot Engine: https://godotengine.org/

[33] создавать UI для десктопных приложений: https://alfredbaudisch.com/blog/gamedev/godot-engine/standalone-applications-made-with-godot-gui-softwares-tools/

[34] Учебная операционка x86: https://github.com/mit-pdos/xv6-riscv

[35] «Разработка операционных систем»: https://pdos.csail.mit.edu/6.828/2023/index.html

[36] лабораторные задания: https://pdos.csail.mit.edu/6.828/2023/xv6.html

[37] цикл статей: https://habr.com/ru/specials/789478/

[38] «xv6: простая, Unix-подобная учебная операционная система»: https://pdos.csail.mit.edu/6.828/2023/xv6/book-riscv-rev3.pdf

[39] Shadow: https://github.com/canadahonk/shadow

[40] демо-страничке: https://shadow.goose.icu/?

[41] Хабр для него слишком сложен: https://shadow.goose.icu/?https://habr.com/

[42] домашнюю страничку SerenityOS: https://serenityos.org/

[43] SerenityOS: https://github.com/SerenityOS/serenity

[44] рассказывали на Хабре: https://habr.com/ru/search/?target_type=posts&order=relevance&q=%5BSerenityOS%5D

[45] была новость: https://habr.com/ru/news/688140/

[46] Ladybird: https://ladybird.dev/

[47] тестам Acid3: http://acid3.acidtests.org/

[48] Servo: https://servo.org/

[49] Flow: https://www.ekioh.com/flow-browser/

[50] операционной системой «Фантом»: https://dz.ru/os-phantom

[51] Telegram-канал со скидками, розыгрышами призов и новостями IT 💻 : https://t.me/ruvds_community

[52] Источник: https://habr.com/ru/companies/ruvds/articles/796087/?utm_source=habrahabr&utm_medium=rss&utm_campaign=796087