Преимущество модуля ядра, скомпилированного внутри ядра?

Ответы:

7

По-разному. Если у вас небольшой объем памяти, использование модулей может улучшить резюме, так как они не перезагружаются каждый раз (я обнаружил, что это существенно на 2 ГБ ОЗУ, но не на 4 ГБ на традиционных жестких дисках). Это особенно актуально, когда из-за некоторой ошибки в модуле батареи (независимо от того, был ли он встроен или как модуль), для запуска потребовалось очень много времени (несколько минут). Даже без ошибок в gentoo мне удалось сократить время (по сообщениям systemd-analysis) с 33 до 18 с, просто перейдя от статически скомпилированного ядра к модулям - «удивительно», запуск ядра изменился с 9 с до 1,5 с.

Кроме того, когда вы не знаете, какое оборудование вы собираетесь использовать, модули явно полезны.

PS. Вы можете скомпилировать даже жизненно важные драйверы в виде модулей, если вы включите их в initrd. Например, дистрибутив будет включать файловую систему /, драйверы жесткого диска и т. Д. В initrd при установке.

Мацей Печотка
источник
Вы не против прочитать этот ответ снова, внимательно. Я бы сказал, но я не знаю, что вы хотели сказать на месте, например ... на традиционных жестких дисках .
Чепанг
Я имел в виду магнитные (у меня нет опыта работы с SSD).
Мацей Печотка
Я пытался сделать это более читабельным. Можете ли вы проверить, если я не облажался.
Чепанг
Благодарю. Я только что закончил экзаменационную сессию, поэтому у меня не было времени посмотреть на нее.
Мацей Печотка
7

Насколько я знаю, разницы в скорости нет.

Я думаю, что вы получите несколько килобайт памяти ядра, поскольку гранулярность выделений составляет одну страницу, поэтому в типичной архитектуре каждый модуль тратит в среднем около 2 КБ (½ страницы) на каждый потенциальный модуль. Даже на встроенных системах это вряд ли существенно. Вы также получаете немного дискового пространства, так как модули могут быть сжаты в одном ядре; это может быть более актуально во встроенных системах с небольшим объемом памяти.

Если вы можете вообще отказаться от модулей, вы сэкономите немного памяти ядра (нет необходимости в загрузчике модулей), места на диске (нет необходимости в утилитах для модулей) и сложности системы (нет необходимости включать загрузку модулей в качестве функции в вашем дистрибутиве). ). Эти пункты довольно привлекательны в некоторых встроенных проектах, где аппаратное обеспечение не расширяемо.

Жиль "ТАК - перестань быть злым"
источник
Доступ к символу в модуле немного медленнее (имеет место косвенное обращение). Но дополнительная гибкость (можно загружать / выгружать по мере необходимости, не нужно собирать ядро ​​с ручной настройкой для конкретного используемого оборудования, ...) того стоит (если вы не создаете для очень ограниченной среды, которая не никогда не изменится)
vonbrand
4

Пара потенциальных выгод. Производительность является спорным. Вы бы избежали некоторых накладных расходов, связанных с динамическим загрузчиком, но я сомневаюсь, что это большая проблема, если вы не зависите от планировщика реального времени.

Если вы используете большие страницы в своей системе, то, возможно, создавая более крупный статический образ ядра, вы сможете более эффективно использовать кэш дескрипторов страниц. Некоторые системы «помещают» ядро ​​так, чтобы оно плотно упаковывалось в одну область памяти, что может уменьшить некоторую задержку из-за незначительных и, возможно, серьезных сбоев страниц.

С архитектурной точки зрения может оказаться целесообразным предоставить One Big Image, утверждая, что меньшее количество независимых модулей проще в обслуживании и потеря гибкости не важна. Многие такого рода рассуждения решаются на вопросы стиля и практики.

MFE
источник
2

Иногда это необходимо. Если вы скомпилируете какой-нибудь жизненно важный драйвер (например, драйвер SCSI) в качестве модуля, ваша система не загрузится.

Другим отличным кандидатом для того, чтобы не компилировать как модуль, является тип файловой системы корневого раздела. Если ядро ​​не понимает, как ext3читать, /lib/modules/как оно будет загружать из него модули?

Подумайте об этом так: чтобы использовать модули, ядро ​​должно знать достаточно о вашей системе, чтобы читать и загружать модули ядра. Используйте это и методом проб и ошибок :-)

nc3b
источник
Я думаю о некотором улучшении производительности? Есть ли вообще?
phunehehe
1
В прошлом люди делали все возможное, чтобы создать наименьшее возможное ядро ​​только с тем, что требуется . Сегодня это в значительной степени изменилось. Фактически, всякий раз, когда вы впервые загружаете модуль, вы испытываете небольшое снижение производительности. Это не значит, что вы должны скомпилировать все в ядре :-) Смотрите это: articleinput.com/e/a/title/…
nc3b
для не жизненно важных драйверов или функциональности есть ли какая-то выгода? например, если я просто хочу использовать терминал и кучу сетевых утилит без другой необходимости или функциональности. есть ли польза, если я просто скомпилирую все необходимые модуль и драйвер в ядре без загружаемого модуля?
2010 г.
3
Bull. Система будет нормально загружаться с драйвером SCSI в качестве модуля в initrd. Вот для чего они.
wzzrd
Да ... при условии, что модуль находится в initrd, который ядро ​​может понять ...
Dagelf
2

Я статически компилирую каждый драйвер для встроенного оборудования внутри ядра. Исключением может быть аппаратное обеспечение, которое не является постоянным (например, USB-оборудование).

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

Stephane
источник