Wie erstelle ich ein einzelnes In-Tree-Kernel-Modul?

37

Die Linux-Quelle -... hat ein Modul, das in der Konfiguration /boot/config-3.4-trunk-686-pae deaktiviert ist, so dass es nicht Teil von linux-image -... ist (Dies ist unter Debian, aber Die Lösung sollte für Ubuntu dieselbe sein, oder?), z

# CONFIG_CAN_PEAK_USB is not set

Wie würde man nur dieses Kernelmodul kompilieren, damit es mit dem verteilten Kernel verwendet werden kann?

Das entsprechende linux-source -... -Paket ist bereits installiert, unkomprimiert und mit / usr / src / linux verknüpft. /boot/config-3.4-trunk-686-pae wird nach /usr/src/linux/.config kopiert und mit geändert

CONFIG_CAN_PEAK_USB=m

Mit

make
make modules

Es ist möglich, den Kernel und alle Module zu kompilieren. Aber wie würde man nur dieses spezifische einzelne Modul kompilieren?

(Hinweis: auch die Kernel - Bedürfnisse vor kompiliert werden, sonst erhalten Sie die folgende Fehlermeldung: no symbol version for module_layout)

mab
quelle
Bitte als Duplikat von 14627 schließen. Die Antwort von Benutzer 'Radu C' beantwortet die Frage.
mab
Hast du es depmod -aschon mal versucht modbrobe?
Nadia
1
Beachten Sie auch den
Oleg Kokorin

Antworten:

38

Ich hatte das gleiche problem Ich gehe davon aus, dass Sie nicht nur .config kopieren müssen, sondern auch Module.symvers

Meine Schritte zum Kompilieren des Moduls ft1000 (unter Debian Wheeze 7.1.0; Kernel 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
quelle
4
Ich bin nicht sicher, ob SUBDIRS noch korrekt ist. Es wurde für mich ignoriert. Nachdem ich kernel.org/doc/Documentation/kbuild/modules.txt gelesen hatte, versuchte ich es mit dem, make M=/path/to/modulewas zu funktionieren schien.
harmic
Ich versuche, ein anderes Modul zu ändern (füge nur eine USB-ID zu einem vorhandenen Modul hinzu), wenn ich es kompiliere, erhalte ich keine Fehler, aber wenn ich es einfüge, erhalte ich ein ungültiges Modulformat. Warum ?!
Zibri
14

Geben Sie im Quellverzeichnis der obersten Ebene einfach den Pfad zum Modulnamen oder zum Modulverzeichnis an, z.

make drivers/net/can/usb/peak_usb/

oder für ein einfacheres Beispiel (Intel e1000 Ethernet-Treiber):

make drivers/net/ethernet/intel/e1000/e1000.ko
ish
quelle
Nur dabei: make drivers/net/can/usb/peak_usb/pcan_usb.kohabe nur pcan_usb.o erstellt. Doing make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.kokompiliert es, aber Insmod beschwert sich 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
Führen Sie diesen speziellen Kernel aus, und haben Sie den Kernel bereits einmal kompiliert? Bitte versuchen Sie es auch mit modprobe.
ish
Ich lasse den verpackten Kernel laufen. Das Kompilieren des gesamten Kernels funktioniert. Ich versuche aber nicht den kompletten Kernel zu kompilieren, sondern nur das spezifische Kernelmodul. Gibt es ein make-Ziel, das eine einzelne Modulkompilierung 'vorbereitet'? Modprobe zeigt den gleichen Fehler.
mab
6
Je nach Stackoverflow können Sie einfach ein make modules SUBDIRS=drivers/net/can/usb/peak_usbbeliebiges anderes Unterverzeichnis verwenden. Es funktioniert gut hier.
Treviño
0

So einfach wie: (Dieses Beispiel zeigt den ft1000-Treiber. Dies sollte nur wenige Minuten dauern, wenn nicht sofort.)

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

Sie können das Modul dann mit modprobeafter ladendepmod

Hinweis: Abhängig von der Modulabhängigkeit müssen Sie möglicherweise den Kernel vollständig neu erstellen

intika
quelle