Chinaunix首页 | 论坛 | 博客
  • 博客访问: 809685
  • 博文数量: 76
  • 博客积分: 2211
  • 博客等级: 上尉
  • 技术积分: 1693
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-26 19:36
文章分类

全部博文(76)

文章存档

2012年(67)

2011年(9)

分类: LINUX

2012-01-06 14:02:28

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

  1. #include    
  2. #include    
  3. static int __init hello_init(void)  
  4. {  
  5.       printk(KERN_ALERT"/nHello Kernel World/n");  
  6.       return 0;  
  7. }  
  8. static void __exit hello_exit(void)  
  9. {  
  10.       printk(KERN_ALERT"/nGood bye Kernel/n");  
  11. }  
  12. module_init(hello_init);  
  13. module_exit(hello_exit);  
  14. MODULE_LICENSE(“GPL”);  

貌似每个最基本的程序都是要输出hello world 啊,不知是谁定的。首先,模块编程的一个重要头文件就是,里面存储着有关模块编程的一些函数和定义。然后我们再看最后几句话,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文件是怎样的:

  1. obj-m += hellomod.o  
  2. CURRENT_PATH := $(shell pwd)  
  3. LINUX_KERNEL := $(shell uname -r)  
  4. LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)  
  5. all:  
  6.     make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules  
  7. clean:  
  8.     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的手册: 。

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

文章转自CSDN:http://blog.csdn.net/wzyhb123456789/article/details/5880325

阅读(1975) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

genehang2012-01-07 00:38:37

Linux设备模型之platform总线
http://linux.ctocio.com.cn/401/12174401.shtml