戴文的Linux内核专题：03 驱动程序
===========================

驱动程序是使内核能够沟通和操作硬件或协议（规则和标准）的小程序。没有驱动程序，内核不知道如何与硬件沟通或者处理协议（内核实际上先发送指令给BIOS，然后BIOS传给硬件）。 Linux的内核代码在驱动程序文件夹中以源代码的形式包含了许多驱动程序。驱动文件夹中的每个文件夹会在下面说明。在配置和​​编译内核时，这样有助于你了解驱动程序。否则，用户可能会在编译时加入不必要的或者漏掉重要的驱动。驱动代码通常会包含一个单行注释来指出驱动的目的。 比如，tc的驱动代码，有一行的注释说是用于TURBOchannel总线。由于这些文档，用户应该看驱动前几行的注释来了解它们的用途。

有几个术语你应该已经知道，所以下面的信息应该是明白的。一个I/O设备指的是输入/输出设备。例如调制解调器和网卡，他们发送和接收数据。监视器是一个输出设备 - 只有信息出来。键盘、鼠标和游戏杆是数据输入系统。存储设备用于存储数据，例如SD卡、硬盘、光盘、存储卡等。CPU（处理器）是计算机的“大脑”或“心脏” ，如果没有它，电脑就无法运作。主板则是一块连接板上不同组件的印刷线路板。主板及各个组件是计算机的运行的基础。许多计算机用户说主板是电脑的心脏（主板上有CPU）。主板包含了用于连接外设的端口，外设包括输入、输出和存储设备。总线是主板的电路，它连接着外设。网络设备用于两台或多台计算机之间的连接。端口则是用户可以插入另外一台设备或一根电缆的设备，例如，用户可以将插入一根火线记忆棒插入一个火线端口；将以太网电缆插入一个以太网端口。光碟的读取是利用激光，从可以散射或反射的激光的反射面上读出数据，一个常见的​​光盘是DVD。许多系统说自己是32位或者64位，这指的是寄存器、地址总线或数据总线的位数。例如，在一块64位的主板上，数据总线（组件之间的银线）有64根并排到目的的线。存储器地址以位(0和1)的形式在存储器中编址，因此，一个32位存储地址包含32个0和1来表示存储器上的某处地址。

许多驱动程序是通用驱动程序，这意味着一个通用键盘驱动可以使内核可以处理几乎所有的键盘。然而，有些驱动是专用驱动，像苹果和Commodore就分别为苹果电脑和Amiga系统制造了专门的硬件。Linux内核中已经包含了许多诸如智能手机、苹果、Amiga系统、PS3、Android平板，和许多其他设备的驱动程序。

注意有些设备的驱动不在本目录中。比如，射频驱动在net和media文件夹下。

**accessibility** - 这些驱动提供支持一些辅助设备。在Linux 3.9.4中，这个文件夹中只有一个驱动就是盲文设备驱动。

**acpi** - 高级配置和电源接口（ACPI : Advanced Configuration and Power Interface）驱动用来管理电源使用。

**amba** - 高级微控制器总线架构（AMBA : Advanced Microcontroller Bus Architecture）是与片上系统（SoC）的管理和互连的协议。SoC是一块包含许多或所有必要的计算机组件的芯片。这里的AMBA驱动让内核能够运行在这上面。

**ata** - 该目录包含PATA和SATA设备的驱动程序。串行ATA（SATA）是一种连接主机总线适配器到像硬盘那样的存储器的计算机总线接口。并行ATA（PATA）用于连接存储设备，如硬盘驱动器，软盘驱动器，光盘驱动器的标准。PATA就是我们所说的IDE。

**atm** - 异步通信模式(ATM : Asynchronous Transfer Mode)是一种通信标准。这里有各种接到PCI桥的驱动(他们连接到PCI总线)和以太网控制器(控制以太网通信的集成电路芯片)。

**auxdisplay** - 这个文件夹提供了三个驱动。LCD 帧缓存（framebuffer）驱动、LCD控制器驱动和一个LCD驱动。这些驱动用于管理液晶显示器 —— 液晶显示器会在按压时显示波纹。注意:按压会损害屏幕,所以请不要用力戳LCD显示屏。

**base** - 这是个重要的目录包含了固件、系统总线、虚拟化能力等基本的驱动。

**bcma** - 这些驱动用于使用基于AMBA协议的总线。AMBA是由博通公司开发。

**block** - 这些驱动提供对块设备的支持，像软驱、SCSI磁带、TCP网络块设备等等。

**bluetooth** - 蓝牙是一种安全的无线个人区域网络标准(PANs)。蓝牙驱动就在这个文件夹，它允许系统使用各种蓝牙设备。例如，一个蓝牙鼠标不用电缆，并且计算机有一个电子狗(小型USB接收器)。Linux系统必须能够知道进入电子狗的信号，否则蓝牙设备无法工作。

**bus** - 这个目录包含了三个驱动。一个转换ocp接口协议到scp协议。一个是设备间的互联驱动，第三个是用于处理互联中的错误处理。

**cdrom** - 这个目录包含两个驱动。一个是cd-rom，包括DVD和CD的读写。第二个是gd-rom(只读GB光盘)，GD光盘是1.2GB容量的光盘，这像一个更大的CD或者更小的DVD。GD通常用于世嘉游戏机中。

**char** - 字符设备驱动就在这里。字符设备每次传输数据传输一个字符。这个文件夹里的驱动包括打印机、PS3闪存驱动、东芝SMM驱动和随机数发生器驱动等。

**clk** - 这些驱动用于系统时钟。

**clocksource** - 这些驱动用于作为定时器的时钟。

**connector** - 这些驱动使内核知道当进程fork并使用proc连接器更改UID(用户ID)、GID(组ID)和SID(会话ID)。内核需要知道什么时候进程fork(CPU中运行多个任务)并执行。否则,内核可能会低效管理资源。

**cpufreq** - 这些驱动改变CPU的电源能耗。

**cpuidle** - 这些驱动用来管理空闲的CPU。一些系统使用多个CPU，其中一个驱动可以让这些CPU负载相当。

**crypto** - 这些驱动提供加密功能。

**dca** - 直接缓存访问（DCA ： Direct Cache Access）驱动允许内核访问CPU缓存。CPU缓存就像CPU内置的RAM。CPU缓存的速度比RAM更快。然而,CPU缓存的容量比RAM小得多。CPU在这个缓存系统上存储了最重要的和执行的代码。

**devfreq** - 这个驱动程序提供了一个通用的动态电压和频率调整(DVFS ： Generic Dynamic Voltage and Frequency Scaling)框架，可以根据需要改变CPU频率来节约能源。这就是所谓的CPU节能。

**dio** - 数字输入/输出（DIO ：Digital Input/Output）总线驱动允许内核可以使用DIO总线。

**dma** - 直接内存访问(DMA)驱动允许设备无需CPU直接访问内存。这减少了CPU的负载。

**edac** - 错误检测和校正（ Error Detection And Correction）驱动帮助减少和纠正错误。

**eisa** - 扩展工业标准结构总线（Extended Industry Standard Architecture）驱动提供内核对EISA总线的支持。

**extcon** - 外部连接器（EXTernal CONnectors）驱动用于检测设备插入时的变化。例如，extcon会检测用户是否插入了USB驱动器。

**firewire** - 这些驱动用于控制苹果制造的类似于USB的火线设备。

**firmware** - 这些驱动用于和像BIOS(计算机的基本输入输出系统固件)这样的设备的固件通信。BIOS用于启动操作系统和控制硬件与设备的固件。一些BIOS允许用户超频CPU。超频是使CPU运行在一个更快的速度。CPU速度以MHz(百万赫兹)或GHz衡量。一个3.7 GHz的CPU的的速度明显快于一个700Mhz的处理器。

**gpio** - 通用输入/输出(GPIO ：General Purpose Input/Output)是可由用户控制行为的芯片的管脚。这里的驱动就是控制GPIO。

**gpu** - 这些驱动控制VGA、GPU和直接渲染管理(DRM ：Direct Rendering Manager )。VGA是640*480的模拟计算机显示器或是简化的分辨率标准。GPU是图形处理器。DRM是一个Unix渲染系统。

**hid** - 这驱动用于对USB人机界面设备的支持。

**hsi** - 这个驱动用于内核访问像Nokia N900这样的蜂窝式调制解调器。

**hv** - 这个驱动用于提供Linux中的键值对(KVP ：Key Value Pair)功能。

**hwmon** - 硬件监控驱动用于内核读取硬件传感器上的信息。比如，CPU上有个温度传感器。那么内核就可以追踪温度的变化并相应地调节风扇的速度。

**hwspinlock** - 硬件转锁驱动允许系统同时使用两个或者更多的处理器，或使用一个处理器上的两个或更多的核心。

**i2c** - I2C驱动可以使计算机用I2C协议处理主板上的低速外设。系统管理总线(SMBus ：System Management Bus)驱动管理SMBus,这是一种用于轻量级通信的two-wire总线。

**ide** - 这些驱动用来处理像CDROM和硬盘这些PATA/IDE设备。

**idle** - 这个驱动用来管理Intel处理器的空闲功能。

**iio** - 工业I/O核心驱动程序用来处理数模转换器或模数转换器。

**infiniband** - Infiniband是在企业数据中心和一些超级计算机中使用的一种高性能的端口。这个目录中的驱动用来支持Infiniband硬件。

**input** - 这里包含了很多驱动，这些驱动都用于输入处理，包括游戏杆、鼠标、键盘、游戏端口（旧式的游戏杆接口）、遥控器、触控、耳麦按钮和许多其他的驱动。如今的操纵杆使用USB端口，但是在上世纪80、90年代，操纵杆是插在游戏端口的。

**iommu** - 输入/输出内存管理单元(IOMMU ：Input/Output Memory Management Unit)驱动用来管理内存管理单元中的IOMMU。IOMMU连接DMA IO总线到内存上。IOMMU是设备在没有CPU帮助下直接访问内存的桥梁。这有助于减少处理器的负载。

**ipack** - Ipack代表的是IndustryPack。 这个驱动是一个虚拟总线,允许在载体和夹板之间操作。

**irqchip** - 这些驱动程序允许硬件的中断请求(IRQ)发送到处理器，暂时挂起一个正在运行的程序而去运行一个特殊的程序（称为一个中断处理程序）。

**isdn** - 这些驱动用于支持综合业务数字网(ISDN)，这是用于同步数字传输语音、视频、数据和其他网络服务使用传统电话网络的电路的通信标准。

**leds** - 用于LED的驱动。

**lguest** - lguest用于管理客户机系统的中断。中断是CPU被重要任务打断的硬件或软件信号。CPU接着给硬件或软件一些处理资源。

**macintosh** - 苹果设备的驱动在这个文件夹里。

**mailbox** - 这个文件夹(pl320-pci)中的驱动用于管理邮箱系统的连接。

**md** - 多设备驱动用于支持磁盘阵列，一种多块硬盘间共享或复制数据的系统。

**media** - 媒体驱动提供了对收音机、调谐器、视频捕捉卡、DVB标准的数字电视等等的支持。驱动还提供了对不同通过USB或火线端口插入的多媒体设备的支持。

**memory** - 支持内存的重要驱动。

**memstick** - 这个驱动用于支持Sony记忆棒。

**message** - 这些驱动用于运行LSI Fusion MPT(一种消息传递技术)固件的LSI PCI芯片/适配器。LSI大规模集成，这代表每片芯片上集成了几万晶体管、

**mfd** - 多用途设备(MFD)驱动提供了对可以提供诸如电子邮件、传真、复印机、扫描仪、打印机功能的多用途设备的支持。这里的驱动还给MFD设备提供了一个通用多媒体通信端口(MCP)层。

**misc** - 这个目录包含了不适合在其他目录的各种驱动。就像光线传感器驱动。

**mmc** - MMC卡驱动用于处理用于MMC标准的闪存卡。

**mtd** - 内存技术设备(MTD ：Memory technology devices)驱动程序用于Linux和闪存的交互，这就就像一层闪存转换层。其他块设备和字符设备的驱动程序不会以闪存设备的操作方式来做映射。尽管USB记忆卡和SD卡是闪存设备，但它们不使用这个驱动，因为他们隐藏在系统的块设备接口后。这个驱动用于新型闪存设备的通用闪存驱动器驱动。

**net** - 网络驱动提供像AppleTalk、TCP和其他的网络协议。这些驱动也提供对调制解调器、USB 2.0的网络设备、和射频设备的支持。

**nfc** - 这个驱动是德州仪器的共享传输层之间的接口和NCI核心。

**ntb** - 不透明的桥接驱动提供了在PCIe系统的不透明桥接。PCIe是一种高速扩展总线标准。

**nubus** - NuBus是一种32位并行计算总线。用于支持苹果设备。

**of** - 此驱动程序提供设备树中创建、访问和解释程序的OF助手。设备树是一种数据结构，用于描述硬件。

**oprofile** - 这个驱动用于从驱动到用户空间进程(运行在用户态下的应用)评测整个系统。这帮助开发人员找到性能问题

**parisc** - 这些驱动用于HP生产的PA-RISC架构设备。PA-RISC是一种特殊指令集的处理器。

**parport** - 并口驱动提供了Linux下的并口支持。

**pci** - 这些驱动提供了PCI总线服务。

**pcmcia** - 这些是笔记本的pc卡驱动

**pinctrl** - 这些驱动用来处理引脚控制设备。引脚控制器可以禁用或启用I/O设备。

**platform** -这个文件夹包含了不同的计算机平台的驱动像Acer、Dell、Toshiba、IBM、Intel、Chrombooks等等。

**pnp** - 即插即用驱动允许用户在插入一个像USB的设备后可以立即使用而不必手动配置设备。

**power** - 电源驱动使内核可以测量电池电量，检测充电器和进行电源管理。

**pps** - Pulse-Per-Second驱动用来控制电流脉冲速率。这用于计时。

**ps3** - 这是Sony的游戏控制台驱动- PlayStation3。

**ptp** - 图片传输协议(PTP)驱动支持一种从数码相机中传输图片的协议。

**pwm** - 脉宽调制(PWM)驱动用于控制设备的电流脉冲。主要用于控制像CPU风扇。

**rapidio** - RapidIO驱动用于管理RapidIO架构，它是一种高性能分组交换，用于电路板上交互芯片的交互技术，也用于互相使用底板的电路板。

**regulator** - 校准驱动用于校准电流、温度、或其他可能系统存在的校准硬件。

**remoteproc** - 这些驱动用来管理远程处理器。

**rpmsg** - 这个驱动用来控制支持大量驱动的远程处理器通讯总线(rpmsg)。这些总线提供消息传递设施,促进客户端驱动程序编写自己的连接协议消息。

**rtc** - 实时时钟(RTC)驱动使内核可以读取时钟。

**s390** - 用于31/32位的大型机架构的驱动。

**sbus** - 用于管理基于SPARC的总线驱动。

**scsi** - 允许内核使用SCSI标准外围设备。例如,Linux将在与SCSI硬件传输数据时使用SCSI驱动。

**sfi** -简单固件接口(SFI)驱动允许固件发送信息表给操作系统。这些表的数据称为SFI表。

**sh** - 该驱动用于支持SuperHway总线。

**sn** - 该驱动用于支持IOC3串口。

**spi** - 这些驱动处理串行设备接口总线(SPI)，它是一个在在全双工下运行的同步串行数据链路标准,。全双工是指两个设备可以同一时间同时发送和接收信息。双工指的是双向通信。设备在主/从模式下通信(取决于设备配置)。

**ssb** - ssb(Sonics Silicon Backplane)驱动提供对在不同博通芯片和嵌入式设备上使用的迷你总线的支持。

**staging** - 该目录含有许多子目录。这里所有的驱动还需要在加入主内核前经过更多的开发工作。

**target** - SCSI设备驱动

**tc** - 这些驱动用于TURBOchannel，TURBOchannel是数字设备公司开发的32位开放总线。这主要用于DEC工作站。

**thermal** - thermal驱动使CPU保持较低温度。

**tty** - tty驱动用于管理物理终端连接。

**uio** - 该驱动允许用户编译运行在用户空间而不是内核空间的驱动。这使用户驱动不会导致内核崩溃。

**usb** - USB设备允许内核使用USB端口。闪存驱动和记忆卡已经包含了固件和控制器,所以这些驱动程序允许内核使用USB接口和与USB设备。

**uwb** - Ultra-WideBand驱动用来管理短距离，高带宽通信的超低功耗的射频设备

**vfio** - 允许设备访问用户空间的VFIO驱动。

**vhost** - 这是用于宿主内核中的virtio服务器驱动。用于虚拟化中。

**video** - 这是用来管理显卡和监视器的视频驱动。

**virt** - 这些驱动用来虚拟化。

**virtio** - 这个驱动用来在虚拟PCI设备上使用virtio设备。用于虚拟化中。

**vlynq** - 这个驱动控制着由德州仪器开发的专有接口。这些都是宽带产品，像WLAN和调制解调器，VOIP处理器，音频和数字媒体信号处理芯片。

**vme** - WMEbus最初是为摩托罗拉68000系列处理器开发的总线标准

**w1** - 这些驱动用来控制one-wire总线。

**watchdog** - 该驱动管理看门狗定时器，这是一个可以用来检测和恢复异常的定时器。

**xen** - 该驱动是Xen管理程序系统。这是个允许用户运行多个操作系统在一台计算机的软件或硬件。这意味着xen的代码将允许用户在同一时间的一台计算机上运行两个或更多的Linux系统。用户也可以在Linux上运行Windows、Solaris、FreeBSD、或其他操作系统。

**zorro** - 该驱动提供Zorro Amiga总线支持。



--------------------------------------------------------------------------------

via: http://www.linux.org/threads/the-linux-kernel-drivers.4205/

译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出
