论文摘要
设备驱动程序是计算机系统中最重要的组成部分之一,应用程序和操作系统都需要通过设备驱动程序对外设进行管理和操作。此外,设备驱动程序代码在现代操作系统中占据了非常大的比重,比如在Linux和windows中70%以上的代码为各类设备的驱动程序。与此同时,设备驱动程序也是操作系统中各类错误最主要的源头,已有研究的统计结果表明,驱动程序平均每行中的错误几倍于操作系统其它部分的代码。设备驱动程序体量庞大且易于出错是由其自身复杂性较高所决定的。驱动程序需要按照操作系统制定的驱动程序规范的要求,根据系统硬件平台的配置,遵照设备制造商定义的设备操作规范,对硬件设备进行管理和操作。设备驱动程序中关于操作系统,硬件平台和设备的代码交织在一起,相互影响,使得驱动程序结构非常复杂,开发、测试和维护起来非常困难。另外,操作系统,硬件平台和设备中任意一个要素发生变化都会导致设备驱动程序的重新构造。因此,如何提高设备驱动程序的开发效率,如何减少设备驱动程序中的错误,提高驱动程序的质量,一直是系统软件开发关注的主要问题。针对上述问题,本文研究了一种模块化设备驱动开发方法,提出将复杂的设备驱动程序按照功能划分为操作系统模块,设备模块以及系统平台模块三个相对独立的部分分别进行开发。通过明确定义三个模块之间的接口,以模块间接口上方法的相互调用,将模块集成在-起构造出最终的驱动程序。运用这一方法,针对以太网网卡类设备设计了模块化设备驱动开发框架。接着对框架进行实例化,为Realtek RTL8019AS,Realtek RTL8150,DM9000,以及CS8900A四块网卡构造了在Linux和VxWorks两种操作系统下的网卡设备驱动程序。随后的实验表明:框架支持三个模块相互分离,独立开发,可以对驱动的复杂性进行有效地控制;操作系统模块能够在同一类设备的驱动中复用,设备模块能够在不同操作系统的驱动中复用,可以有效降低开发工作量,减少错误的发生;同时与原有驱动相比,新框架下开发的驱动,没有明显的性能损失。具体来说,本文的主要工作如下:(1)提出了一种模块化设备驱动开发方法。该方法将复杂的设备驱动分解为系统平台模块、设备模块以及操作系统模块。系统平台模块描述了设备所在系统平台的硬件配置参数,可以由系统制造商完成;设备模块提供并实现了控制和管理一类设备的接口,以及提供一类设备的属性和状态的描述,可以由设备制造商完成;操作系统模块通过读取系统平台硬件配置参数,调用设备控制接口以及同内核交互,根据操作系统定义的驱动程序规范,最终实现了驱动程序,可以由操作系统提供商来完成。此方法允许我们将复杂的设备驱动开发任务分担到不同的角色,由他们各自承担自己模块的开发,然后系统平台模块、设备模块和操作系统模块三者通过明确定义接口上的方法调用,最终构造出新的设备驱动程序。实现了在大大降低驱动程序开发复杂性以及提高驱动质量的同时,使得驱动程序可以在不同设备、不同操作系统和不同硬件平台环境下进行复用。(2)基于提出的模块化设备驱动开发方法,设计了针对网卡类设备的模块化设备驱动开发框架:系统平台模块为其它模块提供系统平台参数的获取方法,描述了网卡设备所处的硬件环境,包括中央处理器描述,总线描述,中断描述以及地址空间描述;网卡设备模块面向网卡类操作系统模块提供了网卡类设备控制层的(包括网卡类设备属性,网卡类设备状态以及网卡类设备功能)调用,并针对其中定义的网卡类设备功能编写了对应的代码实现;网卡类操作系统模块实现了操作系统提供给网卡类驱动程序实现的驱动接口,将其转换为对网卡类设备功能接口的调用,转换过程中会与操作系统交互(调用内核提供的基本内核服务,当前子系统提供的服务以及其他子系统提供的服务),调用网卡设备模块提供的网卡类设备属性和网卡设备类状态,以及调用系统平台模块提供的系统平台参数。(3)基于给出的网卡类设备的模块化设备驱动开发框架,本文针对Linux和VxWorks两种操作系统,分别为Samsung s3c2410嵌入式片上系统平台上的RTL8019AS网卡,Samsungs3c2440嵌入式片上系统平台上面的DM9000网卡,Samsung s3c2440嵌入式片上系统平台上的CS8900A网卡,以及Realtek公司的RTL8150 USB网卡共四块网卡分别开发了对应的操作系统模块、设备模块和系统平台模块,并构造出最终的驱动程序。通过复用和组合不同的操作系统模块,设备模块以及硬件平台模块,灵活地构造出了上述四块网卡在两个操作系统平台上的驱动程序。以生成的设备驱动程序为案例,对驱动程序的正确性,驱动模块开发过程的开发效率(复杂性控制和驱动模块的复用),以及生成的设备驱动程序的性能三个方面进行了实验评估。