¿Cómo construyo un solo módulo de kernel en árbol?

37

Linux-source -... tiene un módulo que está deshabilitado en la configuración /boot/config-3.4-trunk-686-pae para que no forme parte de linux-image -... (Esto está en Debian, pero la solución debería ser la misma para Ubuntu, o?), ej.

# CONFIG_CAN_PEAK_USB is not set

¿Cómo se compilaría solo ese módulo del núcleo, de modo que pueda usarse con el núcleo distribuido?

El respectivo paquete linux-source -... ya está instalado, descomprimido y vinculado a / usr / src / linux. /boot/config-3.4-trunk-686-pae se copia en /usr/src/linux/.config y se modifica con

CONFIG_CAN_PEAK_USB=m

Con

make
make modules

Es posible compilar el núcleo y todos los módulos. Pero, ¿cómo se compilaría solo ese módulo único específico?

(Nota: también las necesidades del núcleo para ser compilados antes, de lo contrario se obtiene el siguiente error: no symbol version for module_layout)

mab
fuente
cierre como duplicado de 14627. la respuesta del usuario 'Radu C' responde a la pregunta.
mab
¿Lo intentaste depmod -aantes modbrobe?
Nadia
1
considere el siguiente artículo también: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Respuestas:

38

Yo tuve el mismo problema. Supongo que no solo necesita copiar .config sino también Module.symvers

mis pasos para compilar el módulo ft1000 (ejecutando 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
fuente
44
No estoy seguro si SUBDIRS sigue siendo correcto. Fue ignorado por mí. Después de leer kernel.org/doc/Documentation/kbuild/modules.txt intenté usar el make M=/path/to/moduleque parecía funcionar.
harmic
Estoy tratando de modificar un módulo diferente (solo estoy agregando una ID de USB a un módulo existente) cuando lo compilo no obtengo errores, pero cuando lo inserto obtengo un formato de módulo no válido, ¿por qué?
Zibri
14

Desde dentro del directorio de origen de nivel superior, simplemente haga que la ruta al nombre del módulo o al directorio del módulo, por ejemplo:

make drivers/net/can/usb/peak_usb/

o para un ejemplo más simple (controlador de Ethernet Intel e1000):

make drivers/net/ethernet/intel/e1000/e1000.ko
ish
fuente
Solo haciendo: make drivers/net/can/usb/peak_usb/pcan_usb.kosolo construí pcan_usb.o. Hacerlo lo make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.kocompila, pero insmod se queja 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
¿Está ejecutando ese núcleo específico y ya ha compilado el núcleo una vez? Por favor intente con modprobetambién.
ish
Estoy ejecutando el kernel empaquetado. Compilar el núcleo completo funciona. pero estoy tratando de no compilar el núcleo completo, solo el módulo de núcleo específico. ¿Existe un objetivo de creación que 'prepare' una compilación de un solo módulo? modprobe muestra el mismo error.
mab
66
De acuerdo con stackoverflow , puede usar make modules SUBDIRS=drivers/net/can/usb/peak_usbo cualquier otro subdirectorio. Funciona bien aquí.
Treviño
0

Tan simple como: (este ejemplo ilustra el controlador ft1000, esto debería tomar solo unos minutos, si no 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

Luego puede cargar el módulo con modprobeafterdepmod

Nota: dependiendo de la dependencia del módulo, es posible que deba reconstruir el núcleo por completo

intika
fuente