Я собираю собственное ядро под 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-generic, однако это привело к той же ошибке. Эта прошивка не-GPL, предоставлена Intel и упакована Ubuntu. Я не верю, что это имеет какое-либо отношение к конкретной версии ядра. cmp
показывает, что версии в разных каталогах идентичны.
Так как ядро узнает, где искать прошивку?
Обновление
Я нашел это решение для точной проблемы, с которой я столкнулся, однако оно больше не работает, поскольку Ubuntu устранило /etc/hotplug.d
и больше не сохраняет свою прошивку в /usr/lib/hotplug/firmware
.
Update2
Еще одно исследование выявило еще несколько ответов. До версии 92 udev
программа firmware_helper
была способом загрузки прошивки. Начиная с udev
93, эта программа была заменена на скрипт с именем 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
, имя пакета ядра добавляется к имени прошивки.
Так, кто это делает?