modulos modprobe lsmod diseño compilar como comandos comando cargar linux makefile raspberry-pi kernel-module raspbian

linux - modprobe - ¿Cómo compilar un módulo del kernel para Raspberry pi?



compilar modulo kernel linux (5)

Estoy teniendo problemas para compilar un módulo del kernel para una pi frambuesa. Quiero compilar un módulo del kernel "hola mundo" utilizando la propia frambuesa pi.

Estoy usando sibilancias raspbian 3.6.11+.

Intenté seguir las instrucciones en http://elinux.org/RPi_Kernel_Compilation .

Aquí está el Makefile que estoy usando:

obj-m += hello-1.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Aquí está el código fuente de hello-1.c:

/* * hello-1.c - The simplest kernel module. */ #include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_INFO */ int init_module(void) { printk(KERN_INFO "Hello world 1./n"); /* * A non 0 return means init_module failed; module can''t be loaded. */ return 0; } void cleanup_module(void) { printk(KERN_INFO "Goodbye world 1./n"); }

Esto es lo que obtengo cuando intento hacer el proyecto:

root@raspberrypi:/home/pi/hello-module# make make -C /lib/modules/3.6.11+/build M=/home/pi/hello-module modules make: *** /lib/modules/3.6.11+/build: No such file or directory. Stop. make: *** [all] Error 2

Intenté crear el directorio de compilación en /lib/modules/3.6.11+

make -C /lib/modules/3.6.11+/build M=/home/pi/hello-module modules make[1]: Entering directory `/lib/modules/3.6.11+/build'' make[1]: *** No rule to make target `modules''. Stop. make[1]: Leaving directory `/lib/modules/3.6.11+/build'' make: *** [all] Error 2

Tengo GNU Make 3.81 y gcc (Debian 4.6.3-14 + rpi1) 4.6.3 instalado. También instalé la fuente de linux usando

sudo apt-get install linux-source

¿Alguna idea sobre lo que podría hacer para compilar esto?


Al compilar un módulo, el parámetro -C debería apuntar al árbol de origen donde se construyó el kernel (¡no lo limpie!). Si lo construyó en el pi es probable que esté en un directorio debajo de su directorio de inicio.

El directorio de build en /lib/modules/<version> es un Debian-ism, donde se proporciona una versión reducida del árbol de fuentes con el contexto justo para construir módulos. Los núcleos de los núcleos de Raspberry Pi Foundation no se envían con un directorio de build .

Pueden estar un poco desactualizados, pero raspbian proporciona un kernel como un paquete al estilo de Debian, que debería incluir el directorio de build que podría usar para compilar los módulos del kernel.

sudo aptitude install linux-image-rpi-rpfv linux-headers-rpi-rpfv


Estaba trabajando exactamente en la misma muestra en mi RPI con el mismo kernel. Me las arreglé para compilar el módulo en mi RPI pero cuando emití insmod recibí un error. Seguí las instrucciones here en una máquina virtual XUbuntu (usando la versión 3.6.y del kernel de mi RPI) y funcionó perfectamente. No estoy seguro de por qué compilar directamente en el RPI no funcionó, eso será un problema para otro día.

Tuve que cambiar el Makefile para que coincida con el nuevo entorno.

obj-m += hello-1.o all: make ARCH=arm CROSS_COMPILE=${CCPREFIX} -C /home/cstick/rpi/linux-rpi-3.6.y M=$(PWD) modules clean: make -C /home/cstick/rpi/linux-rpi-3.6.y M=$(PWD) clean


Esto fue un dolor. Tuve que compilar e instalar un controlador en modo kernel. Después de una larga búsqueda, obtuve los encabezados para pi 2 (3.18.7-v7 +) desde here .

sudo apt-get install dkms build-essential wget http://www.niksula.hut.fi/~mhiienka/Rpi/linux-headers-rpi/linux-headers-3.18.7-v7%2b_3.18.7-v7%2b-2_armhf.deb sudo dpkg -i linux-headers-3.18.7-v7+_3.18.7-v7+-2_armhf.deb


Estos son los pasos que utilicé para construir el módulo del kernel Hello World en Raspbian.

  1. Ejecutar sudo rpi-update

    Consulte https://github.com/Hexxeh/rpi-update para obtener detalles sobre rpi-update . Debe estar en el último firmware y kernel asociado para poder realizar el siguiente paso.

  2. Instale y ejecute rpi-source para instalar el código fuente que creó el último kernel que está ejecutando. Esto creará la entrada correcta en /lib/modules para el kernel que está ejecutando. Nota: no necesita ser root para ejecutar esto, sin embargo, el script realizará ciertas tareas usando sudo y se solicitará la contraseña de root durante la ejecución del script.

    Las instrucciones para instalar rpi-source se pueden encontrar en rpi-source

Una vez que se realicen esos pasos, debería poder make el módulo del kernel Hello World.

johnma@raspberrypi ~/HelloWorld $ make make -C /lib/modules/3.12.19+/build M=/home/johnma/HelloWorld modules make[1]: Entering directory `/home/johnma/linux-c3db7205bcd8988cf7c185e50c8849542554b1f5'' CC [M] /home/johnma/HelloWorld/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/johnma/HelloWorld/hello.mod.o LD [M] /home/johnma/HelloWorld/hello.ko make[1]: Leaving directory `/home/johnma/linux-c3db7205bcd8988cf7c185e50c8849542554b1f5'' johnma@raspberrypi ~/HelloWorld $ sudo insmod hello.ko johnma@raspberrypi ~/HelloWorld $ tail -1 /var/log/syslog May 15 13:45:39 raspberrypi kernel: [59789.169461] Hello World :) johnma@raspberrypi ~/HelloWorld $ sudo rmmod hello.ko johnma@raspberrypi ~/HelloWorld $ tail -1 /var/log/syslog May 15 13:46:10 raspberrypi kernel: [59819.503503] Goodbye World!


Primero necesita encabezados de kernel (y el binario del kernel correspondiente) para construir su módulo.
Como dijo Greg, la distribución de raspbian proporciona los paquetes:

sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv

Luego, dígale a raspbian que arranque su kernel recién instalado (3.10-3-rpi para mí).
Agregue esto al final de /boot/config.txt y reinicie su Pi:

# Parameters to boot on raspbian kernel (linux-image-rpi-rpfv package) kernel=vmlinuz-3.10-3-rpi initramfs initrd.img-3.10-3-rpi followkernel

Luego, modifique su Makefile para señalar los encabezados del kernel recién instalados:

KERNEL_HEADERS=/lib/modules/$(shell uname -r)/build obj-m := hello-1.o all: @$(MAKE) -C $(KERNEL_HEADERS) M=$(PWD) modules clean: @$(MAKE) -C $(KERNEL_HEADERS) M=$(PWD) clean