模块编程在2.4和2.6的kernel中的区别 以hello world为例: 2.4: ======================== hello.c ======================== /* How to compile: * gcc -I /usr/src/linux-2.4/include -DMODULE -D__KERNEL__ -c hello.c */ #ifndef MODULE #define MODULE #endif #ifndef __KERNEL__ #define __KERNEL__ #endif #include <linux/kernel.h> #include <linux/module.h> int init_module(void) { printk(KERN_ALERT "Hello World!\n"); return 0; // Must return 0! } void cleanup_module(void) { printk(KERN_ALERT "Goodbye world!\n"); } MODULE_LICENSE("GPL"); // Avoid "no license" warning. ======================== Makefile ======================== CC=gcc MODCFLAGS := -I /usr/src/linux-2.4/include -DMODULE -D__KERNEL__ hello.o:hello.c $(CC) $(MODCFLAGS) -c hello.c .PHONY:clean clean: rm -f hello.o ======================== # make # insmod hello.o # lsmod # rmmod hello 注:2.4 的模块编程中,MODULE和__KERNEL__这两个宏必须要定义,不管你是在编译时定义还是写在源文件里。我这里是两边都写了,不过加了保护,不会 出现重复定义,也不会忘记定义。linux/kernel.h这个文件中,定义了KERN_ALERT这个宏,如果你直接改写成"<1>", 就可以不用包含这个头文件。而linux/module.h是模块编译必须的头文件,不可以省略。 2.6: ======================== hello.c ======================== #include <linux/init.h> #include <linux/module.h> #include <linux/moduleparam.h> MODULE_LICENSE("Dual BSD/GPL"); static char *whom = "world"; module_param(whom, charp, 0); static int howmany = 1; module_param(howmany, int, 0); static int hello_init(void) { int i; for( i=0; i<howmany; i++) printk(KERN_ALERT "(%d) Hello, %s!\n",i,whom); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye!\n"); } module_init(hello_init); module_exit(hello_exit); ======================== Makefile ======================== obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean ======================== # make # insmod hello.ko 或者 # insmod hello.ko howmany=2 whom=linux # lsmod # rmmod hello 注: 在2.6中,初始化函数和收尾函数可以写成任何名字,只要在源文件中分别用module_init()和module_exit()宏调用一下就可以了, 其实本质还是init_module()和cleanup_module()函数,这点你可以在/lib/modules/$(shell uname -r)/build/include/linux/init.h中看到。而在moduleparam.h中则是关于参数调用的内容。 P.S. KERN_EMERG <0> KERN_ALERT <1> KERN_CRIT <2> KERN_ERR <3> KERN_WARNING <4> KERN_NOTICE <5> KERN_INFO <6> KERN_DEBUG <7> 如果要想看到hello world的打印消息,必须切换到字符模式下,在x-window中的控制台中是收不到消息的,但是可以在/var/log/messages里看到响应的消息记录。 |
|
来自: jason zhai > 《我的图书馆》