Подтвердить что ты не робот

Как скомпилировать модуль ядра для малины 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

Любые идеи о том, что я могу сделать, чтобы это скомпилировать?

4b9b3361

Ответ 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