1.编写代码:
/*
* hello.c -- the example of printf "hello world!" in the screen of driver program
*/
#include
#include
MODULE_LICENSE("Dual BSD/GPL");/* declare the license of the module ,it is necessary */
static int hello_init(void)
{
printk(KERN_ALERT "Hello World enter!\n");
return 0;
}
static int hello_exit(void)
{
printk(KERN_ALERT "Hello world exit!\n");
}
module_init(hello_init); /* load the module */
module_exit(hello_exit); /* unload the module */
/* before is some decription of the model,not necessary */
MODULE_AUTHOR("YJ Hou");
MODULE_DESCRIPTION("This is an example of programming driver!");
MODULE_ALIAS(a simplest module);
2.编译代码:
在代码的目录下建立一个Makefile文件,将下面的语句写入其中:
obj-m := hello.o
执行如下命令编译代码:
make -C /home/hyj/linux2.6/ M=/home/hyj/driver/ modules
注意:这里的/home/hyj/linux2.6/是内核源码树的目录,/home/hyj/driver/是你要放置编译文件的目录。我的源文件和编译好的文件都在这个目录下,建议大家要放在同一目录下哦,不然可能出错。
编译完成后将出现下列代码:
[hyj@localhost driver]$ make -C /home/hyj/linux-2.6 M=/home/hyj/driver
make: Entering directory `/home/hyj/linux-2.6'
CC [M] /home/hyj/driver/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/hyj/driver/hello.mod.o
LD [M] /home/hyj/driver/hello.ko
make: Leaving directory `/home/hyj/linux-2.6'
这时就表示编译成功,在目录下将产生hello.ko文件。
3.执行代码,加载驱动模块:
insmod ./hello.ko即可加载模块。
有的朋友可能会出现insmod命令找不到的错误,这可能有下面几个原因:
<1> 你的系统没有安装module-init-tools工具,关于此问题,只需安装即可,但是一般装完系统是有这个命令的。
<2> 环境变量没有添加导致不能使用该命令。使用echo $PATH即可查看PATH环境变量,发现没有/sbin这个路径,所以你当然不能使用insmod这个命令了。解决的方法很简单,只需在命令行输入:
PATH = "$PATH:/sbin"即可添加。(insmod在/sbin这个目录下,你可以使用whereis insmod查看)。
<3> insmod这个命令需要在root权限下才能使用。
加载完成后你可以输入lsmod查看hello这个模块哦。
[root@localhost driver]# insmod ./hello.ko
Message from syslogd@localhost at Apr 15 09:20:03 ...
kernel: Hello,world
4.卸载驱动模块:rmmod hello.
加载模块后就可在屏幕上看到如下信息:Hello world enter.
卸载时就可在屏幕上看到如下信息:hello world exit.
[root@localhost driver]# rmmod hello
[root@localhost driver]#
Message from syslogd@localhost at Apr 15 09:20:47 ...
kernel: Goodbye,cruel world
什么?我执行的时候竟然什么也没有,既没有报错,也没有任何输入?
这时你可以在/var/log/messages这个文件中看到以上输出信息(使用cat /var/log/messages一般在最下面几行)。
那么怎么才能在屏幕上打印出这些信息呢?
这时你必须对源文件做如下修改:
<1> 将"printk(KERN_ALERT "Hello World enter!\n");”一句中的“KERN_ALERT”换成"KERN_EMERG"以提高内核打印的优先级(0);
<2> 同理将printk(KERN_ALERT "Hello world exit!\n");改成printk(KERN_ALERT "Hello world exit!\n");
重新编译,加载,你就可在屏幕上看到输出信息了。
哈哈,总算大功告成了。
另外,如果有多个文件,则按下列方式编写Makefile文件(file1.c、file2.c):
obj -m := modulename.o
module-objs := file1.o file2.o
:0wpoi2
[ 本帖最后由 gongji110 于 2008-4-15 09:24 编辑 ]
hyl_lynn 于 2010-12-31 16:15:14发表:
very good!!thanks!!
tonytt420 于 2010-11-24 10:35:07发表:
1、环境变量没有添加导致不能使用该命令(insmod),运行PATH = "$PATH:/sbin"
2、将打印优先级改成KERN_EMERG
终于出来传说中的hello world了,呵呵!
学习了
shao13081352 于 2010-11-17 13:06:59发表:
学习一下!
longyun 于 2010-01-08 20:24:51发表:
有时间研究一下,谢谢楼主分享
lyfpang 于 2010-01-08 17:56:11发表:
太强了,暂时看不懂,新手!
nerissa 于 2010-01-08 11:52:17发表:
学习一下
js001sdx 于 2009-08-19 10:12:50发表:
学习一下
hlxiong_04 于 2009-05-31 14:50:38发表:
(q):s
emily_zheng 于 2008-09-17 13:53:42发表:
1、环境变量没有添加导致不能使用该命令(insmod),运行PATH = "$PATH:/sbin"
2、将打印优先级改成KERN_EMERG
终于出来传说中的hello world了,呵呵!
ddtbob 于 2008-06-28 15:22:11发表:
<1> 将"printk(KERN_ALERT "Hello World enter!\n");”一句中的“KERN_ALERT”换成"KERN_EMERG"以提高内核打印的优先级(0);
哈 是这个样子的,学习了 原来我用KERN_INFO和KERN_ALERT都不行:0w223dc
gongji110 于 2008-06-24 14:00:58发表:
我觉得应该是你的内核源码树和内核版本不同导致的。
vivi.wei 于 2008-05-26 16:43:33发表:
gongji110 能否说明您宿主机的内核版本吗?我宿主机的内核版本是fedora8(2.6.23.1.42),由于fedora没有内核原码,所以我用内核源码树是 linux-2.6.8.1、2.6.25,均用交叉编译器编译通过,且ls /lib/modules 看到安装的modules,但我按上述步骤编译hello.c的时候出现 MODPOST 0 modules,后面两行 CC...LD...都没有,所以也就生成不了.ko文件,请问各位前辈,是否是我的宿主机内核版本与使用的内核源码树不一致造成的?还是缺少了什么模块?谢谢!