作者:华清远见嵌入式学院。简单地说,驱动程序就是设置某个硬件完成其固有功能的程序,如网卡设备驱动程序就是设置网卡相关寄存器,使其能够正常收发网络数据包的程序。驱动程序直接与硬件设备交互,其大多数的工作就是操作硬件相关寄存器。首先,寄存器也是一种 RAM,在系统下电后,寄存器中的内容都会丢失,系统上电复位过程中,硬件寄存器一般都复位到一个默认值,默认状态下,硬件是不能正常工作的,如中断使能被屏蔽,工作使能位也被屏蔽,还有一些决定硬件工作情况的关键控制寄存器也需要被重新配置。而这些工作都有赖于设备驱动的完成。驱动一般都作为操作系统内核组成的一部分,即便现在很多系统支持驱动的动态加载,但是驱动代码在执行时,依然是以内核代码模式进行执行的。换句话说,驱动代码具有系统特权级,除了其自身资源对应的硬件设备资源,其还对操作系统资源具有完全的访问权。所以,一个驱动程序如果存在BUG,将直接会导致整个操作系统的崩溃。故调试驱动是一项十分关键的工作,必须对驱动进行仔细检查,并需要经受长时间的运行考验。应用层程序员往往对属于内核编程的外设驱动心存敬畏,认为驱动编程是一项非常复杂的工作。实际上,底层驱动编程往往比应用层编程具有更大的灵活性,就如没有调试不出来的硬件,也没有调试不出来的底层驱动,但是应用层 BUG 有时就是无法调试出来。底层驱动的调试过程是同时对硬件和驱动进行验证的过程。底层驱动很多时候用来定位硬件设计错误或者硬件芯片本身可能的问题,故底层驱动程序员必须对所要驱动的硬件设备有一个比较充分的了解,以及对与硬件交互的其他硬件或外界环境也需要有一个比较清楚的理解。
在深入探讨VxWorks设备驱动开发之前,我们需要了解什么是设备驱动。设备驱动是操作系统内核的一个组成部分,它的主要作用是设置和管理硬件设备,使它们能够执行其设计的功能。例如,网卡驱动负责配置网卡的寄存器,确保网卡能够发送和接收数据包。设备驱动直接与硬件设备进行交互,大部分工作涉及操作硬件相关的寄存器。寄存器是一种易失性内存,在系统断电后,其内容会丢失。因此,系统上电复位后,需要重新配置硬件寄存器才能使硬件正常工作。
驱动程序通常具有系统特权级,可以访问操作系统资源和硬件设备资源。这意味着驱动程序中若存在BUG,可能会导致整个系统的崩溃。因此,驱动程序的调试工作非常关键,需要经过长时间的运行和严格的检查。
设备驱动在操作系统中承担中间转换的角色,负责将操作系统的请求转换为对硬件的操作。VxWorks中的BSP(Board Support Package,板级支持包)移植工作主要包括编写特定平台硬件设备的驱动程序,这显示了驱动程序编写能力在BSP移植中的重要性。本章将详细探讨VxWorks下各种外设驱动程序的设计原理、框架及内核相关代码,以便读者能够自信地编写驱动程序。
编写设备驱动不仅是了解操作系统的有效途径,而且是深化对操作系统理论和概念理解的重要手段。设备驱动的功能和灵活性由驱动程序员决定。驱动可以提供基本的功能,也可以实现灵活的底层机制供用户使用。驱动程序同时包含主动和被动两个方面:主动方面体现在对硬件的积极操作,例如网卡驱动主动接收数据包;被动方面则体现在对用户请求的响应,例如网卡驱动在接收到网络数据包后,将数据包交给操作系统进行管理,而非直接交给用户。这表明驱动提供了服务机制,而使用机制的方式则由用户决定。
驱动程序员在编写底层驱动代码时,不应强加任何使用前提条件给用户。驱动程序应该允许用户以多种方式与硬件交互,比如可以提供直接控制寄存器的能力,或者仅提供读写操作,隐藏其他复杂操作。设备驱动的功能和灵活性之间的平衡,以及如何呈现硬件设备给用户,都由驱动程序员在设计驱动时来决定。
从以上描述可以看出,设备驱动开发是一个既重要又复杂的过程,它需要驱动程序员具备深厚的技术功底和对硬件设备的深刻理解。在开发VxWorks设备驱动时,需要考虑到系统的稳定性和性能,同时还需要保证驱动程序的安全性和可靠性。随着技术的发展,对设备驱动的性能和稳定性要求也越来越高,因此驱动程序的编写和测试工作在操作系统开发和硬件管理中占据了举足轻重的地位。