Ответы:
По-разному. Если у вас небольшой объем памяти, использование модулей может улучшить резюме, так как они не перезагружаются каждый раз (я обнаружил, что это существенно на 2 ГБ ОЗУ, но не на 4 ГБ на традиционных жестких дисках). Это особенно актуально, когда из-за некоторой ошибки в модуле батареи (независимо от того, был ли он встроен или как модуль), для запуска потребовалось очень много времени (несколько минут). Даже без ошибок в gentoo мне удалось сократить время (по сообщениям systemd-analysis
) с 33 до 18 с, просто перейдя от статически скомпилированного ядра к модулям - «удивительно», запуск ядра изменился с 9 с до 1,5 с.
Кроме того, когда вы не знаете, какое оборудование вы собираетесь использовать, модули явно полезны.
PS. Вы можете скомпилировать даже жизненно важные драйверы в виде модулей, если вы включите их в initrd. Например, дистрибутив будет включать файловую систему /, драйверы жесткого диска и т. Д. В initrd при установке.
Насколько я знаю, разницы в скорости нет.
Я думаю, что вы получите несколько килобайт памяти ядра, поскольку гранулярность выделений составляет одну страницу, поэтому в типичной архитектуре каждый модуль тратит в среднем около 2 КБ (½ страницы) на каждый потенциальный модуль. Даже на встроенных системах это вряд ли существенно. Вы также получаете немного дискового пространства, так как модули могут быть сжаты в одном ядре; это может быть более актуально во встроенных системах с небольшим объемом памяти.
Если вы можете вообще отказаться от модулей, вы сэкономите немного памяти ядра (нет необходимости в загрузчике модулей), места на диске (нет необходимости в утилитах для модулей) и сложности системы (нет необходимости включать загрузку модулей в качестве функции в вашем дистрибутиве). ). Эти пункты довольно привлекательны в некоторых встроенных проектах, где аппаратное обеспечение не расширяемо.
Пара потенциальных выгод. Производительность является спорным. Вы бы избежали некоторых накладных расходов, связанных с динамическим загрузчиком, но я сомневаюсь, что это большая проблема, если вы не зависите от планировщика реального времени.
Если вы используете большие страницы в своей системе, то, возможно, создавая более крупный статический образ ядра, вы сможете более эффективно использовать кэш дескрипторов страниц. Некоторые системы «помещают» ядро так, чтобы оно плотно упаковывалось в одну область памяти, что может уменьшить некоторую задержку из-за незначительных и, возможно, серьезных сбоев страниц.
С архитектурной точки зрения может оказаться целесообразным предоставить One Big Image, утверждая, что меньшее количество независимых модулей проще в обслуживании и потеря гибкости не важна. Многие такого рода рассуждения решаются на вопросы стиля и практики.
Иногда это необходимо. Если вы скомпилируете какой-нибудь жизненно важный драйвер (например, драйвер SCSI) в качестве модуля, ваша система не загрузится.
Другим отличным кандидатом для того, чтобы не компилировать как модуль, является тип файловой системы корневого раздела. Если ядро не понимает, как ext3
читать, /lib/modules/
как оно будет загружать из него модули?
Подумайте об этом так: чтобы использовать модули, ядро должно знать достаточно о вашей системе, чтобы читать и загружать модули ядра. Используйте это и методом проб и ошибок :-)
Я статически компилирую каждый драйвер для встроенного оборудования внутри ядра. Исключением может быть аппаратное обеспечение, которое не является постоянным (например, USB-оборудование).
Поскольку моя аппаратная конфигурация вряд ли изменится в ближайшее время, я не беспокоюсь о модулях.