Що потрібне для створення операційної системи. Давай напишемо ядро! Створюємо найпростіше робоче ядро ​​операційної системи. Супровід Windows, оновлення

Що потрібно знати, щоб написати операційну систему

Створення операційної системи - одне з найскладніших завдань у програмуванні, оскільки потребує широких та комплексних знань про роботу комп'ютера. Яких саме? Розбираємось нижче.

Що таке ОС

Операційна система (ОС) – це програмне забезпечення, яке працює з комп'ютерним залізомта його ресурсами і є мостом між апаратною та програмною частиною комп'ютера.

Комп'ютери першого покоління не мали операційних систем. Програми на перших ЕОМ включали код для безпосередньої роботи системи, зв'язку з периферійними пристроями і обчислень, для виконання яких ця програма і писалася. Через такий розклад навіть прості за логікою роботи програми були складними у програмній реалізації.

У міру того, як комп'ютери ставали більш різноманітними та складними, писати програми, які працювали і як ОС, і як додаток, стало просто незручно. Тому щоб програми було легше писати, власники комп'ютерів почали розробляти програмне забезпечення. Так з'явилися операційні системи.

ОС надає все необхідне для роботи програм користувача. Їхня поява означала, що тепер програмам не потрібно контролювати весь обсяг робіт комп'ютера (це чудовий приклад інкапсуляції). Тепер програмам потрібно було працювати саме з операційною системою, а система вже сама дбала про ресурси та роботу з периферією (клавіатура, принтер).

Коротко про історію операційних систем

Мова Cі

Як згадувалося вище, для написання ОС є кілька високорівневих мов програмування. Проте найпопулярніший із них - Сі.

Почати вивчати цю мову можна звідси. Цей ресурс ознайомить вас із базовими поняттями та підготує до більш складних завдань.

"Learn C the Hard Way" - назва ще однієї книги. Крім звичної теорії, у ній зібрано багато практичних рішень. Цей підручник розповість про всі аспекти мови.

Або ж можете вибрати одну з цих книг:

  • «The C Programming Language» Кернігхана та Рітчі;
  • «C Programming Absolute Beginner's Guide» Перрі та Міллера.

Розробка ОС

Після освоєння всього необхідного, що стосується інформатики, мови асемблера та Cі, вам варто прочитати хоча б одну чи дві книги про безпосередню розробку ОС. Ось кілька ресурсів для цього:

"Linux From Scratch". Тут розглядається процес складання операційної системи Linux(Підручник перекладено багато мов, у тому числі і російською). Тут, як і в інших підручниках, вам нададуть усі необхідні базові знання. Покладаючись на них, можна спробувати себе у створенні ОС. Щоб зробити програмну частину ОС професійнішою, присутні доповнення до підручника: «

Книга «Операційна система з 0 до 1» опублікована на GitHub і має понад 2 000 зірочок та 100 форків. Як зрозуміло з назви, прочитавши її, ви зможете створити свою власну операційну систему - і, мабуть, мало що у світі програмістів може бути крутішим.

Завдяки цій книзі ви навчитеся наступному:

  • Дізнаєтесь, як створити операційну систему на основі технічної документації заліза. У реальному світі це так і працює, ви не зможете використовувати Google для швидкої відповіді.
  • Зрозумійте, як комп'ютерні компоненти взаємодіють один з одним, від софту до заліза.
  • Навчіться писати код самостійно. Сліпе копіювання коду не є навчання, ви дійсно навчитеся вирішувати проблеми. До речі, сліпе копіювання ще й небезпечне.
  • Опануйте всім звичні інструменти для низькорівневої розробки.
  • Ознайомтеся з мовою асемблера.
  • З'ясуйте, з чого складаються програми та як операційна системазапускає їх. Невеликий огляд цієї теми для допитливих ми давали у .
  • Розберіться, як проводити налагодження програми прямо на залізі з GDB та QEMU.
  • Мова програмування C. Швидко освоїти його можна за .
  • Базові знання Linux. Достатньо вивчити на нашому сайті.
  • Базові знання у фізиці: атоми, електрони, протони, нейтрони, напруга.

Відразу говорю, не закривайте статтю з думками «Млинець, ще один Попов». У нього всього-то злизана Ubuntu, а у мене все з нуля, включаючи ядро ​​та програми. Отже, продовження під катом.

Група ОС: ось.
Спершу я кину вам один скріншот.

Більше їх немає, а тепер докладніше про те, навіщо її пишу.

Був теплий квітневий вечір, четвер. Я ще з дитинства мріяв написати ОС, як раптом подумав: «Я тепер знаю плюси і асм, чого б не втілити мою мрію?». Загугло сайти з цієї тематики і знайшов статтю з Хабра: "Як почати і не кинути писати ОС". Дякуємо її автору за посилання на OSDev Wiki внизу. Я зайшов туди та почав роботу. Там були в одній статті всі дані щодо мінімальної ОС. Я почав збирати крос-gcc та binutils, а потім все переписав звідти. Бачили б ви мою радість, коли я побачив напис «Hello, kernel World!» Я просто зі стільця підстрибнув і зрозумів – я не здамся. Я написав «консоль» (у лапках, я не мав доступу до клавіатури), але потім вирішив написати віконну систему. У результаті вона запрацювала, але доступу до клавіатури я не мав. А потім я вирішив вигадати назву, спираючись на X Window System. Загуглив Y Window System – вона є. У результаті назвав Z Window System 0.1, що входить до OS365 pre-alpha 0.1. І так, її не бачив ніхто, окрім мене самого. Потім зрозумів, як реалізувати підтримку клавіатури. Скрин найпершої версії, коли ще не було нічого, навіть віконної системи:

У ній навіть не рухався курсор тексту, як ви бачите. Потім я написав парочку простих додатківна основі Z. І ось реліз 1.0.0 alpha. Там було багато речей, навіть меню системи. А файловий менеджерта калькулятор просто не працювали.

Мене прямо тероризував друг, якому важливі одні вроди (Мітрофан, соррі). Казав «Запили VBE-режим 1024*768*32, запили, запили! Ну, запили!». Ну, я вже втомився його вислуховувати і все-таки запилив його. Про реалізацію нижче.

Я зробив усе моїм завантажувачем, а саме GRUB"ом. З його допомогою можна задати графічний режим без ускладнень шляхом додавання кількох магічних рядків у заголовок Multiboot.

Set ALIGN, 1<<0 .set MEMINFO, 1<<1 .set GRAPH, 1<<2 .set FLAGS, ALIGN | MEMINFO | GRAPH .set MAGIC, 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) .align 4 .long MAGIC .long FLAGS .long CHECKSUM .long 0, 0, 0, 0, 0 .long 0 # 0 = set graphics mode .long 1024, 768, 32 # Width, height, depth
А потім зі структури інформації Multiboot я беру адресу фреймбуфера та роздільну здатність екрану та пишу туди пікселі. VESA все зробили дуже заморочено – кольори RGB треба вводити у зворотному порядку (не R G B, а B G R). Я кілька днів не розумів - чому пікселі не виводяться? В результаті я зрозумів, що забув змінити значення 16 колірних констант з 0 ... 15 на їх RGB-еквіваленти. У результаті реліз, заодно запилив градієнтне тло. Потім я зробив консоль, 2 додатки та релізнув 1.2. Ах так, мало не забув - завантажити ОС можна на

Читаючи Хабр протягом останніх двох років, я бачив лише кілька спроб розробки ОС (якщо конкретно: від користувачів і (відкладено на невизначений термін) і (не занедбано, але поки більше схоже на опис роботи захищеного режиму x86-сумісних процесорів, що безперечно теж необхідно знати для написання ОС під x86), і опис готової системи (правда не з нуля, хоча в цьому немає нічого поганого, може навіть навпаки)). Мені чомусь думається, що майже всі системні (та й частина прикладних) програмісти хоч раз, але замислювалися про написання власної операційної системи. У зв'язку з чим, 3 ОС від численного співтовариства цього ресурсу видається смішним числом. Мабуть, більшість тих, хто замислюється про власну ОС так нікуди далі ідеї і не йде, мала частина зупиняється після написання завантажувача, деякі пишуть шматки ядра, і тільки безнадійно уперті створюють щось віддалено нагадує ОС (якщо порівнювати з чимось на кшталт Windows/ . Причин для цього можна знайти багато, але головною на мій погляд є те, що люди кидають розробку (деякі навіть не встигнувши почати) через невелику кількість описів самого процесу написання та налагодження ОС, який досить відрізняється від того, що відбувається при розробці прикладного ПЗ.

Цією невеликою заміткою хотілося б показати, що, якщо правильно почати, то у розробці власної ОС немає нічого особливо складного. Під катом знаходиться короткий і загальний посібник до дії з написання ОС з нуля.

Як не требапочинати
Прохання не сприймати наступний текст як явну критику чиїхось статей чи посібників з написання ОС. Просто надто часто в подібних статтях під гучними заголовками акцент робиться на реалізації якоїсь мінімальної заготівлі, а подається як прототип ядра. Насправді слід замислюватися про структуру ядра та взаємодію частин ОС в цілому, а той прототип розглядати як стандартне «Hello, World!»-Додаток у світі прикладного ПЗ. Як невелике виправдання цих зауважень, слід сказати, що нижче є підрозділ Hello, World!, якому в даному випадку приділено рівно стільки уваги скільки потрібно, і не більше.

Не треба писати завантажувач. Розумні люди вигадали Multiboot Specification, реалізували і докладно описали, що це таке і як його використовувати. Не хочу повторюватись, просто скажу, що це працює, полегшує життя, і його треба застосовувати. Специфікацію, до речі, краще прочитати повністю, вона невелика і містить приклади.

Не треба писати ОС повністю на асемблері. Це не так, щоб погано, швидше навпаки - швидкі та маленькі програми завжди будуть у пошані. Просто оскільки ця мова вимагає значно більших зусиль на розробку, то використання асемблера призведе тільки до зменшення ентузіазму і, як наслідок, закидання вихідних ОС в довгий ящик.

Не треба завантажувати кастомний шрифт у відео пам'ять і виводити щось російською. Толку від цього ніякого. Набагато простіше та універсальніше використовувати англійську, а зміну шрифту залишити на потім, завантажуючи його з жорсткого диска через драйвер файлової системи (заодно буде додатковий стимул зробити більше, ніж просто почати).

Підготовка
Спочатку як завжди слід ознайомитися із загальною теорією, щоб мати якісь уявлення про майбутній обсяг робіт. Хорошими джерелами з питання є книги Еге. Таненбаума, які згадувалися в інших статтях про написання ОС на Хабре. Також є статті з описом існуючих систем, і є різні посібники/розсилки/статті/приклади/сайти з ухилом у розробку ОС, посилання на частину яких наведено в кінці статті.

Після початкового лікнепу необхідно визначитися з головними питаннями:

  • цільова архітектура - x86 (real/protected/long mode), PowerPC, ARM, ...
  • архітектура ядра/ОС - моноліт, модульний моноліт, мікроядро, екзоядро, різні гібриди
  • мова та її компілятор - C, C++, ...
  • формат файлу ядра - elf, a.out, coff, binary, ...
  • середовище розробки (так, це теж відіграє не останню роль) - IDE, vim, emacs, ...
Далі слід поглиблювати знання відповідно до обраного та за такими напрямами:
  • відео пам'ять та робота з нею - висновок як доказ роботи необхідний із самого початку
  • HAL (Hardware Abstraction layer) - навіть якщо підтримка кількох апаратних архітектур і не планується грамотне відокремлення самих низькорівневих частин ядра від реалізації таких абстрактних речей як процеси, семафори і так далі зайвим не буде
  • управління пам'яттю - фізичною та віртуальною
  • управління виконанням - процеси та потоки, їх планування
  • керування пристроями - драйвера
  • віртуальні файлові системи - для забезпечення єдиного інтерфейсу до різних ФС
  • API (Application Programming Interface) - як саме програми будуть звертатися до ядра
  • IPC (Interprocess Communication) - рано чи пізно процесам доведеться взаємодіяти
Інструменти
Враховуючи обрані мову та засоби розробки, слід підібрати такий набір утиліт та їх налаштувань, які в майбутньому дозволять шляхом написання скриптів, максимально полегшити та прискорити складання, підготовку образу та запуск віртуальної машини з проектом. Зупинимося трохи детальніше на кожному з цих пунктів:
  • для складання підійдуть будь-які стандартні засоби, як то make, cmake, ... Тут у хід можуть піти скрипти для лінкера і (спеціально написані) утиліти для додавання Multiboot-заголовка, контрольних сум або для будь-яких інших цілей.
  • під підготовкою образу мається на увазі його монтування та копіювання файлів. Відповідно формат файлу образу треба підбирати так, щоб його підтримувала як утиліта монтування/копіювання, так і віртуальна машина. Звичайно, ніхто не забороняє робити дії з цього пункту або як фінальну частину складання, або як підготовку до запуску емулятора. Все залежить від конкретних засобів та вибраних варіантів їх використання.
  • запуск віртуальної машини праці не представляє, але не забути спочатку відмонтувати образ (відмонтування у цьому пункті, оскільки до запуску віртуальної машини реального сенсу цієї операції немає). Також не зайвим буде скрипт для запуску емулятора в режимі налагодження (якщо такий є).
Якщо всі попередні кроки виконані, слід написати мінімальну програму, яка завантажуватиметься як ядро ​​і виводитиме щось на екран. У разі виявлення незручностей або недоліків вибраних коштів, необхідно їх (недоліки) усунути, ну або, у гіршому випадку, прийняти як даність.

На цьому кроці необхідно перевірити якнайбільше можливостей засобів розробки, які планується використовувати у майбутньому. Наприклад, завантаження модулів у GRUB або використання у віртуальній машині фізичного диска/розділу/флешки замість образу.

Після того, як цей етап пройшов успішно, починається справжня розробка.

Забезпечення run-time підтримки
Оскільки пропонується писати мовами високого рівня, слід подбати про забезпечення підтримки частини засобів мови, які зазвичай реалізуються авторами пакета компілятора. Наприклад для C++, сюди відносяться:
  • функція для динамічного виділення блоку даних на стеку
  • робота з heap
  • функція копіювання блоку даних (memcpy)
  • функція-точка входу до програми
  • виклики конструкторів та деструкторів глобальних об'єктів
  • ряд функцій для роботи з винятками
  • стаб для нереалізованих чисто-віртуальних функцій
При написанні Hello, World! відсутність цих функцій може ніяк не дати себе знати, але в міру додавання коду, лінкер почне скаржитися на незадоволені залежності.

Звичайно, відразу слід згадати і про стандартну бібліотеку. Повна реалізація не є необхідною, але основне підмножина функцій реалізувати варто. Тоді написання коду буде значно звичніше і швидше.

Налагодження
Не дивіться, що про налагодження йдеться ближче до кінця статті. Насправді це дуже серйозне і складне питання у створенні ОС, оскільки звичайні кошти тут непридатні (за деяким винятком).

Можна порадити таке:

  • само собою зрозуміле, налагоджувальний висновок
  • assert з негайним виходом до «наладчика» (див. наступний пункт)
  • деяка подоба консольного відладчика
  • перевірити чи не дозволяє емулятор підключати відладчик, таблиці символів або ще щось
Без вбудованого в ядро ​​відладчика пошук помилок має цілком реальний шанс перетворитися на кошмар. Так що від його написання на деякому етапі розробки просто нікуди не подітися. А якщо це неминуче, краще почати його писати заздалегідь і таким чином значно полегшити собі розробку і заощадити досить багато часу. Важливо зуміти реалізувати відладчик незалежним від ядра чином, щоб налагодження мінімальним чином впливало нормальну роботу системи. Ось кілька типів команд, які можуть бути корисними:
  • частина стандартних операцій налагодження: точки зупинки, стек викликів, виведення значень, друк дампа, ...
  • команди виведення різної корисної інформації, на кшталт черги виконання планувальника або різної статистики (вона не так марно, як може здатися спочатку)
  • команди перевірки несуперечності стану різних структур: списків вільної/зайнятої пам'яті, heap або черги повідомлень
Розвиток
Далі необхідно написати та налагодити основні елементи ОС, які в даний момент мають забезпечити її стабільну роботу, а в майбутньому – легку розширюваність та гнучкість. Крім менеджерів пам'яті/процесів/(чогось ще) дуже важливим є інтерфейс драйверів і файлових систем. До їхнього проектування слід підходити з особливою ретельністю, враховуючи всю різноманітність типів пристроїв/ФС. З часом їх звичайно можна буде поміняти, але це дуже болючий і схильний до помилок процес (а налагодження ядра - заняття не з легень), тому просто запам'ятайте - мінімум десять разів подумайте над цими інтерфейсами перш ніж візьметеся за їх реалізацію.
Подібність SDK
У міру розвитку проекту в ньому мають додаватися нові драйвери та програми. Швидше за все вже на другому драйвері (можливо певного типу)/програмі будуть помітні деякі загальні риси (структура каталогів, файли керування збіркою, специфікація залежностей між модулями, код у main або в обробниках системних запитів, що повторюється, наприклад, якщо драйвера самі перевіряють їх сумісність з пристроєм )). Якщо так і є, це ознака необхідності розробки шаблонів для різного типу програм під вашу ОС.

Необхідності документації, що описує процес написання тієї чи іншої типу програми, немає. Але зробити заготовку із типових елементів варто. Це не тільки спростить додавання програм (що можна робити і копіюванням існуючих програм з їх подальшою зміною, але це потребує більше часу), але також дозволить легше їх оновлювати при змінах в інтерфейсах, форматах або ще. Зрозуміло, що таких змін в ідеалі не повинно бути, але оскільки розробка ОС - річ нетипова, тобто чимало місць для потенційно неправильних рішень. А ось розуміння помилковості прийнятих рішень, як завжди, прийде через деякий час після їх впровадження.

Подальші дії
Якщо коротко, то: читати про операційні системи (і насамперед саме про їх пристрій), розвивати свою систему (темпи насправді не важливі, головне - не припиняти зовсім і повертатися до проекту час від часу з новими силами та ідеями) та природно виправляти у ній помилки (для знаходження яких треба іноді запускати систему і «грати» з нею). Згодом процес розробки ставатиме все легше і легше, помилки будуть зустрічатися рідше, а ви будете зараховані до списку «безнадійно упертих», тих небагатьох, які незважаючи на деяку абсурдність ідеї розробки власної ОС, все ж таки зробили це.

Автор Vulf gamerпоставив питання у розділі Інші мови та технології

Як створити свою ОС? і отримав найкращу відповідь

Відповідь від Олександр Багров[гуру]
Ідея похвальна.
Насамперед потрібно знати систему команд машини, на яку маєш намір писати ОС.
Система команд знаходить своє пряме відображення у мові асемблера.
Тому в першу чергу потрібно придумати свою мову асемблера і написати для нього програму (ассемблер), що транслює буквенно-цифрову символіку в машинний
код.
Якщо цікаво, то можна подивитися, якими вимогами повинна мати нова (ідеальна) ОС.
Деякі такі риси перераховані тут:
.ru/D_OS/OS-PolyM.html#IdealOS
Необхідно вивчати матеріали сайтів-розробників мікропроцесорів. Наприклад, Intel та AMD.
Можливо, тобі буде корисний відеокурс лекцій з ОС, який представлений тут:
.ru/D_OS/OS_General.html
PS: Не слухай песимістів. Виходь з ідеології півня, що ганяється за куркою:
"Не наздожену, хоч розігріюся."
Джерело: Сайт "Використовуй ПК правильно!"

Відповідь від 2 відповіді[гуру]

Вітання! Ось добірка тем із відповідями на Ваше запитання: Як створити свою ОС?

Відповідь від Вадим Хпрламов[Новичок]
Звичайно) Тут же одні гейтси сидять) На майкрософті спитай)



Відповідь від Ірина стародубцева[Новичок]
візьми всі ОС і в одну запихай


Відповідь від Олександр Тунцов[гуру]
Ознайомся з ОС Linux, навчися програмування і в дорогу


Відповідь від ~In Flames~[гуру]
Програмування вчити на найвищому рівні, зібрати цілий натовп таких самих комп'ютерних геніїв і тоді вже можна робити.


Відповідь від Rasul Magomedov[гуру]
Почни зі створення ненудних шпалер


Відповідь від Капітан Гугл[гуру]
Про "10 років на вивчення основ" - не слухай, Торвальдс першу версію Лінукса написав у 22 роки, а комп'ютер у нього у 12 з'явився. Як ти розумієш, він не лише основи вивчав.
Почни з вивчення вже існуючого - з одного боку, "Сучасні операційні системи" Танненбаума, з іншого боку - збери Linux From Scratch, з третього - вчи Асемблер, C, C ++. За все про все - можна в 3-4 роки вкластися. Після цього можеш розпочати розробку своєї системи... якщо ще захочеш.


Відповідь від Йоаня Семенов[гуру]
знаєш, як робив Гейтс? спробуй так само, кажуть прибутково виходить.
коли його покарали батьки, він знічев'я став стрибати попою на клаві, потім продав назвавши те що вийшло "windows"
а якщо реально то напиши спочатку "Hello World" в С++ і відразу зрозумієш що ідея параноїдальна


Відповідь від Kostafey[гуру]
А навіщо? Чим принципово не влаштовують існуючі? Невже немає жодної, що хоч частково задовольняє вашим вимогам до ОС? Може, варто краще приєднатися до команди розробників? Толку в 100500 разів більше буде.
І потім, ви закинете цю ідею ще на 0, (0) 1% її реалізації.


Відповідь від Євген Ломега[гуру]
Е. Таненбаум "Операційні системи: розробка та реалізація"
хай щастить
PS На жаль, як це робив Біл Гейтс, у тебе навряд чи вийде. Мама крута банкірка, у тебе?


Відповідь від Krab Bark[гуру]
Написати найпростішу ОС самому можна, але вона ніяк не зможе конкурувати з ОС на кшталт Windows, MAC OS або Linux, над якими щонайменше десяток років працювали сотні чи тисячі програмістів. Крім того, ОС – лише фундамент. Потрібно, щоб розробники обладнання писали для цієї ОС свої драйвери, розробники прикладних програм писали для неї редактори, плеєри, браузери, ігри, риса в ступі... А без цього ОС залишиться не потрібним фундаментом для будинку, який ніхто не будуватиме.


Відповідь від Вадим Стаханов[активний]
Краще б на філолога пішов би вчитися. А потім би кричав "Вільна каса!"


Відповідь від = Serge =[гуру]
Ура! Нарешті 58 питання на сайті про створення "своєї" ОС))
Ось питання про "написати свою ОС" - їх лише 34))
Читай....92 питання*10 відповідей = приблизно 920 відповідей))
Заодно можливо зрозумієш що означають "ненудні шпалери")).


Відповідь від Irreproducible[гуру]
ще один Денис Попов із черговим BolgenOS"ом?


Відповідь від Іван татарчук[Новичок]
запусти блокнот скачай компілятор жабаскрипт і почни стрибати попою по клавіатурі
через 60хв компілюй і все
твоя оска готова


Відповідь від Овечка Міла[Новичок]
ОС? Яка саме? ОС-орижинал честер (оригінальний персонаж (у перекладі))
Вона потрібна доячи зображення себе мультиках або фільмах.
1. Придумай якого саме мультика/фільму ти хочеш ОС
2. Розглянемо стиль мультика/фільму
3. Ким буде твій персонаж (фея, поні, маг, робот тощо)
4. Опиши подумки його, потім на папері
5. Придумай дизайн
6. Придумай ім'я та біо
7. Намалюй персонажа!
8. Тепер за справу з Пеїнт Туд Саї

2022 wisemotors.ru. Як це працює. Залізо. Майнінг. Криптовалюта.