?

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
Не зовсім зрозумів кілька пунктів

>>> Потім я визначив кінцеву мету: я хочу мати свою мінімальну самодостатню (self-hosted) систему, тобто таку, на якій працює набір інструментів, достатній для її ж розробки

Навіщо було так ускладнювати тоді систему? Для чого конкретно потрібен менеджер купи, стандартна файлова система, перемикання контекстів, мікроядерна архітектура? Більшість цього можна викинути, якщо поставити за мету "мінімальність та самодостатність".

>>> POSIX ... sh ... libc ... ELF ...
Я згоден, що POSIX це круто, питання - навіщо його дублювати? Дублювання коду - це один з найбільших гріхів у POSIX, до-речі. Ближче до Plan9? Це чудово, але знову ж таки, мета - зробити дубль.

Що я хотів цим сказати. Витрачати час на свою ОС є зміст тільки доти, доки це окупається. Наприклад, отримується досвід низькорівневого програмування. Але коли ти почнеш просто займатись відловленням глюків і багів, розробка перестане приносити і користь, і задоволення. Межа між "вчуся писати свою ОС" і "мучаюся над насправді нікому, у тому числі мені, не потрібною ОС" тонка, проте існує.

Той же Лінус, у нього була ідея зробити "вільне" ядро, якби не це, *нікс так би й залишився прерогативою теоретиків. Він не робив дублювання, він робив переосмислення.

А також, по дрібницям: чому не Лісп, чому без GC, чи буде С основною мовою розробки, а якщо буде, то чому, як щодо експерименту з використанням статично-типізованих функціональних мов для розробки ОС, що не так з Singularity:)?

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

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

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

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

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

Щодо досвіду — то можу сказати, що такої кількості різноманітних, різнопланових, різнокаліберних підзадач я давно не бачив: починаючи від програмування заліза (COM-порт, клавіатура, процесор) до складних структур і алгоритмів (написання власної кучі, віртуальна файлова система, яка також являє собою багатовимірне сплетіння структур, взагалі керування пам’яттю), написання власної реалізації багатьох функцій із libc (printf, str*, vsnprintf, random та інші), плюс архітектурні задачі і загальна організація проекту. Причому 80% завдань мені таки цікаві.

  • 1