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.
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.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 usandosudo
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