Навесні мої експерименти із програмуванням на асемблері перейшли в нову якість: я перейшов від іграшкового на сьогодні реального режиму 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).
Сирці знаходяться тут: