?

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
О! Я теж таким займався колись! Але до захищеного режиму так і не дібрався. У мене був примітивний шелл (2 команди: echo і reboot), напівробоча реалізація перемикання контексту (дуже неефективна, через перше переривання) і чернетки менеджера пам’яті. Завантажувалось все власним завантажувачем і було написане частково на асемблері, частково на Паскалі.
Це було як раз за часів випускного класу школи і першого курсу в універі. Тоді у мене з’явився перший серйозний (після "Спектрума") комп. Ні про GRUB, ні про Linux я на той час нічого не знав.
Джерельні коди так і валяються десь у архівах. Підозрюю що навіть не повні.

Та да, менеджер кучі на асемблері — аццкій ад, я теж цього не подолав) А на Сі також не мед, але уже цілком реально.
Я теж до цього писав DOS-оподібну оську на nasm із власним завантажувачем (так, той ще хардкор, вліпити читання файлової системи у 512 байт), правда, перемикання контекстів там не робив, закинув на користь цієї) А також я так і не довів до пуття тетрис на асмі, який обіцяв поміститись у кілобайт машинного коду, жаль.

Не зовсім зрозумів кілька пунктів

>>> Потім я визначив кінцеву мету: я хочу мати свою мінімальну самодостатню (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% завдань мені таки цікаві.

Тепер зрозуміло Під «мінімальністю та самодостатністю» я мав на увазі POSIX-мінімальність

Я під мінімальністю сприйняв саме мінімальність і майже зробив інтепретатор Форта (у тому числі і на AVR архітектуру), який уособлює мінімальну самодостатню ОС.

>>>або за додавання таких величезної складності речей, як managed-середовище і віртуальна машина із своїм компілятором.
Та я просто питався =) Мені цікава ідея "надійних" і "стабільних" систем, ось і питався. "кому шо болить, той про те і говорить" =)

Ну да, перепрошую за дезінформацію :)

Щодо Форт-ОС — так, це прекрасний зразок завершеного хака, але з додаванням хоч трохи серйозних речей (підтримка файлової системи, драйвери, підтримка захищеного режиму, запуск чужих програм) вона навряд чи залишиться такою ж мінімальною, а мені хотілось би відчути, що моя система достатньо розвинута, щоб сприймати чужий код. Так, я міг би написати на асемблері систему для real mode із вбудованим fasm-ом, але це не так цікаво)

«Надійні і стабільні» системи — чесно кажучи, не знаю, навіщо потрібні більш стабільні системи, ніж є зараз. Серверні лінукси і фряхи і так крутяться роками без перезавантажень, а їхні декстопні варіанти падають в основному через бажні драйвери та юзерспейс (хоч, може, в покращенні їх стабільності і є сенс, але це уже не зовсім ядро). Щодо «надійних» — то що мається на увазі?

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

А, формальна верифікація — то таки хороша річ, підтримую.

Єдине, що треба ще дожити до часів, коли маркетинг не буде переважати здоровий глузд :)

Роками без перезавантажень - це скоріше мало кому потрібні і некритичні сервери. Бо за рік приходить стільки security fix'ів що без перезавантаження ну просто ніяк. Зараз, правда, є kexec, але це просто таке "софтове" перезавантаження, щоб не завантажувати BIOS. Підозрюю що розробникам цієї "фічі" просто обридло чекати поки завантажуються новомодні (U)EFI на сучасних серверах.

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

  • 1