随笔 - 303  文章 - 883  trackbacks - 0
<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

欢迎光临! 
闲聊 QQ:1074961813

随笔分类(357)

我管理的群

公共blog

  • n维空间
  • Email : java3d@126.com 群 : 12999758

参与管理的论坛

好友的blog

我的其他blog

朋友的网站

搜索

  •  

最新评论

 Money很重要

前面我们已经对驱动程序的结构有了一个初步的认识,我们知道,不管是devfs还是udev设备管理方式,都有自己的一套使用方法,很好的掌握理解和这些方法是十分有必要的,对于一个男人而言长相、才学、擅长交际很重要,如果再加上钱,那简直就是绝世的了。生活是里不开钱的,所以钱很重要。这个世界就是怎么现实,握了理论还能做出来,常有人说:“老板不看过程,只看结果”。于是这里讨论如何编译和安装模块,还有如何很好的完成一个Makefile。这正是很多人看来过不了的技术门槛,今天就来个鲤鱼跳龙门吧!希望你看完后会说:“草你,这有难度吗?”对于驱动编写过程中的基础技术细节,下个文我们会讨论的,大家先看看书吧!写这个文章的时候,linux最新版本是2.6.25,这里以这个版本做为基础做讨论。

模块:一种可以动态装载到内核的二进制块,他在被装载的时候会检测硬件设备是否正常,并做初始化工作;卸载时会释放被它占有的硬件资源。驱动程序中我,我们用:


#include<linux/module.h>//
构建模块需要一些数据结构和一些函数,这些函数包括下面这两个

module_init(sn9c102_module_init);//模块初始化时候被用到

module_exit(sn9c102_module_exit); //卸载模块时候被用到

这些信息是必要的,它们向内核声明这个程序是一个模~~~~。在devfs下,我们可以用#insmod命令来装载他们。

功能说明:载入模块。

语  法:insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]

补充说明:Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。

参  数:

-f  不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。

-k  将模块设置为自动卸除。

-m  输出模块的载入信息。

-o<模块名称>  指定模块的名称,可使用模块文件的文件名。

-p  测试模块是否能正确地载入kernel。

-s  将所有信息记录在系统记录文件中。

-v  执行时显示详细的信息。

-x  不要汇出模块的外部符号。

-X  汇出模块所有的外部符号,此为预设置。

前面文章中已经给了一个复杂的驱动例子,下面再给出一个空壳驱动程序给大家玩下 . .!~~~ 一个最简单的模块代码(这个代码不知道有没有问题,时间关系,我并没真正安装,如果您按照我的说法安装出现问题,请留言!):

#include<linux/init.h> /*module_initmodule_exit*/
#include<linux/module.h> /*写模块必须的*/

#include <linux/kernel.h> /* printk*/
MODULE_LICENSE("GPL");

static int __init hello_init(void)

{

    printk(KERN_ALERT " Hello, Kernel World "n");

    return 0;

}

static void __exit hello_exit(void)

{

    printk(KERN_ALERT "Goodbye, Kernel World"n");

}

module_init(hello_init);

module_exit(hello_exit);

创建一个叫Makefile的文件(无后缀),写入:

obj-m := hello.o #***.o

KERNELDIR := /lib/modules/$(shell uname -r)/build

default:      #编译模块
       make -C $(KERNELDIR) M=$(shell pwd) modules   #前面输入tab

install:        #安装模块

       insmod hello.ko #***.ko

uninstall:      #卸载模块

       rmmod hello

clean:        #清除留文件,以重新编译

       make -C $(KERNELDIR) M=$(shell pwd) clean

       rm -f Module.symvers

将Makefile及模块代码放到同个目录下,在命令行下cd到该目录下,以root身份登陆,
在字符界面下,使用命令:

#make  #编译模块

#make install  #安装模块,运行后打印:Hello, Kernel World

#make uninstall #卸载模块,运行后打印:Goodbye, Kernel World

#make clean   #删除KERNELDIR目录下所有编译生成的文件

在图形界面下,输出信息不在终端显示,而是保存在文件/var/log/messages
(按“CTRL + ALT + F5
换到控制台模式,可看到输出。
ALT + F7可以切换回图形界面)。

运行情况如下:



若Makefile中的obj-m := hello.o 写成obj-m := hello.ko ,将出现如下错误:



还有一点需要注意:模块在安装之后卸载掉才能再次安装,否则会出错。

代码下载



地震让大伙知道:居安思危,才是生存之道。
posted on 2008-05-20 13:37 小寻 阅读(4991) 评论(1)  编辑  收藏 所属分类: kernel

FeedBack:
# re: 如何编写Linux 驱动程序(五) 2010-01-14 20:58 小牛
写的很好,学习ing  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: