Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1433481
  • 博文数量: 823
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5002
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-28 17:39
文章分类

全部博文(823)

文章存档

2011年(1)

2008年(822)

我的朋友

分类: LINUX

2008-08-28 17:48:18

 
按照《linux设备驱动开发详解》一书中的步骤实现经典例子"hello,world!"的例子。具体步骤如下:
1.编写代码:
/*
*hello.c--theexampleofprintf"helloworld!"inthescreenofdriverprogram
*/
#include
#include

MODULE_LICENSE("DualBSD/GPL");/*declarethelicenseofthemodule,itisnecessary*/

staticinthello_init(void)
{
printk(KERN_ALERT"HelloWorldenter!\n");
return0;
}

staticinthello_exit(void)
{
printk(KERN_ALERT"Helloworldexit!\n");
}

module_init(hello_init);/*loadthemodule*/
module_exit(hello_exit);/*unloadthemodule*/

/*beforeissomedecriptionofthemodel,notnecessary*/
MODULE_AUTHOR("YJHou");
MODULE_DESCRIPTION("Thisisanexampleofprogrammingdriver!");
MODULE_ALIAS(asimplestmodule);

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@localhostdriver]$make-C/home/hyj/linux-2.6M=/home/hyj/driver
make:Enteringdirectory`/home/hyj/linux-2.6''
CC[M]/home/hyj/driver/hello.o
Buildingmodules,stage2.
MODPOST1modules
CC/home/hyj/driver/hello.mod.o
LD[M]/home/hyj/driver/hello.ko
make:Leavingdirectory`/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这个目录下,你可以使用whereisinsmod查看)。
<3>insmod这个命令需要在root权限下才能使用。
加载完成后你可以输入lsmod查看hello这个模块哦。

[root@localhostdriver]#insmod./hello.ko
Messagefromsyslogd@localhostatApr1509:20:03...
kernel:Hello,world

4.卸载驱动模块:rmmodhello.

加载模块后就可在屏幕上看到如下信息:Helloworldenter.
卸载时就可在屏幕上看到如下信息:helloworldexit.

[root@localhostdriver]#rmmodhello
[root@localhostdriver]#
Messagefromsyslogd@localhostatApr1509:20:47...
kernel:Goodbye,cruelworld

什么?我执行的时候竟然什么也没有,既没有报错,也没有任何输入?
这时你可以在/var/log/messages这个文件中看到以上输出信息(使用cat/var/log/messages一般在最下面几行)。
那么怎么才能在屏幕上打印出这些信息呢?
这时你必须对源文件做如下修改:
<1>将"printk(KERN_ALERT"HelloWorldenter!\n");”一句中的“KERN_ALERT”换成"KERN_EMERG"以提高内核打印的优先级(0);
<2>同理将printk(KERN_ALERT"Helloworldexit!\n");改成printk(KERN_ALERT"Helloworldexit!\n");
重新编译,加载,你就可在屏幕上看到输出信息了。
哈哈,总算大功告成了。

另外,如果有多个文件,则按下列方式编写Makefile文件(file1.c、file2.c):
obj-m:=modulename.o
module-objs:=file1.ofile2.o
:0wpoi2


linux2.6驱动编程实例:实现hello,world步骤linux2.6驱动编程实例:实现hello,world步骤linux2.6驱动编程实例:实现hello,world步骤linux2.6驱动编程实例:实现hello,world步骤linux2.6驱动编程实例:实现hello,world步骤linux2.6驱动编程实例:实现hello,world步骤linux2.6驱动编程实例:实现hello,world步骤linux2.6驱动编程实例:实现hello,world步骤linux2.6驱动编程实例:实现hello,world步骤linux2.6驱动编程实例:实现hello,world步骤
阅读(815) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~