Каково содержание этой монолитной кодовой базы?
Я понимаю поддержку архитектуры процессора, безопасность и виртуализацию, но не могу представить, что это более 600 000 строк или около того.
Какие исторические и текущие причины драйверы включены в базу кода ядра?
Включают ли эти 15 с лишним миллионов строк каждый драйвер для каждого компонента оборудования? Если это так, то возникает вопрос, почему драйверы встроены в ядро, а не в отдельные пакеты, которые автоматически определяются и устанавливаются из идентификаторов оборудования?
Является ли размер базы кода проблемой для устройств с ограниченным хранилищем или памятью?
Кажется, это увеличило бы размер ядра для устройств ARM с ограниченным пространством, если бы все это было встроено. Много ли строк отбраковано препроцессором? Назовите меня сумасшедшим, но я не могу представить себе машину, требующую столько логики для запуска, как я понимаю, роли ядра.
Есть ли доказательства того, что размер будет проблемой через 50 с лишним лет из-за его, казалось бы, постоянно растущей природы?
Включение драйверов означает, что оно будет расти по мере изготовления оборудования.
РЕДАКТИРОВАТЬ : Для тех, кто думает, что это природа ядер, после некоторых исследований я понял, что это не всегда. Ядро не обязательно должно быть таким большим, так как микроядро Карнеги-Меллона было приведено в качестве примера «обычно под 10000 строк кода».
источник
make menuconfig
чтобы увидеть, сколько кода можно включить / отключить до сборки.Ответы:
Драйверы поддерживаются в ядре, поэтому, когда изменение ядра требует глобального поиска и замены (или поиска и изменения вручную) для всех пользователей функции, это делает человек, который вносит изменения. Обновление вашего драйвера людьми, вносящими изменения в API, является очень хорошим преимуществом, вместо того, чтобы делать это самостоятельно, когда он не компилируется в более новом ядре.
Альтернатива (то, что происходит с драйверами, поддерживаемыми вне дерева), заключается в том, что патч должен быть повторно синхронизирован его сопровождающими, чтобы не отставать от любых изменений.
Быстрый поиск вызвал дискуссию по поводу разработки драйверов внутри дерева и вне дерева .
Поддержание Linux в основном заключается в сохранении всего в основном репо. Сборка небольших урезанных ядер поддерживается параметрами конфигурации для управления
#ifdef
s. Таким образом, вы можете создавать крошечные урезанные ядра, которые компилируют только крошечную часть кода во всем репо.Широкое использование Linux во встраиваемых системах привело к лучшей поддержке отказа от вещей, чем Linux имел годы назад, когда дерево исходных текстов ядра было меньше. Супер-минимальное ядро 4.0, вероятно, меньше супер-минимального ядра 2.4.0.
источник
Согласно Cloc, работающему против 3.13, Linux содержит около 12 миллионов строк кода.
lsmod | wc
на моем ноутбуке Debian показано 158 модулей, загруженных во время выполнения, поэтому динамическая загрузка модулей - это популярный способ поддержки аппаратного обеспечения.Надежная система конфигурации (например
make menuconfig
) используется для выбора кода для компиляции (и, более того, какой код не компилировать). Встраиваемые системы определяют свои собственные.config
файлы только с помощью аппаратной поддержки, которая им нужна (включая поддержку аппаратного обеспечения, встроенного в ядро или в виде загружаемых модулей).источник
Для любого любопытного, вот разбивка строки счета для зеркала GitHub:
drivers
вносит большой вклад в количество строк.источник
grep -Pir "\x66\x75\x63\x6b" /usr/src/linux/ | wc -l
./documentation
имеет более 500 000 строк кода? ....что?Пока что ответы кажутся «да, кода много», и никто не решает вопрос с наиболее логичным ответом: 15M +? И ЧТО? Какое отношение имеет 15 миллионов строк исходного кода к цене рыбы? Что делает это таким невообразимым?
Linux явно многое делает. Гораздо больше, чем что-либо еще ... Но некоторые ваши очки показывают, что вы не уважаете то, что происходит, когда он построен и используется.
Не все скомпилировано. Система сборки Kernel позволяет быстро определять конфигурации, которые выбирают наборы исходного кода. Некоторые экспериментальные, некоторые старые, некоторые просто не нужны для каждой системы. Посмотрите на
/boot/config-$(uname -r)
(на Ubuntu),make menuconfig
и вы увидите, сколько исключено.И это настольный дистрибутив с переменной целью. Конфигурация для встроенной системы будет включать только то, что ей нужно.
Не все встроено. В моей конфигурации большинство функций ядра построены в виде модулей:
Чтобы было ясно, они все могли быть встроены ... Так же, как они могли быть распечатаны и превращены в гигантский бумажный бутерброд. Это просто не имело бы смысла, если бы вы не выполняли пользовательскую сборку для отдельной аппаратной работы (в этом случае вы бы уже сократили количество этих элементов).
Модули загружаются динамически. Даже когда в системе есть тысячи доступных ей модулей, система позволит вам загружать именно то, что вам нужно. Сравните результаты:
Почти ничего не загружается.
Микроядра не одно и то же. Всего 10 секунд просмотра ведущего изображения на странице Википедии, на которую вы ссылаетесь , покажут, что они созданы совершенно по-другому.
Драйверы Linux являются внутренними (в основном динамически загружаемыми модулями), а не пользовательским пространством, и файловые системы также являются внутренними. Почему это хуже, чем использование внешних драйверов? Почему микро лучше для вычислений общего назначения?
Комментарии снова подчеркивают, что вы не получаете это. Если вы хотите развернуть Linux на дискретном оборудовании (например, в аэрокосмическом пространстве, TiVo, планшете и т. Д.), Вы конфигурируете его для сборки только необходимых вам драйверов . Вы можете сделать то же самое на вашем рабочем столе с
make localmodconfig
. В итоге вы получите крошечную сборку ядра с нулевой гибкостью.Для таких дистрибутивов, как Ubuntu, допустим один пакет ядра размером 40 МБ. Нет, откажитесь от этого, на самом деле, это предпочтительнее сценария массового архивирования и загрузки, в котором хранится более 4000 плавающих модулей в виде пакетов. Он использует меньше дискового пространства для них, легче упаковывать во время компиляции, легче хранить и лучше для своих пользователей (у которых есть система, которая просто работает).
Будущее тоже не проблема. Скорость процессора, плотность диска / цены и пропускная способность кажутся намного быстрее, чем рост ядра. Пакет Kernel 200 МБ за 10 лет не станет концом для мира.
Это также не улица с односторонним движением. Код выгоняется, если он не поддерживается.
источник
пузырьковый график tinyconfig svg (скрипка)
сценарий оболочки для создания json из сборки ядра, используйте с http://bl.ocks.org/mbostock/4063269
Редактировать : оказалось,
unifdef
имеют некоторые ограничения (-I
игнорируется и-include
не поддерживается, последний используется для включения сгенерированного заголовка конфигурации), в данный момент использованиеcat
не сильно меняется:Сценарий и процедура обновлены.
Помимо драйверов, архива и т. Д., Много условного кода скомпилировано или нет в зависимости от выбранной конфигурации, код не обязательно в динамически загружаемых модулях, но встроен в ядро.
Итак, скачал исходники linux-4.1.6 , выбрал tinyconfig , он не включает модули, и я, честно говоря, не знаю, что он включает или что пользователь может делать с ним во время выполнения, в любом случае, сконфигурируйте ядро:
построил ядро
В процессе сборки ядра оставляются скрытые файлы, вызываемые
*.cmd
из командной строки, которые также используются для создания.o
файлов, для обработки этих файлов и извлечения копии цели и зависимостейscript.sh
ниже и использования ее с find :это создает копию для каждой зависимости цели с
.o
именем.o.c
.c код
.h заголовки (санированные)
источник
Компромиссы между монолитными ядрами обсуждались между Тананбаумом и Торвальдсом публично с самого начала. Если вам не нужно переходить в пользовательское пространство для всего, тогда интерфейс к ядру может быть проще. Если ядро монолитное, то оно может быть более оптимизировано (и более грязно!) Внутри.
У нас были модули как компромисс в течение достаточно долгого времени. И это продолжается с такими вещами, как DPDK (удаление большей сетевой функциональности из ядра). Чем больше ядер добавлено, тем важнее избежать блокировки; так что больше вещей переместится в пользовательское пространство и ядро сократится.
Обратите внимание, что монолитные ядра - не единственное решение. На некоторых архитектурах граница ядро / пользовательское пространство не дороже, чем любой другой вызов функции, что делает микроядра привлекательными.
источник