Тостер под управлением NetBSD
Ты можешь сказать, что в сравнении с тем, где работает Linux, 58 архитектур — это ерунда, и будешь прав. Но только отчасти. Дело в том, что между терминами «переносимость» и «количество поддерживаемых платформ» существуют коренные различия. Linux доступен для такого большого числа платформ не потому, что он так прекрасно и просто портируется, а из-за банальной популярности. Любой, кто плотно работал с кодом ядра Linux, знает, что, несмотря на то что в ядре, в общем-то, соблюдается разделение на платформенно зависимый/независимый код, зачастую оно нарушается, а само ядро представляет собой большой запутанный комок кода. Код NetBSD, напротив, четко структурирован и имеет несколько слоев абстракций от железа.
Драйверы в NetBSD полностью абстрагированы от платформы, включая
такие ее компоненты, как шина ввода-вывода, DMA, прерывания или что угодно еще. Драйвер работает исключительно с абстрактными сущностями, что позволяет использовать его на любой архитектуре вообще без модификаций. Более того, один и тот же драйвер можно брать для разных версий периферии, подключаемой к разным шинам. На странице NetBSD приводится пример драйвера fxp для сетевых карт Intel. Один и тот же драйвер используется для архитектур alpha, arc, cats, cobalt, i386, macppc, prep, и он же — для PCIи Cardbus-версий сетевой карты без всякого дополнительного кода. На самом деле ядро NetBSD настолько грамотно разделено на независимые слои, что даже процесс портирования на новую архитектуру здесь значительно проще, чем в других ОС. Портирование NetBSD на x86_64 в свое время заняло всего
месяц, тогда как у разработчиков Linux на это ушло полгода. А теперь представь, насколько разные по количеству участников команды это делали!
RUMP-ЯДРО
Одним из побочных эффектов разделения кода NetBSD на независимые слои стала концепция так называемых rump-ядер. Технология позволяет запустить сильно урезанный и облегченный вариант ядра NetBSD в пространстве пользователя как обычный процесс или даже собрать его в форме разделяемой библиотеки. При этом в таком ядре могут работать почти любые драйверы или подсистемы (стек TCP/IP, например), запросы которых к оборудованию будут происходить с помощью специальных гипервызовов к основному ядру.
Если не вдаваться в детали, это означает, что, по сути, из NetBSD можно сделать нечто вроде микроядерной ОС, в которой драйверы, файловые системы и ключевые компоненты ядра будут работать в обособленных процессах (список компонентов, которые можно вынести в пространство пользователя). В случае с драйверами такой подход позволяет получить защиту от ошибок (ошибка в драйвере, работающем в отдельном процессе, не приведет к падению всей ОС целиком), а в случае с другими компонентами — возможность использовать измененные варианты подсистем ядра для разных приложений.
Например, rump позволяет собрать Firefox, подключив к нему сетевой стек NetBSD как библиотеку. Смысл здесь в том, что сетевой стек можно затюнинговать исключительно для Firefox, тогда как другое приложение может быть собрано с другим вариантом сетевого стека, пригодным именно для него. Более того, интерфейс гипервызовов, через который rump-ядра «общаются» с основным ядром и железом, можно использовать напрямую, что позволяет создавать по-настоящему быстрые приложения с минимальным оверхедом на обработку запроса к оборудованию.
Ну а самое интересное, что rump-ядра можно использовать не только
в NetBSD, но и в Linux, Android, NetBSD, FreeBSD, OpenBSD, DragonFly BSD, Solaris и даже Windows. Все, что нужно, — это специальный модуль ядра (драйвер), который будет обрабатывать гипервызовы. В любой из этих систем можно использовать rump-ядро, то есть запускать драйверы, сетевой стек, файловые системы или даже брандмауэр NetBSD как обычные процессы или включать эти компоненты в другие приложения в форме разделяемой библиотеки.
LUA В ЯДРЕ
Lua — очень простой скриптовый язык, предназначенный для встраивания в другие приложения. Особенной популярностью Lua пользуется у разработчиков игр (ярчайший пример — World of Warcraft), с его помощью они скриптуют сцены из игры, дают возможность создавать моды или вообще реализуют большую часть игры (как в случае с Grim Fandango, например). Поддержку Lua можно найти и во многих настольных приложениях (Adobe Lightroom, Apache, Snort, Wireshark), где этот язык служит для расширения функциональности и/или написания плагинов.
В NetBSD язык Lua можно использовать для скриптинга ядра. В теории возможность скриптинга позволяет тонко настраивать ядро под себя, реализовывать различные алгоритмы энергосбережения, обработки пакетов или даже быстро прототипировать драйверы. Вот, например, код простейшего алгоритма энергосбережения, который можно быстро затюнинговать под свои нужды без необходимости пересобирать ядро:
Комментарии 4
Евгений Зобнин
Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр. Мар 16, 2016