您的位置:首页 > 运维架构 > Linux

Linux嵌入式驱动初体验(三)--- 模块接触

2010-09-10 18:21 239 查看
对于驱动的开发,说的简单些,就是一个模块编程,然后编译成内核模块,加载到内核中运行。下面就先介绍一个简单的模块程序,然后再慢慢引出我们需要关注的重点,下面是hellomod.c文件,内容如下:

#include <linux/init.h>
#include <linux/module.h>
static int __init hello_init(void)
{
printk(KERN_ALERT"/nHello Kernel World/n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT"/nGood bye Kernel/n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE(GPL);


貌似每个最基本的程序都是要输出hello world 啊,不知是谁定的。首先,模块编程的一个重要头文件就是<linux/module.h>,里面存储着有关模块编程的一些函数和定义。然后我们再看最后几句话,MODULE_LICENSE(GPL),意思是使用的许可是GPL的;再向前看,就是名为module_init和module_exit的两个调用,参数是上面两个函数的函数名,这里就是模块的入口和出口,可以注意到的是,一个模块编程的程序是没有我们以前编程最常见的main函数的,main对于一个代码来说,是一个入口点,也是出口点,而在模块编程中,没有了main函数的存在,所以就用这两个调用承担起“门”的作用。

对于这个简单的模块编程来说,其实有好多地方都能查到,我就不多说了,我想说的重点是下面的Makefile的编写。在Linux工程程序设计中,我们几乎只能看到成堆的.c文件和成堆的.h文件,然后再加上一个Makefile文件(对于多级目录形式存放的工程,可能是每一个文件夹内有一个Makefile),而在VC中要是创建一个工程的话,会产生好多.XX文件,我们是不会看到这些文件的内容的,其实我们也没有必要去管它的内容,但是在Linux的环境下,我们想要弄一个工程出来,就要我们自己动手去写这些.XX文件,这就是Makefile文件,它就像是一个“加工厂”一样,.c和.h文件进去,生产出我们要的可执行程序,在模块编程中,我们想要得到的“产品”就是.ko文件(2.6以后的版本是.ko,之前的是.o,因为没有接触过以前的版本,就没有发言权了,所以只说.ko文件),下面看看对于这个模块程序来说,它的Makefile文件是怎样的:

obj-m += hellomod.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean


对于一些Makefile的语法就不多说了,因为涉及到的内容会有很多,先说一点值得注意的,第6行的make之前是一个tab符,在Makefile文件中,在一个命令之前必须是一个tab符,否则它是不认识的。

编译这个模块程序,需要在该目录下输入 make 执行,make的工作原理就是在你输入指令以后,就在当前目录下搜索Makefile文件(而且字母“M”必须是大写的),然后通过Makefile文件中的配置和命令,来对相应的文件进行操作。所以可以说对于一个大的Linux工程来说,Makefile是它的核心,而且如果你的Makefile文件写的很好,那么你可以对于多个项目使用同一个Makefile文件,不过这样的要求就比较高了。

原理基本就是这个原理,个人感觉,其实Makefile就是一个应用型的语言,就是你需要用的时候,对照着查一下手册就行了,对于其中的语法不必深入记忆,给大家贴出一个网址,就是Makefile的手册:http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/index.html

Makefile就说到这,然后就是对它们进行编译了,就是在它们(.c文件和Makefile文件)所在的目录下,输入命令: make ,如果没有错误提示的话,就会生成一些文件,目前我们只关心hellomod.ko)这个文件,如果有的话,就正确了。然后输入: sudo insmod hellomod.ko,如果没有任何提示,说明正确,然后输入: dmesg ,查看系统日志,可以在后面几行看到一句话,内容就是Hello Kernel World,说明模块正确加载到系统中。下面就是卸载模块,输入命令: sudo rmmod hellomod ,在输入dmesg查看日志,会看到Good bye Kernel,卸载成功!其实就是先进门,然后又出门的过程。要说的一点就是,一个模块,如果已经插入到系统中,就不能再次插入了。

这只是一个简单的模块编程的例子,目的与C语言中输出hello world是一样的,就是入门,希望大家在kernel的世界里,不止是能够hello一下,里面的世界还很精彩,后面呈现。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐