原创 Linux下简单内核模块的实验

2009-7-29 17:40 2041 5 5 分类: MCU/ 嵌入式

现在学嵌入式没了方向。真想有个师傅给指点指点。


学着网的前辈们,我也试着做做这个是实验,并记录我的过程与问题。


实验的环境:radhat9.0


实验代码:hello.c


/******************* hello.c *************/


#define    MODULE


#include<linux/module.h>


int init_module(void)


{


        printk("<1>Hello,World\n");


        return 0;


}


void clean_module(void)


{


       printk("<1>Googbye Kernel\n");


}


/****************  hello.c end ******************/


编译:#gcc -c hello.c


加载模块:#insmod ./hello.o


./hello.o: kernel-module version ./hello.o


           ./hello.o was compiled for kernel version 2.4.20


            while this kernel is version 2.4.20-8.


为什么不能加载?错误提示指出内核版本不匹配。


解决方法:重新编译并加入参数 -I  /usr/src/linux-2.4/include


编译:#gcc -c -I /usr/src/linux-2.4/include hello.c


加载模块:#insmod ./hello.o


Warning: loading ./hello.o will taint kernel: no license


       See http://www.tux.org/lkml/#export-tainted for information about tainted modules


Module hello loaded ,with warnings


为什么没有显示   Hello World?这是因为这个Hello World是内核输出的一般显示在/var/log/messages这个文件里面。


我们现在去看看这个文件(/var/log/messages),在这个文件的最后一行显示


May 18 17:38:39 localhost kernel: Hello World


我们去看看是不是已经加载到内核中


#cat  /proc/modules|grep hello


hello                          748         0(unused)


这说明我们的内核模块已经加载上了。但为什么没有在终端上显示?我不知道,等我以后再解决,如果你知道请给我说说,我是给新手,需要你的指点。


现在我们在把这个模块给卸载了。


#rmmod hello


这里没有任何的提示,我们在去查看是不是已经卸载了。


#cat  /proc/modules|grep hello


没有找到说明已经卸载了。


我上面的操作都是在X windows,现在我转入字符界面(Ctrl+Alt+F1)。


如果是在虚拟机上做这个实验。那么在进入字符界面时有个技巧,先按下Ctrl+F1,然后在按Alt。不然没法进入(原因是当我们同时按下Ctrl+Alt时,就回到了XP)。


在字符界面下我们在加载这个内核模块。


#insmod ./hello.o


Warning: loading ./hello.o will taint kernel: no license


       See http://www.tux.org/lkml/#export-tainted for information about tainted modules


<1>Hello,World


Module hello loaded ,with warnings


卸载模块:


#rmmod hello


<1>Googbye Kernel


这就我的实验记录。在这个记录里有些是我后来找到问题的解答后加进去的,所以可能点乱。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条