Como eu construo um único módulo do kernel na árvore?

37

O linux-source -... possui um módulo que está desabilitado no config /boot/config-3.4-trunk-686-pae, para que não faça parte do linux-image -... (Isso está no Debian, mas a solução deve ser a mesma para o Ubuntu, ou?), por exemplo

# CONFIG_CAN_PEAK_USB is not set

Como alguém poderia compilar apenas esse módulo do kernel, para que ele possa ser usado com o kernel distribuído?

O respectivo pacote linux-source -... já está instalado, descompactado e vinculado a / usr / src / linux. /boot/config-3.4-trunk-686-pae é copiado para /usr/src/linux/.config e modificado com

CONFIG_CAN_PEAK_USB=m

Com

make
make modules

é possível compilar o kernel e todos os módulos. Mas como alguém compilaria apenas esse módulo único específico?

(Nota: também o kernel precisa ser compilado antes, caso contrário, você receberá o seguinte erro no symbol version for module_layout:)

mab
fonte
feche como duplicado o 14627. a resposta do usuário 'Radu C' responde à pergunta.
mab
Você tentou depmod -aantes modbrobe?
Nadia
1
considere também o seguinte artigo: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Respostas:

38

Eu tive o mesmo problema. Eu assumo que você precisa não apenas copiar .config, mas também Module.symvers

meus passos para compilar o módulo ft1000 (executando o 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
fonte
4
Não tenho certeza se SUBDIRS ainda está correto. Foi ignorado por mim. Depois de ler o kernel.org/doc/Documentation/kbuild/modules.txt , tentei usar o make M=/path/to/moduleque parecia funcionar.
harmic
Estou tentando modificar um módulo diferente (é apenas adicionar um ID USB a um módulo existente) quando o compilo, não recebo erros, mas quando o insiro recebo o formato de módulo inválido, por que ?!
Zibri
14

No diretório de origem de nível superior, simplesmente forneça o caminho para o nome ou diretório do módulo, por exemplo:

make drivers/net/can/usb/peak_usb/

ou para um exemplo mais simples (driver Intel e1000 Ethernet):

make drivers/net/ethernet/intel/e1000/e1000.ko
ish
fonte
Apenas fazendo: make drivers/net/can/usb/peak_usb/pcan_usb.koconstruiu apenas pcan_usb.o. Fazer make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.kocompila, mas insmod reclama 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 29/07
Você está executando esse kernel específico e já compilou o kernel uma vez? Por favor, tente com modprobetambém.
Ish
Estou executando o kernel empacotado. Compilar o kernel completo funciona. mas estou tentando não compilar o kernel completo, apenas o módulo específico do kernel. Existe um destino make que 'prepara' uma compilação de módulo único? O modprobe mostra o mesmo erro.
mab
6
De acordo com o stackoverflow, você pode simplesmente usar make modules SUBDIRS=drivers/net/can/usb/peak_usbou qualquer outro subdiretório. Funciona bem aqui.
Treviño
0

Tão simples quanto: (este exemplo ilustra o driver ft1000, isso deve levar apenas alguns minutos, se não instantes)

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

Você pode carregar o módulo modprobedepois dedepmod

Nota: dependendo da dependência do módulo, pode ser necessário reconstruir o kernel inteiramente

intika
fonte