Linux驱动程序基础知识学习


Linux通过设备驱动程序为应用程序提供了统一抽象的接口,从而隐藏了大量不同设备之间的区别和细节,在Linux中对硬件设备的操作和通常的文件一样,利用标准的文件操作可以对设备上进行打开、关闭、读取或者写入操作。系统中的每个设备由“设备特殊文件”来代表。例如,/dev/hda代表系统中的第一个IDE硬盘,每个由相同的设备驱动程序控制的设备具有相同的主设备号,而次设备号则用来区分同类设备中的不同设备,设备特殊文件的虚拟文件系统(Virtual File System,简称VFS)索引节点中包含设备号信息,如果通过系统调用访问设备,则内核通过该VFS索引节点汇总的设备号信息调用适当的设备驱动程序。

  Linux系统中的设备分为字符设备(char device)、块设备(block)和网络设备(net device)三种,字符设备是指在存取时没有缓存,能够像文件一样被访问的设备,字符设备驱动程序至少要实现open、close、read和write系统调用。字符终端(/dev/console)以及系统的串口(/dev/tty0)就属于字符设备。字符设备可以通过文件系统节点来访问,它和普通文件的之间的唯一差别在于,对普通文件的访问可以前后移动访问指针,而大多数的字符设备是只能顺序访问的数据通道。

  和字符设备一样,块设备也是通过/dev目录下的文件系统节点被访问的。Linux允许应用程序像字符设备那样读写块设备,可以一次传递任意多字节的数据。块设备与字符设备的区别仅仅在于内核内部管理数据的方式不同,也就是内核和驱动程序的接口不同,它们之间的差异对用户来说是透明的。此外,块设备读写需要缓存来支持,只能以块为单位进行读写,而且能够随机存取,既不管所需要的块处于设备的什么地方都可以读写,字符设备则没有这个要求。块设备主要包括硬盘、软盘、CD-ROM等。

  网络设备不是面向流的设备,在Linux中作专门的处理,用户不能通过文件设备接点来访问,而且内核和网络驱动程序之间的通信完全不同于内核和字符设备以及块设备之间的通信,内核调用一套和数据包传输相关的函数来处理网络设备。

  Linux核心中虽然存在许多不同种类的设备驱动程序,但是它们都有一些共同的特点:

  ⑴核心代码:设备驱动程序是核心的一部分,像核心中其他的代码一样,出错将导致系统的严重损伤。一个编写不当的设备驱动程序甚至能够使系统崩溃导致文件系统的破坏和数据的丢失;

  ⑵核心接口:设备驱动程序必须为Linux核心或者其从属的子系统提供一个标准的接口;

  ⑶核心机制:设备驱动程序可以使用标准的核心服务比如内存分配、中断发送和等待对列等;

  ⑷动态可加载:多数的Linux设备驱动程序可以在核心模块发出加载请求时进行加载,同时在不使用设备时进行卸载,这样核心可以有效地利用系统的资源;

  ⑸可配置:Linux设备驱动属于核心的一部分,用户可以根据自己的需要进行配置来选择适合自己的驱动。

相关内容