?

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

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

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

  • 1