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