Хайде да си напишем своя собствена малка операционна система

Най-четени

Даниел Десподов
Даниел Десподов
Новинар. Увличам се от съвременни технологии, информационна безопасност, спорт, наука и изкуствен интелект.

Голямото започва от малкото. Така например ядрото Linux 0.0.1 се състоеше само от 10 239 реда код, от които 20% бяха коментари. Такъв проект би могъл да бъде осъществен от студент като курсова или дипломна работа, програмирайки вечер на домашния компютър. Линус всъщност го е написал по време на следването си в университета, когато се е завърнал от армията.

Ако един студент е успял да се справи с подобно нещо тогава, защо то да не може да бъде направено отново? Всъщност в интернет има дори специални ресурси за обучение по писане на нови операционни системи. Има и цели общности от ентусиасти, които си помагат взаимно в това трудно начинание.

Така например сайтът OSDev.org предоставя ръководство от типа „стъпка по стъпка“ именно за начинаещи, които искат да напишат своя собствена операционна система буквално от нулата.

Той предоставя учебна информация за всички компоненти на една операционна система: документацията за хардуера и архитектурата, паметта, прекъсванията, таймерите, графичната обработка, звука, входно-изходните устройства, съхранението, PCI, USB, мрежовите карти, безжичните мрежи и т.н.

Ръководството „стъпка по стъпка“ не е шега работа. Там си има раздел „Създаване на операционна система“ и отделна страница „В какъв ред да направим всичко„.

Съвети за начинаещите
  1. Разбира се, [и преди всичко] на екрана трябва се показват низове и цели числа (както десетични, така и шестнадесетични). Това е един от най-лесните начини за отстраняване на грешки. Почти всеки от нас във версия 0.01 е преминал през kprint() или kout.
  2. Извеждането на информация през серийния порт ще спести много време за отстраняване на грешките, като елиминира загубата на информация поради скролването. Ще можете да тествате операционната си система от конзолата, да филтрирате по-интересните съобщения за отстраняване на грешките и да автоматизирате някои тестове.
  3. Много е полезно да разполагате с работеща и надеждна система за обработка на прекъсванията и изключенията, която може да нулира съдържанието на регистрите. И евентуално да намери адреса на грешката.
  4. Планирайте картата на паметта (виртуална и физическа): решете къде да записвате данните.
  5. Почти невъзможно е да се мине без разпределяне на паметта по време на изпълнението (т.е. malloc и free), така че е препоръчително колкото се може по-скоро да реализирате купчина (heap).

В общността на разработчиците на нови операционни системи са създадени някои доста интересни проекти. Така например 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
...

Статично свързан мини Linux

Не далеч от „собствена операционна система“ е създаването на собствена 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 на C е невероятно ефективна, кратка и красива библиотека (20KB компилиран код, заема 25KB в паметта), която не е широко разпространена, но 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.
  • Изключително опростена конфигурация. Най-сложният файл в конфигурацията по подразбиране е 16-редовият скрипт за инициализация на системата /etc/rc.init.
  • Съответствие с ISO C (като цяло). Основната цел е да се изгражда с cproc, компилатор на C, който е много по-стриктен по отношение на стандарта ISO C от gcc или clang и е с порядъци по-малък размер. Повечето от пакетите на Oasis вече са успешно изградени с cproc, а по останалите се работи.

За повече информация относно процеса на инсталиране и администриране на Oasis вижте уикито на проекта.

Интерфейс на операционната система реализиран чрез игрови енджин

В допълнение към истинските операционни системи има и фалшиви, т.е. фалшиви „обвивки“, които просто изглеждат като операционна система, но нямат ядро. Така например GodotOS изглежда и се държи като истинска ОС, без всъщност да е такава. В демонстрационната версия на Internet можете да разглеждате папки, да редактирате текстови файлове, да разглеждате изображения, да играете игри и др. Всичко това в един консистентен интерфейс, при това много красив.

Хайде да си напишем своя собствена малка операционна система

По-горе е даден кадър от демо версията на GodotOS, а по-долу – нейният доста шумен трейлър.

GodotOS е по-скоро играчка, отколкото сериозен проект. Неговата цел е да създаде минималистичен и естетически издържан десктоп. Разработчиците творчески използват Godot Engine 2D и 3D игровия енджин не съвсем по предназначение. Оказва се, че той може да се използва за създаване на потребителски интерфейси за настолни приложения, а не само за игри.

Ядрото xv6

Учебната операционна система xv6 е повторна имплементация на оригиналната версия 6 на Unix (v6) от Денис Ричи и Кен Томпсън. Както навярно знаете, тази фундаментална историческа операционна система е в основата на много популярни системи днес. В това число Linux и macOS (чрез разклонението BSD на фамилията Unix).

Тази учебна ОС се изучава в курса на MIT за разработване на операционни системи (лабораторните задачи в курса).

Браузърните енджини

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

Следователно създаването на нови браузъри може да се доближи по сложност до писането на нови операционни системи. Една от интересните нови разработки в тази област е Shadow – браузърен енджин, написан почти изцяло на JavaScript.

Хайде да си напишем своя собствена малка операционна система
Компонентите на Shadow

На специалната демострационна страница можете да видите как Shadow обработва различните сайтове. Засега тя се справя само с относително лесните за визуализация уеб страници.

Но домашната страница на SerenityOS се обработва без грешки:

Хайде да си напишем своя собствена малка операционна система

Една съвсем бегла проверка показва, че Chrome показва тази страница по съвсем същия начин.

Между другото, SerenityOS (на KDPV) е друг пример за алтернативна операционна система в стил Unix, с графичен интерфейс в стила на 90-те години и функции от различни съвременни операционни системи. Наскоро се появи новина, че разработчиците на SerenityOS са пуснали кросплатформения браузър Ladybird на собствен енджин.

Хайде да си напишем своя собствена малка операционна система
Крос-платформеният браузър Ladybird от създателите на SerenityOS

За разлика от Shadow този браузър поддържа всички съвременни стандарти според тестовете на Acid3.

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

Разработването на собствена операционна система, дори с практически насоки, е дълго и трудно пътуване, но също така е вълнуващо, полезно и възнаграждаващо. Можете да си представите как един начинаещ разработчик първо следва стриктно съветите стъпка по стъпка и плана, а след това все повече се отдалечава от него и взема собствени решения за дизайна на своята операционна система. В крайна сметка той може да се окаже създател на нещо наистина уникално и революционно. Което да намери приложение в автомобилите, съвременните уреди и къде ли още не.

Дори да се окаже, че таз ОС е неприложима на практика, фундаменталната полза от всякакъв вид иновации винаги е безспорна, тъй като именно по този начин човечеството се придвижва напред.


Към оригинала на тази статия има много коментари, предимно, че тя е една много добра стартова точка, за хората, които просто имат необходимите умения и искат да се занимават с това. Има и забележки, че не са споменати KolibriOS и Haiku, които без съмнение са изключително интересни, но са малко извън разглежданата тема.

АбонаментВсичко важно от света на технологиите, директно в пощата ти.

С абонирането приемате нашите Условия и Политика за поверителност. Може да се отпишете с един клик по всяко време.


Коментирайте статията в нашите Форуми. За да научите първи най-важното, харесайте страницата ни във Facebook, и ни последвайте в Google Новини, TikTok, Telegram и Viber или изтеглете приложението на Kaldata.com за Android, iPhone, Huawei, Google Chrome, Microsoft Edge и Opera!

Нови ревюта

Подобни новини