kernel space中的程序入口,出口分别是module_init,module_exit中的handler,__init 宏是告知编译程序相关的程序或者变量仅用于初始化,会放到特殊的内存段中,初始化结束后就释放这段内存。在驱动程序中仅有一个module-init和cleanup_exit点。
插入或移除模块后,可以通过dmesg看到相应的消息。
hello_kernel.c:
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
static int __init lkp_init(void)
{
printk(" <1> hello ,world..\n");
return 0;
}
static void __exit lkp_cleanup(void)
{
printk("<2> goodbye, leaving kernel space...\n");
}
module_init(lkp_init);
module_exit(lkp_cleanup);
Makefile的写法(在内核的Makefile中定义了
KERNELRELEASE,先执行内核代码下面的Makefile,然后执行当前工作目录的这个Makefile
):
ifneq ($(KERNELRELEASE),)
mymodule-objs:=hello.c
obj-m += hello.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf *.o *.mod.c *.ko *.mod.o *.symvers *.order *-
endif
mymodule-objs:=hello.c
obj-m += hello.o
else
PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf *.o *.mod.c *.ko *.mod.o *.symvers *.order *-
endif
--------
参考文献:《linux内核编程》