Jak zbudować pojedynczy moduł jądra w drzewie?

37

Linux-source -... ma moduł, który jest wyłączony w config /boot/config-3.4-trunk-686-pae, więc nie jest częścią linux-image -... (To jest na Debianie, ale rozwiązanie powinno być takie samo dla Ubuntu lub?), np

# CONFIG_CAN_PEAK_USB is not set

Jak skompilować tylko ten moduł jądra, aby można go było używać z rozproszonym jądrem?

Odpowiedni pakiet linux-source -... jest już zainstalowany, nieskompresowany i połączony z / usr / src / linux. /boot/config-3.4-trunk-686-pae jest kopiowany do /usr/src/linux/.config i modyfikowany za pomocą

CONFIG_CAN_PEAK_USB=m

Z

make
make modules

możliwe jest skompilowanie jądra i wszystkich modułów. Ale jak skompilować tylko ten konkretny pojedynczy moduł?

(Uwaga: również potrzeby jądra zostać skompilowane wcześniej, w przeciwnym razie pojawia się następujący błąd: no symbol version for module_layout)

mab
źródło
proszę zamknąć jako duplikat 14627. odpowiedź użytkownika „Radu C” odpowiada na pytanie.
mab
Próbowałeś depmod -awcześniej modbrobe?
Nadia
1
rozważ również następujący artykuł: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Odpowiedzi:

38

Miałem ten sam problem. Zakładam, że musisz nie tylko skopiować .config, ale także Module.symvers

moje kroki w celu skompilowania modułu ft1000 (z systemem Debian Wheeze 7.1.0; jądro 3.2.0-4-686-pae):

aptitude install linux-headers-3.2.0-4-686-pae
aptitude install linux-source-3.2
cd /usr/src/
tar xjf linux-source-3.2.tar.bz2
cd /usr/src/linux-source-3.2
cp ../linux-headers-3.2.0-4-686-pae/Module.symvers .
make oldconfig # it copies .config to ./
vi .config # enable ft1000 module: CONFIG_FT1000=m
make prepare # setup FT1000 as module
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
cp drivers/staging/ft1000/ft1000-usb/ft1000.ko /lib/modules/3.2.0-4-686-pae/kernel
/drivers/staging/
depmod
modprobe ft1000
Maros Michalik
źródło
4
Nie jestem pewien, czy SUBDIRS jest nadal poprawny. Zostało to dla mnie zignorowane. Po przeczytaniu kernel.org/doc/Documentation/kbuild/modules.txt spróbowałem użyć tego, make M=/path/to/moduleco wydawało się działać.
harmic
Próbuję zmodyfikować inny moduł (po prostu dodajeam identyfikator USB do istniejącego modułu) podczas jego kompilacji nie otrzymuję żadnych błędów, ale po wstawieniu otrzymuję nieprawidłowy format modułu, dlaczego ?!
Zibri
14

Z poziomu katalogu źródłowego najwyższego poziomu po prostu podaj ścieżkę do nazwy modułu lub katalogu modułu, np .:

make drivers/net/can/usb/peak_usb/

lub dla prostszego przykładu (sterownik Intel e1000 Ethernet):

make drivers/net/ethernet/intel/e1000/e1000.ko
ish
źródło
Po prostu robię: make drivers/net/can/usb/peak_usb/pcan_usb.kozbudowałem tylko pcan_usb.o. Robi make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.koto kompiluje, ale insmod narzeka Error: could not insert module drivers/net/can/usb/peak_usb/peak_usb.ko: Invalid module format. dmesg:peak_usb: no symbol version for module_layout
mab
Czy używasz tego konkretnego jądra i czy już raz go skompilowałeś? Spróbuj modproberównież z .
ish
Używam spakowanego jądra. Kompilacja kompletnych jąder działa. ale staram się nie kompilować całego jądra, tylko konkretny moduł jądra. Czy istnieje cel make, który „przygotowuje” kompilację z pojedynczym modułem? Modprobe pokazuje ten sam błąd.
mab
6
Według stackoverflow możesz po prostu użyć make modules SUBDIRS=drivers/net/can/usb/peak_usbdowolnego innego podkatalogu. Tutaj działa dobrze.
Treviño
0

Tak proste jak: (ten przykład ilustruje sterownik ft1000, powinno to zająć tylko kilka minut, jeśli nie wystąpi natychmiast)

cd /usr/src/kernel-sources
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
# Enable the ft1000 module: CONFIG_FT1000=m  on the config with 
make xconfig # or "make menuconfig" then save
make prepare
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules_install

Następnie możesz załadować moduł modprobepodepmod

Uwaga: w zależności od zależności modułu może być konieczne całkowite przebudowanie jądra

intika
źródło