编写一个简单的内核驱动模块
1 static int hello_init()
2 {
3 printk(“hello,I am in kernel now\n”);
4 return 0;
5 }
6 void addfunc(int a,int b)
7 {return a+b;}
8 static void hello_exit()
9 {
10 printk(“hello ,I will leave the kernel now\n”);
11 }
12 module_init(hello_init);
13 module_exit(hello_exit);
14 MODULE_LICENSE(“GPL”);
Makefile文件:
1 obj-m := hello.o
2 KDIR := /lib/modules/$(shell uname –r)/build
3 PWD := $(shell pwd)
4 all:
5 $(MAKE) –C $(KDIR) SUBDIRS=$(PWD) modules
报错 “/lib/modules/3.13.0-32-generic/bulid: 没有那个文件或目录。 停止。”
网上车了一下说是没安装内核安装包(类似于kernel-devel的名字)或者是链接出错,但问题是,我的内核安装包有,链接也没问题,可他就是报错。
后来对比了我之前的Makefile文件,然后改动一下:
1 obj-m:=hello.o
2 KDIR:=/lib/modules/`uname -r`/build
3 PWD:=$(`pwd`)
4 all:
5 $(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:17:16: 错误: expected declaration specifiers or ‘...’ before string constant ,网上说可能是因为代码里面含有中文格式,可我在VIM下重新码了一遍那个错误还是不消失啊,所以干脆把这行开放源码许可给删了,编译通过~~~~
所以,最后的源文件跟Makefile:
1 #include
2 static int hello_init(void )
3 {
4 printk("hello,I am in kernel now\n");
5 return 0;
6 }
7
8 int addfunc(int a, int b)
9 { return (a+b); }
10
11 static void hello_exit(void )
12 {
13 printk("hello, I will leave the kernal now\n");
14 }
15 module_init(hello_init);
16 module_exit(hello_exit);
1 obj-m:=hello.o
2 KDIR:=/lib/modules/`uname -r`/build
3 PWD:=`pwd`
4 all:
5 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules