====== Система инициализации на Си ====== ===== Концепция ===== Хотелось бы достигнуть наибольшей возможной скорости инициализации системы. Для этого можно было бы включить **в один код на Си** зпуск демонов, монтирование файловых систем, инициализацию драйверов и т.п. Проблемы обычного sysvinit: - Повсеместно использует интерпретатор Bash. Убедиться в том, что Bash сравним по скорости с домкратом от ЗИЛа можно с помощью [[http://orv.org.ru/kosc_wiki/doku.php?id=%D0%BE_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%8B%D1%85_shell_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2|нашей статьи]]. Bash плох тем, что: - Делает много обращений к диску - Выполняет монтирование дисков с парсингом аргументов и тучей системных вызовов, когда можно обойтись одним системным вызовом для каждого монтируемого диска Система должна быть хоть немного **интерактивной**, хотя **на первых этапах** об этом **можно не задумываться**. Очень бы хотелось сохранить интерактив, подобный тому, что предоставляет sysvinit, так как он весьма прост в реализации и понятен системным администраторам. Им не придётся переучиваться. Если пользователь захочет изменить набор запускаемых сервисов или порядок их запуска, исходный файл на Си будет перегенерирован и перекомпилирован. Это напоминает принцип работы загрузчика LILO, для которого надо запускать процедуру перегенерации MBR и PBR при любых вмешательствах в конфигурационные файлы или изменениях ядра. Запуск каждого демона можно описать в отдельном текстовом файле. При добавлении сервиса в автозапуск, подобно тому, как это делается в sysvinit, система инициализации должна отследить изменения в каталогах /etc/rc*.d/ (условно) и сконкатенировать код запуска демона в код init'a. Сразу после этого файл компилируется со всеми возможными оптимизациями (компилировать такой init как-то иначе смысла нет), такими как march=native, O3 и flto. Библиотечную функцию execve можно попробовать реализовать на ассемблече с помощью удобных макросов. * Наш init сохраняет систему уровней запуска (runlevels) uf4n ===== Текущий этап разработки =====