编写一个简单的内核驱动模块
static int hello_init()
{
printk(“hello,I am in kernel now\n”);
return ;
}
void addfunc(int a,int b)
{return a+b;}
static void hello_exit()
{
printk(“hello ,I will leave the kernel now\n”);
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE(“GPL”);
Makefile文件:
obj-m := hello.o
KDIR := /lib/modules/$(shell uname –r)/build
PWD := $(shell pwd)
all:
$(MAKE) –C $(KDIR) SUBDIRS=$(PWD) modules
报错 “/lib/modules/3.13.0-32-generic/bulid: 没有那个文件或目录。 停止。”
网上车了一下说是没安装内核安装包(类似于kernel-devel的名字)或者是链接出错,但问题是,我的内核安装包有,链接也没问题,可他就是报错。
后来对比了我之前的Makefile文件,然后改动一下:
obj-m:=hello.o
KDIR:=/lib/modules/`uname -r`/build
PWD:=$(`pwd`)
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
然后就可以了。。。。。。。。。。
编译结果如下:
又报错"没有规则可以创建“arch/x86/syscalls/../include/generated/uapi/asm/unistd_32.h”需要的目标“/usr/src/linux-headers-3.13.0-32-generic/arch/x86/syscalls/syscall_32.tbl”。 停止。"
好吧,其实还是Makefile的锅,注意看第三行 PWD:=$(`pwd`) ,应该改成 PWD:=`pwd`
再次编译,没错,还是报错,但这次不是Makefile的锅啦~
报错信息"错误: 函数声明不是一个原型 [-Werror=strict-prototypes]"
简单,你在那些无参函数的参数列表里填上"void "就好啦~
最后老师在 MODULE_LICENSE("GPL"); 那里报错: /home/branches/chenyue/modules/hello.c::: 错误: expected declaration specifiers or ‘...’ before string constant ,网上说可能是因为代码里面含有中文格式,可我在VIM下重新码了一遍那个错误还是不消失啊,所以干脆把这行开放源码许可给删了,编译通过~~~~
所以,最后的源文件跟Makefile:
#include <linux/kernel.h>
static int hello_init(void )
{
printk("hello,I am in kernel now\n");
return ;
} int addfunc(int a, int b)
{ return (a+b); } static void hello_exit(void )
{
printk("hello, I will leave the kernal now\n");
}
module_init(hello_init);
module_exit(hello_exit);
obj-m:=hello.o
KDIR:=/lib/modules/`uname -r`/build
PWD:=`pwd`
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules