Linux 如何为Raspberry pi编译内核模块?

Linux 如何为Raspberry pi编译内核模块?,linux,makefile,raspberry-pi,kernel-module,raspbian,Linux,Makefile,Raspberry Pi,Kernel Module,Raspbian,我在为raspberry pi编译内核模块时遇到问题。我想使用raspberry pi本身编译一个“hello world”内核模块 我正在使用raspbian哮喘病3.6.11+ 我试着按照学校的指示去做 以下是我正在使用的Makefile: obj-m += hello-1.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(s

我在为raspberry pi编译内核模块时遇到问题。我想使用raspberry pi本身编译一个“hello world”内核模块

我正在使用raspbian哮喘病3.6.11+

我试着按照学校的指示去做

以下是我正在使用的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");
}
我尝试在/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。我还使用

sudoapt获取安装linux源代码


有没有关于如何编译这个的想法?

我正在使用完全相同的内核在我的RPI上开发完全相同的示例。我设法在我的RPI上编译模块,但当我发出insmod时,我收到了一个错误。我按照XUbuntu虚拟机上的说明操作(使用我的RPI内核版本3.6.y),它工作得非常好。不确定为什么直接在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

编译模块时,
-C
参数应指向构建内核的源代码树(不要清理它!)。如果您在pi上构建它,它很可能位于主目录下的目录中

/lib/modules/
下的
build
目录是一个Debian ism,其中提供了源代码树的精简版本,其上下文刚好足以构建模块。树莓Pi基金会内核中的内核不使用<代码> Bug < /Cord>目录。

它们可能有点过时了,但是raspbian提供了一个Debian风格的内核包,其中应该包括可以用来构建内核模块的
build
目录

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

您首先需要内核头(以及相应的内核二进制文件)来构建模块。
正如Greg所说,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

以下是我在Raspbian上构建的步骤

  • 执行
    sudo rpi更新

    有关详细信息,请参阅
    rpi更新
    。您必须使用最新固件和相关内核才能执行下一步

  • 安装并运行
    rpi source
    以安装构建您正在运行的最新内核的源代码。这将在
    /lib/modules
    中为正在运行的内核创建正确的条目。注意:您不需要是root用户就可以运行此操作,但是脚本将使用
    sudo
    执行某些任务,并且在脚本执行期间将请求root密码

    有关安装rpi源代码的说明,请访问

  • 一旦执行了这些步骤,您应该能够
    生成
    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!
    

    这是一种痛苦。我必须编译并安装一个内核模式驱动程序。经过长时间的搜索,我从中获得了PI2(3.18.7-v7+)的头文件


    我遇到了同样的问题,只是通过
    sudo apt get install raspberrypi kernel headers

    在Raspberry上修复了它。模块目录中没有“build”子目录。我可以在我的RPI上确认。由此产生了一个问题:使用模块构建所需的数据创建它的“正确”方法是什么?既然您已经得到了一些具体的答案,下面简要介绍一下问题的原因。您使用的是Raspberry Pi基金会的内核(Raspbian中的
    raspberrypi固件
    包),它不提供制作内核模块所需的头文件。您可以使用该工具安装它们。或者切换到Raspian的内核+头文件(在
    /etc/apt/sources.lst
    中的
    wheezy main contrib…
    之后添加
    固件
    条目,更新软件包,删除
    raspberrypi固件
    ,安装
    raspberrypi固件nokernel
    。在安装linux头文件时,我编译了大量的说明,但出现以下错误:“/arch/arm/include/asm/memory.h:24:25:致命错误:mach/memory.h:没有这样的文件或目录“。有什么想法吗?谢谢,这对我来说非常有效。我唯一遇到的问题是运行
    rpi source
    。我遇到了一个Python错误,说它找不到/proc/config.gz。运行
    sudo modprobe configs
    修复了它。
    然后,告诉raspbian启动新安装的内核(3.10-3-rpi供我使用).
    您如何判断版本?
    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!
    
    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