Разработка

Прошёл месяц с момента последней новости о системе Xameleon и ещё больше с момента публичной сборки. Тебе интересно, на что сейчас похожа система?

Внешне не изменилось почти ничего, разве что поубавилось ошибок. Загрузка стала более стабильна и предсказуема.

От системного вызова CreateProcess пришлось отказаться и вот почему - в третьей сборке этот вызов использовался исключительно для старта драйверов в выделенном адресном пространстве. Т.е. идея безопасных драйверов была основана на этом вызове. Например, первая версия инструментария разработчика включает в себя примеры драйверов, которые могут быть собраны как для работы в адресном пространстве супервизора, так и собственном адресном пространстве. В следующей сборке вызова CreateProcess не будет. Однако, это не значит, что в следующей сборке не будет безопасных драйверов. Читай дальше, и ты поймёшь почему. :)

Для начала расскажу как стартовали драйвера в Хамелеоне до недавнего момента. При старте системы стартовал отдельный поток, который брал информацию о загруженных драйверах, любезно предоставленную загрузчиком kickstart.

Этот поток входил в экспортируемую драйвером функцию _start, которая, в свою очередь, вызывала метод register_driver. Далее, метод register_driver отсылал запрос супервизору, в котором содержались параметры и информация о драйвере. Далее супервизор, в зависимости от параметров, стартовал драйвер при помощи CreateThread (в адресном пространстве супекрвизора) или CreateProcess() в собственном адресном пространстве). Сложно? Но это работает в третьей сборке.

Что же произойдёт в четвёртой? Кроме отмены вызова CreateProcess, изменилась семантика вызова Exec. В случае однопоточного приложения, которых большинство в мире Unix, Exec работает в соответствии со стандартом POSIX. (во всяком случае я стремлюсь к этому), но всё меняется, когда системный вызов Exec инициирует программный поток, который стоит не в голове списка потоков процесса. В этом случае образ процесса, переданный системному вызову Exec, не затирает образ вызывающего процесса, а запускается во вновь созданном адресном пространстве. Вызывающий поток мигрирует в новое адресное пространство и становится лидером процесса.

При этом системный вызов CreateProcess становится ненужным, поскольку предоставляет более высокий уровень абстракции.

Другим нововведением в четвёртой сборке будет поддержка Sticky бита. Эта фича уже реализована и более/менее протестирована. Мы ещё посоревнуемся с Linux, кто быстрее скрипты исполняет.

Хотелось бы прояснить ситуацию с технологией CopyOnWrite. К сожалению в ближайшее время подержки CopyOnWrite не предвидится. Безусловно, технология позволяет получить значительный выигрыш в скорости, когда делится жирный процесс, с большим сегментом .data и разросшимися сегментами .bss и стека. Ну что-ж, некоторые сетевые сервисы и современные shell, которые активно используют fork() - да, они будут проигрывать в скорости. Я это чётко осознаю. Но с другой стороны, это открывает нишу для аналогичных программ, использующих потоки вместо fork(). Ну а те, кто использует fork() по религиозным причинам, хорошо знают приёмы минимизации накладных расходов.

А в это время в пользовательском пространстве идет активная работа над портированием программ. И на этом поле не всё хорошо. Делать загрузочный компакт диск пока рано, хотя для диска уже многое подготовлено.В то же время, уже явно не хватает размера виртуального диска для расширения.демонстрационных возможностей и портирования новых программ...

Скрепя сердце я пошёл на нарушение GPL - прилинковал несколько программ к утилите xambox. На настоящий момент утилиа xambox включает в себя статически связанные утилиты fdisk, mkfs.minix, fsck.minix, gzip и stty. Я понимаю, что формально нарушаю лицензию, но надеюсь что пока Хамелеон не слишком известен, меня избежит обвинение в нарушении лицензии. Ну а когда созреет загрузочный компакт диск, то отвязать эти приложения от xambox не составит труда. Впрочем, не исключен вариант публикации xambox под лицензией GPL. В общем, время расставит всё по местам.

До Ext2 руки пока не дошли. Проверял тестовый образ - монтируется. В файловой системе Minix уничтожен неприятный баг, когда размер читаемого/записывемого файла попадал на Double Indirect блоки. Если не ошибаюсь, данный фикс автоматически распространяется и на файловую систему ext2.

Помимо этого, в четвёртой сборке ожидается более сотни небольших фиксов, большую часть из которых уже и не вспомнить. Много ошибок исправлено в libc.

Чуть не забыл. На демонстрационном диске в четвёртой публичной сборке появится нечто интересное, что будет приятным сюрпризом для части разработчиков. Такие дела.

Алексей Мандрыкин
31 октября 2007 года