1、范例
touch helloworld.c
chmod 777 -R helloworld.c
#include<linux/init.h>
#include<linux/module.h>
static int hello_init(void)
{
printk(KERN_WARNING"hello,world!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO"Goodbye,world!\n");
}
module_init(hello_init);//insmod+文件名.ko(入口)
module_exit(hello_exit);//rmmod+文件名(出口)
内核模块包括:
1、头文件
#include<linux/init.h>
#include<linux/module.h>
2、加载函数:
module_init
3、卸载函数:
module_exit
编写makefile文件:touch Makefile
chmod 777 -R Makefile
1)格式相对固定,先使用obj-m(用来指明内核模块最终产生的名字)
a、当只有一个源文件时:obj-m:helloworld.o
b、当有多个.c源文件时:obj-m:hello.o
hello-objs:file1.o file2.o file3.o .....
这里的hello.o是随意取的名字,但是要和hello-objs相对应
2)KDIR变量保存的是开发板运行的内核代码路径,KDIR名字自己取,如:
/opt/FriendlyARM/mini6410/linux/linux-2.6.38
3)目标
all:
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
clean:
rm -f *.o *.ko *.order *.symvers
-C:指进入到某目录。
M=$(PWD):M为内核模块代码的路径,PWD为当前路径
下面将helloworld.ko放入NFS目录下去,启动开发板,安装insmod helloworld.ko,卸载rmmod helloworld,会出错,没有目录2.6.30.4-Embedsky,当我们去卸载模块时,必须在lib/modules下面有和我们内核版本相同的目录,建一个mkdir -p /lib/modules/$(uname -r)。