Come posso creare un singolo modulo del kernel nella struttura?


37

Linux-source -... ha un modulo che è disabilitato in config /boot/config-3.4-trunk-686-pae in modo che non faccia parte di linux-image -... (Questo è su Debian, ma la soluzione dovrebbe essere la stessa per Ubuntu, o?), ad es

# CONFIG_CAN_PEAK_USB is not set

Come si compila solo quel modulo del kernel, in modo che possa essere usato con il kernel distribuito?

Il rispettivo pacchetto linux-source -... è già installato, non compresso e collegato a / usr / src / linux. /boot/config-3.4-trunk-686-pae viene copiato in /usr/src/linux/.config e modificato con

CONFIG_CAN_PEAK_USB=m

Con

make
make modules

è possibile compilare il kernel e tutti i moduli. Ma come si compila solo quel singolo modulo specifico?

(Nota: anche le esigenze kernel sia compilato prima, altrimenti si ottiene il seguente errore: no symbol version for module_layout)


si prega di chiudere come duplicato di 14627. la risposta dell'utente "Radu C" risponde alla domanda.
martedì

Hai provato depmod -aprima modbrobe?
Nadia,

1
considera anche il seguente articolo: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Risposte:


38

Ho avuto lo stesso problema. Presumo che sia necessario non solo copiare .config ma anche Module.symvers

i miei passi per compilare il modulo ft1000 (eseguendo 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

4
Non sono sicuro che SUBDIRS sia ancora corretto. È stato ignorato per me. Dopo aver letto kernel.org/doc/Documentation/kbuild/modules.txt ho provato a usare make M=/path/to/modulequale sembrava funzionare.
nocivo,

Sto cercando di modificare un modulo diverso (sto solo aggiungendo un ID USB a un modulo esistente) quando lo compilo non ricevo errori ma quando lo inserisco ottengo un formato di modulo non valido perché ?!
Zibri,

14

Dall'interno della directory sorgente di livello superiore, è sufficiente fornire il percorso al nome del modulo o alla directory del modulo, ad esempio:

make drivers/net/can/usb/peak_usb/

o per un esempio più semplice (driver Ethernet e1000 Ethernet):

make drivers/net/ethernet/intel/e1000/e1000.ko

Solo facendo: make drivers/net/can/usb/peak_usb/pcan_usb.koha compilato solo pcan_usb.o. Fare lo make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.kocompila, ma insmod si lamenta 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
martedì

Stai eseguendo quel kernel specifico e hai già compilato il kernel una volta? Per favore prova modprobeanche con .
ish

Sto eseguendo il kernel in pacchetto. Compilare l'intero kernel funziona. ma sto cercando di non compilare il kernel completo, ma solo il modulo kernel specifico. Esiste un obiettivo di make che "prepara" una compilation a modulo singolo? modprobe mostra lo stesso errore.
martedì

6
Secondo stackoverflow puoi semplicemente usare make modules SUBDIRS=drivers/net/can/usb/peak_usbo qualsiasi altro sottodir. Funziona bene qui.
Treviño,

0

Semplice come: (questo esempio illustra il driver ft1000, questo dovrebbe richiedere solo pochi minuti se non istanti)

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

È quindi possibile caricare il modulo con modprobeafterdepmod

Nota: a seconda della dipendenza del modulo potrebbe essere necessario ricostruire completamente il kernel

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.