1 Востаннє редагувалося Fox (06.05.2018 16:32:05)

Тема: Питання про написання "ОС"

Хотiв написати iграшкову ОС яку можна встановити на флешку (GRUB завантажувач).
По ходу написання виникло декiлька питань.
1) Чи можливо спалити щось в ПК через кривий запит до порту I/O ?
2) Як можна зробити нормальний memory manager ?
Спробував погуглити i почитати про нього, але нiц не зрозумiв.
Можливо щось готове вже придумали для таких цiлей ?

PS: Iснують книжки на укр. мовi про написання ос чи щось таке ?

2 Востаннє редагувалося koala (06.05.2018 16:56:59)

Re: Питання про написання "ОС"

vtorgashov написав:

1) Чи можливо спалити щось в ПК через кривий запит до порту I/O ?

Зазвичай лише якщо спеціально зробити такий набір запитів. Пристрої зараз досить розумні, щоб не дозволити вам зробити це випадково.

vtorgashov написав:

2) Як можна зробити нормальний memory manager ?

Прочитати книжку на цю тему. Основне питання - ви збираєтеся чужі програми виконувати в себе? Якщо ні, то вся пам'ять ваша, розподіляйте, як хочете. Якщо хочете, щоб код на C/C++ працював - доведеться писати свій компілятор із STL. Якщо хочете, щоб програми, скомпільовані під інші ОС працювали - ви попали :)

vtorgashov написав:

Можливо щось готове вже придумали для таких цiлей ?

Звісно, зветься Linux.

vtorgashov написав:

Iснують книжки на укр. мовi про написання ос чи щось таке ?

Підписуюся на питання. Танненбаума ніби не перекладали, на жаль.

3

Re: Питання про написання "ОС"

koala написав:

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

Хочу щоб код на С++ працював.
Хоча вiн працювати може (g++ ворк), але без видiлення пам'ятi.

4

Re: Питання про написання "ОС"

сама нижча прослойка між залізом і ОС буде на асемблері, без асемблера нема чого робити
2. Написати як процес, або він може бути "залізно спроектований", часто в мануалі пишуть як працює MMU, але часто він є наприклад в ARM серії А і R

5

Re: Питання про написання "ОС"

reverse2500 написав:

сама нижча прослойка між залізом і ОС буде на асемблері, без асемблера нема чого робити
2. Написати як процес, або він може бути "залізно спроектований", часто в мануалі пишуть як працює MMU, але часто він є наприклад в ARM серії А і R

Ну керувати розподiлом пам'ятi i без нього ?

6

Re: Питання про написання "ОС"

Танненбаума ви вже прочитали? Це для сучасного розробника ОС обов'язкова література.
За великим рахунком, вам треба написати всього дві функції - malloc і free (вони ж new та delete). Але диявол, як завжди, в деталях.

7

Re: Питання про написання "ОС"

vtorgashov написав:

Ну керувати розподiлом пам'ятi i без нього ?

ну звісно, що не можна впяти, то можна зпрограмувати, програмісти іноді пишуть і свої аналоги free, malloc.

8

Re: Питання про написання "ОС"

https://wiki.osdev.org/Memory_management

Подякували: leofun011

9

Re: Питання про написання "ОС"

Читав вже... Але не зрозумiло як воно може отримати вмiсть пам'ятi, якщо вона разкидана не по порядку.
Як я зрозумiв:
------Вiльно 1 ------ ||||||||Зайнято 1 |||||||| ||||||||Зайнято 2|||||||| ------Вiльно 2------ ||||||||Зайнято 3 ||||||||
Потрiбно в malloc знайти такi вiльнi дiлянки i в них записувати.
Але як зробити це....
malloc поверне "Вiльно 1", а треба щоб при виходi з нього наступний елемент масиву був на дiлянцi "Вiльно 2".
Але як таке зробити ?
Теж саме з читанням пам'ятi.
Чи я не так зрозумiв ?

10 Востаннє редагувалося koala (07.05.2018 16:42:14)

Re: Питання про написання "ОС"

Вільно/зайнято - позначайте, як вам зручно. Поки що вся пам'ять - ваша, як один масив. Можете тримати десь бітову мапу вільного місця. Можете до кожного виділеного блоку дописувати на початку його характеристики (довжину і id процеса, якому виділено, наприклад). Можете ще якось... коротше, це ваша система і ваші правила.
Зазвичай використовується купа.

Подякували: leofun011

11

Re: Питання про написання "ОС"

vtorgashov написав:

Читав вже... Але не зрозумiло як воно може отримати вмiсть пам'ятi, якщо вона разкидана не по порядку.
Як я зрозумiв:
------Вiльно 1 ------ ||||||||Зайнято 1 |||||||| ||||||||Зайнято 2|||||||| ------Вiльно 2------ ||||||||Зайнято 3 ||||||||
Потрiбно в malloc знайти такi вiльнi дiлянки i в них записувати.
Але як зробити це....
malloc поверне "Вiльно 1", а треба щоб при виходi з нього наступний елемент масиву був на дiлянцi "Вiльно 2".
Але як таке зробити ?
Теж саме з читанням пам'ятi.
Чи я не так зрозумiв ?

А оце почитали? https://wiki.osdev.org/Memory_Allocation

Подякували: leofun011

12

Re: Питання про написання "ОС"

Чи можливо, на данному етапі розвитку науки, розробити ос, яка була б сумісною з будь-яким пристроєм? Мала б у собі якийсь штучний інтелект, здатність до "навчання",при завантаженні самостійно аналізувала технічні параметри пристрою для визначення конфігурації можливих налаштувань?

13

Re: Питання про написання "ОС"

ос, яка сама б писала драйвери? ліл

14

Re: Питання про написання "ОС"

htoznasho написав:

Чи можливо, на данному етапі розвитку науки, розробити ос, яка була б сумісною з будь-яким пристроєм? Мала б у собі якийсь штучний інтелект, здатність до "навчання",при завантаженні самостійно аналізувала технічні параметри пристрою для визначення конфігурації можливих налаштувань?

Можливо, можливо. Але для навчання тих штучних інтелектів треба багато спроб стати сумісною з пристроями, і організувати щось подібне дуже важко, враховуючи кількість пристроїв

15

Re: Питання про написання "ОС"

htoznasho написав:

Чи можливо, на данному етапі розвитку науки, розробити ос, яка була б сумісною з будь-яким пристроєм? Мала б у собі якийсь штучний інтелект, здатність до "навчання",при завантаженні самостійно аналізувала технічні параметри пристрою для визначення конфігурації можливих налаштувань?

Тут є одна велика біда — поцесори різні. Команди, коди команд. Тобто ця ОС просто не завжди зможе стартувати, бо мають виконатися конкретні команди її початку, а вони можуть не підійти до конкретного процесора.

Менші біди — апаратура. Навіть при однакових процесорних ядрах є різна апаратура, наприклад, контролер пам'яті. Який потрібно проініціалізувати для того, щоб взагалі ОС кудись потрапила.
На те є різні біоси та ROM code в SoC, вони це ініціалізують, і лізуть беруть вже початковий завантажувач від ОС (той же GRUB, він вже завантажувач останнього етапу, перед ним декілька могло бути в ланцюжку), записують його в проініціалізовану пам'ять і запускають.
Але ж — див вище — завантажувач повинен бути правильного коду. І повинен знати про пристрій, з якого завантажують, хай навіть той пристрій проініціалізований BIOS/ROM code.
То що — мати на носії десятки завантажувачів ОС під різні архітектури і навчити ROM-код знаходити потрібний по якихось індексах?
А потім вся купа драйверів іншої апаратури та іншого коду ОС — це все там мати так само у тих десятикратних кількостях?

Ну спосіб є, і він якраз не з даного етапу, а з попередніх.
Open Firmware від Sun — у них у одних було декілька різних архітектур процесорів, то на периферійних картах в ROM окрім деякого опису пристрою у стандартизованому форматі (попередник device tree в Linux, а функції ядра для роботи з ним досі мабть префікс of) був початковий код роботи — ініціалізація плати, те-се — написаний на Forth, ну тобто відповідний байт-код.
Тобто десь на рівні мабуть ROM-завантажувачів материнських плат був інтерпретатор Forth, який вичитував з усіх карт їхні ініціалізатори, виконував, складав у дерево пристроїв, знаходив серед них контролер диска і з вантажив систему.
От вона вже була на рідному коді від того процесора, що стоїть, її ж таку інсталювали. І вона вже чи в собі шукала потрібний драйвер, чи перекомпільовувала байт-код форта в ріжний код процесора — не знаю, глибоко ні ліз читати.

Тобто рішення — байт код (Forth, Java, ... ?) драйверів в усій периферії.
Сам завантажувач від ОС і початок ОС на тому ж байт-коді.
Інтерпретатор в ROM материнської плати.
В інтерпретаторі інформація про архітектуру процесора, частково намертво в коді (він же в ROM плати, він щось знає), частково потім розбирає на ходу (нюанси x86<->x86-64, наприклад).
Ну а нормальні JIT-компілятори що байт-коду з периферійних плат, що самої ОС — на носії в тілі ОС, і множити на десятки архітектур треба лише ці компілятори. Тоді є шанс запхати все на носій якогось притомного обсягу.

Тільки от завантажуватиметься воно повільніше, та й працюватиме теж не так швидко.
Тому простіше інсталювати на конкретний комп'ютер збірку ОС під конкретну архітектуру центрального процесора, покриваючи варіації пристроїв інформацією з BIOS/ROM code (device tree/acpi/etc)

Подякували: FakiNyan, leofun012

16

Re: Питання про написання "ОС"

htoznasho написав:

Чи можливо, на данному етапі розвитку науки, розробити ос, яка була б сумісною з будь-яким пристроєм? Мала б у собі якийсь штучний інтелект, здатність до "навчання",при завантаженні самостійно аналізувала технічні параметри пристрою для визначення конфігурації можливих налаштувань?

У мене є калькулятор. Звичайний, кнопковий, непрограмований. Жодних USB/COM/чого завгодно. Він, вочевидь, є пристроєм. Якщо підкажете, як саме на нього запхати ваш "штучний інтелект", щоб той "самостійно щось там аналізував", то, може, і поговоримо, а так - виглядає як очевидно абсурдне питання.

Подякували: leofun01, ch0r_t2

17

Re: Питання про написання "ОС"

Все ніби можна. Але корпорації. Згадаємо як доказали що амд робило так що не бачило відеокарти від конкурентів

18

Re: Питання про написання "ОС"

reverse2500 написав:

Згадаємо як доказали що амд робило так що не бачило відеокарти від конкурентів

Я щось пропустив. Можна якісь лінки?

19

Re: Питання про написання "ОС"

Fox написав:
koala написав:

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

Хочу щоб код на С++ працював.
Хоча вiн працювати може (g++ ворк), але без видiлення пам'ятi.

Краще писати ОС на фасм асемблері.

20

Re: Питання про написання "ОС"

OstapSi4karuk написав:

Краще писати ОС на фасм асемблері.

Не надасте посилання на ваш гітхаб? Ну, ви ж явно кілька варіантів спробували, перш ніж радити?