为linux内核的简单helloworld模块生成.ko文件时出现c错误



我是linux内核开发的初学者,并试图在linux中加载一个简单的模块。我已经创建了一个hello.c文件,将作为内核模块加载。

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/init.h>    
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A Simple Hello World module");
static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world!n");
    return 0;   
}
static void __exit hello_cleanup(void)
{
    printk(KERN_INFO "Cleaning up module.n");
}
module_init(hello_init);
module_exit(hello_cleanup);

这个hello.c和makefile都保存在/home/linux/目录中。

生成文件

obj-m +=hello.o
src= /usr/src/linux-headers-3.5.0-17-generic
all:
  $(MAKE) -C $(src) SUBDIR-$(PWD) modules
clean:
  rm -rf *.o *.ko

为了生成.ko文件,当我在终端上从/home/linux目录运行make命令时,我得到以下错误

h2o@h2o-Vostro-1015:~/linux$ make
make -C /usr/src/linux-headers-3.5.0-17-generic SUBDIR-/home/h2o/linux modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic'
make[1]: *** No rule to make target `SUBDIR-/home/h2o/linux'.  Stop.
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic'
make: *** [all] Error 2

请告知我遗漏了什么或做错了什么。。

  • Makefile

    obj-m:=hello.o#模块名称为hello.c

    KDIR:=/lib/modules/$(shell uname-r(/build

    所有:$(MAKE(-C$(KDIR(M=$(PWD(模块

    clean:$(MAKE(-C$(KDIR(M=$(PWD(clean$(RM(Module.markers模块订单

不能保证头文件总是位于/usr/src目录中,但它肯定位于/lib/modules目录中。

  • 确保系统具有最新的头文件

查找要存在的头文件运行`

uname-r

在终端上,输出将类似

3.5.0-17-generic

要安装头文件,请运行

sudo apt-get install linux-headers-$(uname -r)

您有:

$(MAKE) -C $(src) SUBDIR-$(PWD) modules

但你似乎想要:

$(MAKE) -C $(src)/SUBDIR-$(PWD) modules

或者类似的东西;源代码在哪里?你需要在那里-C

内核构建系统有点复杂。最好阅读内核构建过程文档。这样可以更好地理解

  • 目标如---modules / modules_install
  • 选项如----C $KDIR / M=$PWD
  • 命令语法---
  • $ make -C <path_to_kernel_src> M=$PWD

    $ make -C /lib/modules/ uname-r /build M=$PWD

    $ make -C /lib/modules/ uname-r /build M=$PWD modules_install

  • 可加载模块目标---obj-m

等等。。。

最新更新