?

Log in

No account? Create an account
Previous Entry —>другу Next Entry
COSEC: піврічний звіт
shadow
dmytrish

Навесні мої експерименти із програмуванням на асемблері перейшли в нову якість: я перейшов від іграшкового на сьогодні реального режиму x86 у середовище захищеного режиму, який спершу здавався страшним та негостинним: купа заплутаного та незрозумілого асемблерного коду, що потребується для використання усіх можливостей повного 32-бітного режиму, спочатку була досить високим порогом входження, але моєї впертості вистачало для поступового просування: запустились перші шматки коду на Сі і я побачив древнє програмістське привітання "Hello world" у чорній глибині безОСного емулятора.

Свого часу я був досить сильно вражений лінуксом і по-дитячому хотів розібрати його на частини і подивитись, як же це працює — таким чином, написання свого ядра було приємним і корисним завданням для мене. Мої орієнтири досить прості: загальна чистота і простота коду та архітектури, хоча б мінімальна POSIX-сумісність та деякі експерименти, натхнені Plan 9 from Bell Labs: мережна прозорість, уніфікація ресурсів за допомогою файлових систем і подібне. Також я схиляюсь до мікроядерної архітектури, поки це не переускладнює речі.

Досить довго я не мав визначеної мети для цього проекту. Я коливався між просто навчальною системою та роздутими сподіваннями на нову, оригінальну архітектуру, засновану на мовних можливостях (language-based capabilities), що в моїх уявленнях підозріло нагадували MS Singularity, при тому, що досвіду написання віртуальних машин і навіть просто коду під них у мене мізерно мало (і навіть цей проект — мій перший проект такого розміру на чистому Сі). Потім я визначив кінцеву мету: я хочу мати свою мінімальну самодостатню (self-hosted) систему, тобто таку, на якій працює набір інструментів, достатній для її ж розробки; щось схоже на Linux 0.01, але все-таки стрункіший (враховуючи досвід двадцяти років, що пройшли з того часу).

Зараз система у зародковому стані, хоч експерименти тепер стосуються набагато складніших речей, ніж раніше:

  • найпростіше перемикання контекстів завдань (яке, втім, ні для чого серйозного поки що не використовується);

  • основні можливості роботи в просторі користувача (наприклад, поки що єдиний системний виклик, CSC_DBG_PRINT, який виводить рядок у консоль);

  • чернетка ієрархічної файлової системи, VFS;

  • моя реалізація купи, хіпу через алгоритм першого достатнього шматка;

  • реалізація деяких функцій із libc (libc - це системно-специфічна річ, для своєї системи мені потрібен свій варіант);

  • кілька драйверів: клавіатури, таймерів, послідовного (serial) порта вводу-виводу, зондування PCI-шини;


Система досі являє собою єдиний бінарник із найпростішим вбудованим шелом (я був би до жуті радий бачити у себе sh, але для цього ще треба перенести libc і реалізувати позіксову файлову систему) і вантажиться GRUB'ом відповідно до multiboot-стандарту.

Плани на майбутнє:

  • додати віртуальну пам’ять та сторінковий захист пам’яті, окремі адресні простори для процесів та ядра;

  • реалізувати VFS та кілька найпопулярніших файлових систем (FAT/ext2/iso9660);
    довести юзерспейс до пристойного вигляду: повноцінні posix-процеси із хоча б найпостішими засобами міжпроцесної взаємодії;

  • портувати Newlib (портабельна і компактна реалізація libc) та написати системно-залежний код для запуску bash/gcc/vim;

  • завантажувач ELF-формату;

  • погратись із підтримкою різних архітектур заліза, в першу чергу додати ARM;

  • мінімальний мережний стек (arp, icmp/ip, tcp/udp, http/ftp/telnet).

Сирці знаходяться тут:





  • 1
Почнемо з самого початку, тобто з компілятора. Які є варіанти? Писати свій? Для усіх серйозних мов це чи не складніша задача, ніж написання самої ОС, я вірю людям, які заявляють, що це спроба погнатись за двома зайцями, тому поки що я вирішив зосередитись на одній задачі — на ОС, щоб знати, як це робиться. Тепер щодо чужих компіляторів. Що необхідно для функціонування хоча б найпростішого компілятора? Те саме динамічне виділення пам’яті, без якого неможливий розбір програми на синтаксичне дерево, і функціонування файлової системи, без якої неможливо буде читати вихідний код і записати результати. Які мови підходять для цієї задачі? Я думаю, що Сі тут найкращий, це справді мова, створена для системного програмування.
Багатозадачність та мікроядерність — тому, що мені це цікаво, і я не уявляю свою систему однозадачною. Мікроядерність — це те, чим я, можливо, займусь пізніше. Під «мінімальністю та самодостатністю» я мав на увазі POSIX-мінімальність.

POSIX – це стандарт, його неможливо здублювати, його можливо тільки реалізувати. Мої улюблені інструменти в юзерспейсі — це саме позікс-сумісні, і я хочу мати змогу запускати Vim/sh на своїй системі, я не хочу винаходити велосипедів на цьому шарі. Таким чином, «дублювання» Позікса насправді рятує мене від зайвого дублювання реального коду в майбутньому (я не хочу поки що писати свої версії шелів і текстових редакторів, це також величезна задача, яка в мої плани зараз не входить!).

Витрачання часу насправді не таке вже й сильне, те, що є, писалось на вихідних і вечорами. Результат поки що для мене повністю окупається, я хочу реалізовувати для себе принципи роботи серйозних ОС, і я це роблю, хоч іноді це таки і підходить до межі з «мучусь над нікому не потрібною ОС».
Я взагалі не вірю, що без якісно нового заліза комусь може бути потрібна нова ОС. Без неосвоєного на той час i386 навряд чи комусь знадобився б Лінукс. «Хороше — ворог кращого», навіть прекрасна Plan 9 не змогла переконати когось у тому, що є смисл витрачати на неї більше сил, ніж як на дослідницьку систему. Таким чином ми бачимо, що архітектура і краса системи не визначає її потрібності. Тому я уже давно змирився з тим, що на практиці вона навряд чи буде корисна комусь, крім мене.
Як можна переосмислювати щось, не знаючи, що саме? Я хочу відчути зсередини, що не так у сучасних ОС і що треба змінювати найкраще, а не створювати броунівський рух у рендомному напрямку.

Чому не Лісп, чому без GС, чому не Хаскель/ML — тому, що я не хочу братись за освоєння цих галузей одночасно із освоєнням принципів ОС, я думав про ці експерименти, але не вважаю, що зараз у мене може вийти щось справді оригінальне. Я практично не знаю C#/Java, а освоювати ще й їх відтворення паралельно було б також занадто накладно (крім того, я вважаю, що на рівні готовності моєї системи ці речі і не потрібні).
Singularity гарно виглядає у статті на Вікіпедії, але коли я почитав більш докладну статтю від авторів, я відчув відразу, від неї за кілометр віє духом bondage & discipline, таких жорстких і надуманих самообмежень я ще не бачив (в порівнянні із елегантними юніксівськими пісочницями процесів, де кожна задача вважає, що вона одна займає пам’ять і процесор, це коряве решето, яке тектиме з усіх дірок).

Автор комента, визначся — або ти за мінімальність і простоту, або за додавання таких величезної складності речей, як managed-середовище і віртуальна машина із своїм компілятором. Для мене «простота» поки що виглядає так, як це є.

  • 1