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_init、module_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
小寻 阅读(5000)
评论(1) 编辑 收藏 所属分类:
kernel