Я компилирую пользовательское ядро под Ubuntu, и я столкнулся с проблемой, что ядро не похоже, где искать прошивку. В Ubuntu 8.04 прошивка привязана к версии ядра так же, как и модули драйверов. Например, ядро 2.6.24-24-generic хранит свои модули ядра в:
/lib/modules/2.6.24-24-generic
и его прошивку в:
/lib/firmware/2.6.24-24-generic
Когда я компилирую ядро Ubuntu 2.6.24-24 в соответствии с " Альтернативный метод сборки: старомодный путь Debian" Я получить соответствующий каталог модулей и все мои устройства, кроме тех, которые требуют прошивки, таких как моя беспроводная карта Intel (модуль ipw2200).
Журнал ядра показывает, например, что когда ipw2200 пытается загрузить прошивку, подсистема ядра, контролирующая загрузку прошивки, не может ее найти:
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
errno-base.h определяет это как:
#define ENOENT 2 /* No such file or directory */
(Функция, возвращающая ENOENT, помещает перед ним минус.)
Я попытался создать символическую ссылку в /lib/firmware, где мое имя ядра указывало на общий каталог 2.6.24-24, однако это привело к той же ошибке. Эта прошивка не является GPL, предоставляемая Intel и упакованная Ubuntu. Я не верю, что у него есть реальная привязка к определенной версии ядра. cmp
показывает, что версии в разных каталогах идентичны.
Итак, как ядро знает, где искать прошивку?
Обновление
Я нашел это решение для конкретной проблемы, с которой я столкнулся, однако он больше не работает, поскольку Ubuntu удалил /etc/hotplug.d
и больше не сохраняет свою прошивку в /usr/lib/hotplug/firmware
.
Update2
Несколько исследований получили еще несколько ответов. До версии 92 udev
программа firmware_helper
была способом загрузки прошивки. Начиная с udev
93, эта программа была заменена на script с именем firmware.sh, обеспечивающим идентичную функциональность, насколько я могу судить. Оба этих файла указывают путь прошивки к /lib/firmware
. Ubuntu по-прежнему использует двоичный файл /lib/udev/firmware_helper
.
Имя файла прошивки передается firmware_helper
в переменную среды $FIRMWARE
, которая объединена с контуром /lib/firmware
и используется для загрузки прошивки.
Фактический запрос на загрузку прошивки сделан драйвером (ipw2200 в моем случае) с помощью системного вызова:
request_firmware(..., "ipw2200-bss.fw", ...);
Теперь, где-то между драйвером, вызывающим request_firmware
и firmware_helper
, смотрящим на переменную среды $FIRMWARE
, имя пакета ядра добавляется к имени прошивки.
Так кто это делает?