Kompiluję niestandardowe jądro pod Ubuntu i mam problem, że moje jądro nie wie, gdzie szukać oprogramowania układowego. Pod Ubuntu 8.04 oprogramowanie układowe jest powiązane z wersją jądra w taki sam sposób jak moduły sterowników. Dla przykładu, jądro 2.6.24-24-generic przechowuje swoje moduły jądra w:W jaki sposób Linux Kernel wie, gdzie szukać oprogramowania układowego sterownika?
/lib/modules/2.6.24-24-generic
i jego firmware w:
/lib/firmware/2.6.24-24-generic
Kiedy skompilować jądro 2.6.24-24-generic Ubuntu według "Alternate Build Method: The Old-Fashioned Debian Way" Dostaję odpowiedni katalog modułów i wszystkie moje urządzenia działają oprócz tych, które wymagają oprogramowania układowego, takiego jak moja bezprzewodowa karta Intel (moduł ipw2200).
dziennik jądra pokazuje na przykład, że gdy ipw2200 próbuje załadować firmware podsystem jądra kontrolowania ładowanie firmware jest w stanie go zlokalizować:
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
errno-base.h definiuje to jako:
#define ENOENT 2 /* No such file or directory */
(funkcja powrocie ENOENT stawia minusa przed nim).
próbowałem utworzenie dowiązania symbolicznego w katalogu/lib/firmware gdzie nazwa moim kernelem wskazał do katalogu ogólnego w wersji 2.6.24-24, ale spowodowało to ten sam błąd. To oprogramowanie jest niezgodne z GPL, dostarczane przez firmę Intel i pakowane przez Ubuntu. Nie wierzę, że ma rzeczywisty związek z konkretną wersją jądra. cmp
pokazuje, że wersje w różnych katalogach są identyczne.
Skąd jądro wie, gdzie szukać oprogramowania układowego?
Aktualizacja
znalazłem this solution do dokładnego problemu Mam jednak to już nie działa jak Ubuntu wyeliminował /etc/hotplug.d
i nie przechowuje swoją firmware w /usr/lib/hotplug/firmware
.
Update2
Niektóre dalszych badań okazało się jeszcze kilka odpowiedzi. Do wersji 92 z udev
, program firmware_helper
był sposobem załadowania oprogramowania układowego. Począwszy od wersji udev
93 ten program został zastąpiony skryptem o nazwie firmware.sh, który zapewnia identyczną funkcjonalność, o ile wiem. Obie te metody kodują ścieżkę oprogramowania układowego do /lib/firmware
. Wydaje się, że Ubuntu wciąż używa pliku binarnego /lib/udev/firmware_helper
.
Nazwa pliku oprogramowania układowego jest przekazywana do firmware_helper
w zmiennej środowiskowej $FIRMWARE
, która jest łączona ze ścieżką /lib/firmware
i używana do ładowania oprogramowania układowego.
Rzeczywisty wniosek załadować firmware jest wykonany przez kierowcę (ipw2200 w moim przypadku) poprzez wywołanie systemowe:
request_firmware(..., "ipw2200-bss.fw", ...);
Teraz gdzieś pomiędzy kierowcą wywołującego request_firmware
i firmware_helper
patrząc na zmiennej $FIRMWARE
środowiska , nazwa pakietu jądra jest automatycznie dodawana do nazwy oprogramowania układowego.
Więc kto to robi?
Czy ktoś mógłby dodać komentarz wyjaśniający, dlaczego decyduje się zamknąć to pytanie? Byłbym wdzięczny za opinie. –
To jest głosowanie na zamknięcie, ponieważ "należy do serverfault.com". Ponieważ nie chodzi tu o programowanie, a raczej o administrację, jest to zgodne z deklaracjami misji obu stron. – ephemient
Dzięki za opinię. Rozważałem to pytanie programistyczne, ponieważ napotkano problem podczas próby zbudowania niestandardowego jądra. Chciałbym wiedzieć, dlaczego konkretnie ktoś by pomyślał o tym, nie odnosząc się do programowania, chociaż myślę, że mam kilka dobrych domysłów dlaczego. –