1、编写内核模块,以hello为例
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL"); //内核模块的许可权限
//模块的加载函数
static int hello_init(void)
{
printk(KERN_ALERT "hello world!\n");
return 0;
}
//模块的卸载函数
static void hello_exit(void)
{
printk(KERN_ALERT "goodbye hello world!\n");
}
//注册模块的加载函数
module_init(hello_init);
//注册模块的卸载函数
module_exit(hello_exit);
2、创建Makefile文件
ifneq ($(KERNELRELEASE), )
obj-m = hello.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r )/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -f *.ko *.o *.mod *.mod *.symvers *.order
3、使用make命令即可以生产内核模块hello.ko,然后使用insmod hello.ko加载内核,使用rmmod hello卸载内核 ,使用lsmod 查看内核中所有模块。
注意:
Makefile书写格式非常严格,
all:
<TAB缩进>make -C $(KDIR) M=$(PWD) $(EXTRA_CFLAGS) modules
default:
<TAB缩进>make -C $(KDIR) M=$(PWD) modules
clean:
<TAB缩进>rm -f *.ko
在拷贝网络代码的过程中,很可能原有的TAB被若干空格键所替代,就会出现Nothing to be done for...的错误了。