当前位置:首页 期刊杂志

嵌入式Linux驱动程序框架研究综述*

时间:2024-08-31

戴明华,李长云,曾志浩,崔海燕

(湖南工业大学计算机与通信学院,湖南 株洲 412008)

嵌入式Linux驱动程序框架研究综述*

戴明华,李长云,曾志浩,崔海燕

(湖南工业大学计算机与通信学院,湖南 株洲 412008)

嵌入式Linux的驱动框架能缩短开发周期,因此构建框架对驱动开发有着很重要的意义.介绍了目前驱动研究现状,阐述了构建嵌入式Linux驱动框架的方式并进行了评价,探析了未来基于Linux内核的Android操作系统的驱动框架实现.

嵌入式驱动框架;Android驱动;实现方法;可移植

以嵌入式操作系统为核心的嵌入式系统,能运行于各种不同体系结构的微处理器上,兼容性好,内核体积小,效率比较高,具有高度的模块化和可扩展性.对设备的支持需要相应的驱动程序.嵌入式 Linux是以Linux为基础的嵌入式系统,在原来的Linux基础上裁剪而成的精简的操作系统,它被广泛应用在移动电话、机顶盒、数据网络、远程通信、医疗电子、交通运输计算机外设、工业控制、媒体播放器、消费性电子产品以及航空航天等领域中.目前,嵌入式Linux开发主要集中在设备驱动开发上;在嵌入式Linux中,驱动占有内核代码的70%以上,驱动开发的质量关系到整个系统的稳定[1],大多数驱动没有标准化,在移植的时候,驱动代码一般由硬件制造者而不是专业内核编程者编写.由于Linux驱动和内核共享地址空间等原因造成移植开发的驱动稳定性不够[2],为了更快且较稳定地开发驱动,建立驱动框架来减少开发周期和增强稳定性就很有研究价值.本文非常全面地介绍了嵌入式驱动程序框架,分析优点的同时也对框架存在的问题和未来研究方向提出了我们的观点.

1 嵌入式Linux驱动程序研究现状

1.1 嵌入式Linux相关概念

嵌入式Linux驱动程序是操作系统内核和硬件之间的接口,连接硬件设备和文件系统,是硬件的一部分特殊响应定义好的内部编程接口.硬件设备在Linux看来只是一个设备文件,这些文件一般称作设备文件,使得应用程序可以像操作普通文件一样对硬件设备进行操作.嵌入式Linux系统的驱动程序分为字符设备驱动、块设备驱动和网络设备驱动三种,字符设备是指存取时没有缓存的设备;块设备的读写都有缓存来支持,并且块设备必须能够随机存取.典型的字符设备包括鼠标、键盘、串行口、音频设备等.块设备主要包括硬盘软盘设备、CD-ROM以及各种flash等.

1.2 嵌入式Linux设备驱动程序的编写

设备驱动是作为文件系统的一个模块存在的,它既负责和硬件的交互,同时通过挂载在文件系统上和内核联系起来.

驱动程序的构成主要包括三个重要部分[3]:1)初始化.在静态链接驱动中由__init修饰的函数和在可加载驱动中用入口点函数init_module()对驱动进行初始化,初始化包括硬件相关参数、申请内存、注册.2)独立的设备的接口.该接口由struct file_operations这个数据结构来实现,系统调用和驱动程序通过数据结构struct file_operations联系起来.这个结构的每一个成员的名字都对应着一个系统调用,系统调用通过设备文件的主设备号找到相应的设备驱动程序.3)硬件相关部分.这一部分和硬件直接相关,包括I/O服务和中断服务.

这是Linux的设备驱动程序编写工作的基本原理.因此设备驱动程序的实现首先要初始化,然后实现file_operations的各个域,最后静态链接或动态加载驱动程序.

1.3 嵌入式Linux框架的实现方式

框架的方式一种是从驱动开发的角度,从同类型设备中找出相似点,包括数据结构、接口函数、注册与注销函数、中断的申请与释放函数,使用模块化编程思想.

另一种是从面向对象的角度,驱动中建立可重用的类库,用来封装常用的数据结构和算法,将程序的加载、初始化、卸载等相关流程进行封装管理[4].

2 嵌入式Linux驱动程序框架实现方法

从能否动态加载的角度看,Linux中的驱动程序可分为可动态加载和卸载的内核模块和静态链接的内核,而根据Linux对驱动的管理方式则可以把驱动分为字符驱动、块设备驱动和网络驱动,应用程序对字符设备的每一个I/O操作,都会传递给系统内核对应的驱动程序,而对于块设备的操作,要经过系统的缓冲区管理,间接传递给驱动程序处理.网络驱动则是基于BSD UNIX的套接字机制,在系统和驱动程序之间定义有专门的数据结构进行数据传输,系统提供流量控制机制和多协议支持.可见字符设备,块设备和网络设备所用的驱动差别很大,因此在构建驱动框架的时候分类型构建框架更加容易找到通性.

2.1 字符框架

字符设备驱动程序是最基本、最常用的驱动程序结构,只要是不挂载文件系统的设备,都可以用字符设备去描述.

一个字符设备是一种可以当作一个字节流来存取的设备就如同一个文件,这样的驱动常常实现常用的系统调用,串口是最为常见的字符设备,它很好地展现了字节流的抽象.字符设备通过文件系统结点来存取,相对于可以随机存取普通文件,字符设备仅仅是数据通道,因此只能顺序存取.

文献[5]给出嵌入式设备驱动驱动程序的共性,包括:读、写、中断、时钟.实现嵌入式设备驱动流程,总结了传统驱动基本组成部分:模块初始化函数;模块卸载函数;设备驱动程序接口,李健等人[6]在基于嵌入式实时操作系统的驱动框架中通过屏蔽底层硬件处理器、规范总线接口、抽象设备访问接口,结合设备驱动表、设备表、文件描述符表、总线驱动支持、设备中断处理机制给出设备驱动基本框架.该驱动框架包括1、I/O标准接口2、文件描述符管理3、设备表、驱动表4、文件系统管理5、通信协议层6、协议适配层7、底层驱动层8、实时操作系统支持接口.该框架支持了目前主流的总线及设备,支持集成了传统I/O系统的文件系统、网络协议栈等模块,能够支持各种设备,又能使各子系统信息互通,增强了可移植性.

文献[4]从代码的可重用的角度出发,用面向对象的方法,封装对驱动生命周期和行为管理的驱动框架,将C++语言引入到内核中,加速了开发速度,该方法改变了传统上使用c语言开发内核,使用c++来实现驱动与内核的兼容,内核能对c++编码的驱动进行加载卸载,同时,c++的继承等重要特性依然保留在驱动程序中.

在字符程序的框架中,按照代码的框架来写只适合用来开发比较简单的驱动,在复杂驱动的开发中,至少要使用文献[6]中的框架或者用可重用的面向对象的方法,才能不针对每一个具体的硬件作出大范围的修改,硬件开发者也不需要了解太多关于硬件的细节也可进行驱动的开发.

2.2 块设备框架

关于块设备驱动的研究甚少,主要由于有部分块设备驱动可以用字符驱动形式来开发,如PCI、LCD等.

在块设备中比较典型的有flash,它由于芯片的存储布局以及存储操作与字符型完全不同,不能按照字符型设备驱动进行开发.以flash为例,驱动主要功能包括[7]:初始化、用接口函数和内核函数完成内核与用户之间的数据交换以及检测设备错误信息.块设备都以块作为单位进行数据读写,要构建缓存来存放临时数据,块设备中大容量的数据使得纠错机制成为块设备驱动不可忽视的一部分[8].

2.3 网络设备框架

网络设备与字符与块这两种I/O驱动完全不同,在Linux里有专门的处理机制.Linux的网络系统主要是基于BSD unix的socket机制.系统支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持.文献[9]中网络设备驱动体系结构可以分为四个层次,即协议接口、网络设备接口、驱动功能层、网络媒介,网络设备被抽象为一个接口,是一个对网络设备的操作集合.如下图:

图1 网络设备驱动体系结构图

从Linux的结构来看,Linux所有网络驱动程序都使用了通用的接口,每个设备都有自己的数据和方法,对于网络设备程序,由于Linux网络的驱动程序结构本来有网络协议接口、网络设备接口,提供实际功能的功能层、网络设备媒介,因此在网络框架上都是在原来的基础上略加改进.

3 总结与展望

从Linux的出现到学者开始在Linux架构的基础上开始驱动的改进和驱动新框架的提出,Linux的三大类驱动都产生了新的开发方式.

本文介绍了驱动的相关概念,阐述了驱动的构成,同时从诸多文献实现框架的方式中,综合了各种类型驱动的框架结构,进行了相应评价.现在基于Linux内核的嵌入式操作系统正在兴起,这些操作系统下的驱动有着和Linux相似之处.因此,Linux驱动框架的研究能够推动其它如Android嵌入式操作系统驱动框架的研究.

Android内核是在标准Linux内核的基础上修改而成的且适应嵌入式硬件环境.Android驱动框架的形成增强了可移植性,提高了效率.由于这是在底层开发,因此在框架构建和可移植性上,主要有以下两个需要了解:

Android不同于Linux主要体现在没有使用Linux的C库——glibc,增加了模拟CPU和文件系统.在驱动支持方面,既开发了基于OpenBinder框架的Android Binder驱动,还拥有电源管理、低内存匿名共享、连续物理内存等专有驱动.在Android系统中,需要有基本的屏幕、触摸屏、键盘等驱动程序,以及音频、摄像头、Event、电话的 Modem、Wifi、蓝牙等多种设备驱动程序.当进行嵌入式软件开发时,可移植性是要重点考虑的问题.良好的软件移植性应该比较好,减少与外围设备的相关性.软件的通用性和软件的性能通常是矛盾的.Linux驱动研究比较充分,而以Linux为内核的其它操作系统开始发展,因此研究应以Linux驱动框架的研究为基础.

[1]Chou A,Yang J,Chelf B,et al.An empiracle study of operating system errors[J].ACM SIGOPS Operating Systems Review,2001,(5):73-88.

[2]Herder J N,Bos H,Gras B,et al.Construction of a highly dependable operating system[A].Proceedings of the Sixth European Dependable Computing Conference[C].Coimbria:IEEE,2006.

[3]梁金千,张跃,甄成.Linux设备驱动程序架构的研究[J].计算机工程与应用,2002,(8):119 -122.

[4]袁丽慧,彭磊.可重用 Linux设备驱动程序框架[J].计算机工程,2008,(10):89 -94.

[5]李桥.嵌入式Linux设备驱动程序的开发研究[J].计算机与数字工程,2009,(2):87 -97.

[6]李健,李明禄,张激,等.基于嵌入式实时操作系统的驱动框架[J].计算机工程,2007,(21):273 -275.

[7]李胜朝,黄先祥,周召发.嵌入式Linux下块设备驱动程序的开发[J].机电工程技术,2007,(6):26 -28.

[8]郑千洪,王黎,高晓蓉.嵌入式平台上NAND FLASH的驱动实现[J].微计算机信息,2009,(11):103 -105.

[9]张俊才,马强.Linux下网络设备驱动程序研究[J].实验科学与技术,2008,(4):51 -53.

TP311

A

1008-4681(2012)02-0052-02

2011-12-06

戴明华(1985-),男,湖南宁乡人,湖南工业大学计算机与通信学院硕士生.研究方向:可信软件.

(责任编校:晴川)

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!