Как скомпилировать модуль ядра для малины pi?
У меня возникли проблемы с компиляцией модуля ядра для малины pi. Я хочу скомпилировать модуль ядра "hello world", используя сам малиновый pi.
Я использую raspbian wheezy 3.6.11 +.
Я пробовал следовать указаниям http://elinux.org/RPi_Kernel_Compilation.
Вот файл Makefile, который я использую:
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
Вот исходный код для 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");
}
Вот что я получаю, когда пытаюсь сделать проект:
[email protected]:/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
Я попытался создать каталог сборки в /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
У меня установлен GNU Make 3.81 и gcc (Debian 4.6.3-14 + rpi1) 4.6.3. Я также установил источник linux, используя
sudo apt-get install linux-source
Любые идеи о том, что я могу сделать, чтобы это скомпилировать?
Ответы
Ответ 1
При компиляции модуля параметр -C
должен указывать на исходное дерево, в котором было построено ядро (не очищайте его!). Если вы построили его на pi, это может быть в каталоге под вашим домашним каталогом.
Каталог build
в /lib/modules/<version>
- это Debian-ism, где вырезанная версия исходного дерева предоставляется с достаточным контекстом для сборки модулей. Ядра из ядер малины Pi Foundation не поставляются с каталогом build
.
Они могут быть немного устаревшими, но raspbian предоставляет ядро как пакет в стиле Debian, который должен включать каталог build
, который вы могли бы использовать для сборки модулей ядра.
sudo aptitude install linux-image-rpi-rpfv linux-headers-rpi-rpfv
Ответ 2
Вот шаги, которые я использовал для создания модуля ядра Hello World на Raspbian.
-
Выполните sudo rpi-update
Подробнее см. https://github.com/Hexxeh/rpi-update.
rpi-update
. Вы должны быть на последней прошивке и связанном ядре, чтобы иметь возможность выполнить следующий шаг.
-
Установите и запустите rpi-source
, чтобы установить исходный код, в котором было создано последнее ядро, которое вы используете. Это создаст правильную запись в /lib/modules
для ядра, которое вы используете. Примечание: вам не нужно быть root для его запуска, однако script выполнит определенные задачи с помощью sudo
, а пароль root будет запрошен во время выполнения script.
Инструкции по установке rpi-source
можно найти на https://github.com/notro/rpi-source/wiki
После выполнения этих шагов вы должны иметь возможность make
модуля ядра Hello World.
[email protected] ~/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'
[email protected] ~/HelloWorld $ sudo insmod hello.ko
[email protected] ~/HelloWorld $ tail -1 /var/log/syslog
May 15 13:45:39 raspberrypi kernel: [59789.169461] Hello World :)
[email protected] ~/HelloWorld $ sudo rmmod hello.ko
[email protected] ~/HelloWorld $ tail -1 /var/log/syslog
May 15 13:46:10 raspberrypi kernel: [59819.503503] Goodbye World!
Ответ 3
Сначала вам нужны заголовки ядра (и соответствующий двоичный код ядра) для создания вашего модуля.
Как сказал Грег, дистрибутив raspbian предоставляет пакеты:
sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv
Затем скажите raspbian, чтобы загрузить ваше вновь установленное ядро (3.10-3-rpi для меня).
Добавьте это в конец /boot/config.txt
и перезагрузите свой 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
Затем измените свой Makefile, чтобы указать только что установленные заголовки ядра:
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
Ответ 4
Это была боль. Мне пришлось скомпилировать и установить драйвер режима ядра. После долгого поиска я получил заголовки для pi 2 (3.18.7-v7 +) из здесь.
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
Ответ 5
Я работал над одним и тем же образцом в своем RPI с тем же ядром. Мне удалось скомпилировать модуль в моем RPI, но когда я выпустил insmod, я получил ошибку. Я выполнил инструкции здесь на виртуальной машине XUbuntu (с использованием моего ядра RPI версии 3.6.yy), и он отлично работал. Не уверен, почему компиляция непосредственно в RPI не сработала, это будет проблемой еще на один день.
Мне пришлось изменить Makefile в соответствии с новой средой.
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