如何学习linux设备驱动
作者:于连庆,华清远见嵌入式培训中心讲师. Linux系统目前主要维护2.4和2.6两个内核版本,在http://www.kernel.org/ 网站上已经可以下载到最新的2.6内核linux-2.6.38.6,及最新的2.4内核linux-2.4.37.11.稳定版本号基本上是1~3月更新一次,如:2.6.35至2.6.36,升级版本号每1~2周更新一次,如:2.6.35.1至2.6.35.2. 升级后的高版本内核并不完全兼容低版本内核,内核升级对于从事linux开发的技术人员来说影响很大,特别是对于那些刚刚从事linux开发的人员. 通常,内核的升级对从事linux应用程序开发的人员来说影响较小,系统调用基本保持兼容,影响比较大的是驱动开发人员.每次内核的更新都可能导致许多内核函数原型上的变化,其中既有内核本身提供的函数,也有硬件平台代码提供的函数,后者变化的更加频繁.这一点从许多经典书籍就可验证,当你按照手里的经典著作,如:Alessandro的《linux设备驱动程序》,编写驱动时,发现并不能够成功的在你的linux平台上编译通过、或不能正常执行,原因就在于你用的内核和书里的不一致. 本文从两个方面去解释这个问题,一方面是如何写好linux设备驱动,另一方面是如何应对不断升级的内核. 如何写好Linux设备驱动 Linux设备驱动是linux内核的一部分,是用来屏蔽硬件细节,为上层提供标准接口的一种技术手段.为了能够编写出质量比较高的驱动程序,要求工程师具备以下几个方面的知识: ● 熟悉处理器的性能 如:处理器的体系结构、汇编语言、工作模式、异常处理等.对于初学者来说,在还不熟悉驱动编写方法的情况下,可以先不把重心放在这一项上,可能它的枯燥、抽象而影响到你对设备驱动的兴趣.随着你不断地熟悉驱动的编写,你会很自然的意识到此项的重要性.
● 掌握驱动目标的硬件工作原理及通讯协议 如:串口控制器、显卡控制器、硬件编解码、存储卡控制器、I2C通讯、SPI通讯、USB通讯、SDIO通讯、I2S通讯、PCI通讯等.编写设备驱动的前提就是需要了解设备的操作方法,这些内容的重要程度不言而喻.但不是说要把所有设备的操作方法都熟悉了以后才可以写驱动,你只需要了解你要驱动的硬件就可以了. ● 掌握硬件的控制方法 如:中断、轮询、DMA 等,通常一个硬件控制器会有多种控制方法,你需要根据系统性能的需要合理的选择操作方法.初学阶段以实现功能为目的,掌握的顺序应该是,轮询->中断->DMA.随着学习的深入,需要综合考虑系统的性能需求,采取合适的方法. ● 良好的GNU C语言编程基础 如:C语言的指针、结构体、内存操作、链表、队列、栈、C和汇编混合编程等.这些编程语法是编写设备驱动的基础,无论对于初学者还是有经验者都非常重要. ● 良好的linux操作系统概念 如:多进程、多线程、进程调度、进程抢占、进程上下文、虚拟内存、原子操作、阻塞、睡眠、同步等概念及它们之间的关系.这些概念及方法在设备驱动里的使用是linux设备驱动区别单片机编程的最大特点,只有理解了它们才会编写出高质量的驱动. ● 掌握linux内核中设备驱动的编写接口 如:字符设备的cdev、块设备的gendisk、网络设备的net_device,以及基于这些基本接口的framebuffer设备的fb_info、mtd设备的mtd_info、tty设备的tty_driver、usb设备的usb_driver、mmc设备的mmc_host等.
Linux内核为设备驱动编写者提供了标准的接口,驱动编写者无需精通内核的各个部分,只需要明确内核提供给我们的接口,并实现此接口就可以了.内核提供的接口采用的是面向对象的思路,即把目标设备抽象成一个对象,通常利用一个结构体来描述这个对象.驱动工程师的任务就是实现这个对象.这个结构体中会包含设备的属性(用变量表示)和操作方法(用函数指针表示).如:字符设备的cdev struct cdev { |
||
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |