您现在的位置是:网站首页> 硬件
设备驱动
- 硬件
- 2022-03-26
- 780人已阅读
驱动程序通过硬件连接到的计算机总线或通信子系统与设备进行通信。当调用程序调用驱动程序中的例程时,驱动程序向设备发出命令。设备将数据发送回驱动程序后,驱动程序可以调用原始调用程序中的例程
程序目的
设备驱动程序的主要目的是通过充当硬件设备与使用该设备的应用程序或操作系统之间的转换器来提供抽象。程序员可以独立于最终用户使用的任何特定硬件来编写更高级别的应用程序代码。例如,用于与串行端口交互的高级应用程序可能仅具有“发送数据”和“接收数据”两个功能。在较低级别上,实现这些功能的设备驱动程序将与安装在用户计算机上的特定串行端口控制器进行通信。控制16550 UART所需的命令与控制FTDI所需的命令有很大不同串行端口转换器,但是每个特定于硬件的设备驱动程序都将这些详细信息抽象到相同(或相似)的软件接口中。
设备驱动的发展
编写设备驱动程序需要深入了解给定平台功能的硬件和软件工作方式。因为驱动程序需要对硬件功能的低级别访问才能运行,所以驱动程序通常在特权较高的环境中运行,并且如果出现问题,可能导致系统运行问题。相反,可以停止现代操作系统上的大多数用户级软件,而不会严重影响系统的其余部分。如果对设备进行了错误的编程,即使在用户模式下执行的驱动程序也可能使系统崩溃。这些因素使诊断问题更加困难和危险。
因此,编写驱动程序的任务通常落在为硬件开发公司工作的软件工程师或计算机工程师身上。这是因为与大多数外部人士相比,他们在硬件设计方面拥有更好的信息。此外,从传统意义上讲,为了保证其客户可以最佳方式使用其硬件,符合硬件制造商的利益。通常,逻辑设备驱动程序(LDD)由操作系统供应商编写,而物理设备驱动程序(PDD)由设备供应商实现。但是,近年来,非供应商为专有设备编写了许多设备驱动程序,主要用于免费和开源 操作系统。在这种情况下,硬件制造商提供有关设备通信方式的信息非常重要。尽管可以通过逆向工程来学习此信息,但是使用硬件要比使用软件困难得多。
Microsoft尝试通过创建用于驱动程序开发的新框架称为Windows Driver Foundation(WDF)来减少由于设备驱动程序编写不当而引起的系统不稳定。这包括鼓励用户开发某些类型的驱动程序(主要是那些实现基于消息的协议以与其设备通信的驱动程序)的用户模式驱动程序框架(UMDF),作为用户模式驱动程序。如果此类驱动程序发生故障,则不会引起系统不稳定。在内核模式驱动程序框架 (KMDF)模型继续允许开发内核模式设备驱动程序,但是尝试提供已知会引起问题的功能的标准实现,包括取消I / O操作,电源管理以及即插即用设备支持。
苹果有一个用于在macOS上开发驱动程序的开源框架,称为I / O Kit。
在Linux环境中,程序员可以将设备驱动程序作为内核的一部分,分别作为可加载模块或作为用户模式驱动程序来构建(对于存在内核接口的某些类型的设备,例如USB设备)。Makedev包含Linux中设备的列表,包括ttyS(终端)、lp(并行端口)、hd(磁盘)、循环和声音(其中包括Mixer、sequencer、dsp和音频)。
Microsoft Windows .sys文件和Linux .ko文件可以包含可加载的设备驱动程序。可加载设备驱动程序的优点在于,仅在必要时才可以加载它们,然后再将其卸载,从而节省了内核内存。
内核模式与用户模式
设备驱动程序,特别是在现代Microsoft Windows平台上,可以在内核模式(x86 CPU上为Ring 0)或在用户模式下(x86 CPU上为Ring 3)运行。在用户模式下运行驱动程序的主要好处是提高了稳定性,因为编写不良的用户模式设备驱动程序无法通过覆盖内核内存来使系统崩溃。另一方面,用户/内核模式转换通常会带来相当大的性能开销,因此使内核模式驱动程序成为低延迟网络的首选。
用户模块只能通过使用系统调用来访问内核空间。最终用户程序(例如UNIX Shell或其他基于GUI的应用程序)是用户空间的一部分。这些应用程序通过内核支持的功能与硬件交互。
虚拟设备驱动程序
虚拟设备驱动程序代表设备驱动程序的特定变体。它们用于仿真硬件设备,特别是在虚拟化环境中,例如在Microsoft Windows计算机上运行DOS程序时或在Xen主机上运行客户机操作系统时,例如。虚拟设备驱动程序没有使来宾操作系统与硬件对话,而是扮演相反的角色并模拟一块硬件,从而使来宾操作系统及其驱动程序在虚拟机中运行可能会有访问真实硬件的幻想。来宾操作系统尝试访问硬件的尝试被路由到主机操作系统中的虚拟设备驱动程序,例如 函数调用。虚拟设备驱动程序还可以将模拟的处理器级事件(例如中断)发送到虚拟机中。
虚拟设备也可以在非虚拟环境中运行。例如,虚拟网络适配器与虚拟专用网络一起使用,而虚拟磁盘设备与iSCSI一起使用。虚拟设备驱动程序的一个很好的例子是Daemon Tools。
虚拟设备驱动程序有多种变体,例如VxD、VLM和VDD。