linux2.4与2.6下的模块编程对比

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

本版积分规则

88

主题

103

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部