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

来源:互联网 发布:安卓数据访问 编辑:程序博客网 时间:2024/04/30 11:40

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

 

貌似每个最基本的程序都是要输出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文件是怎样的:

 

对于一些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一下,里面的世界还很精彩,后面呈现。。。