驱动程序本身就是内核的一部分,从www.kernel.org下载回来的内核代码,单从代码量来说驱动程序超过占65%,当然因为内核配置和条件编译的关系,并不是所有的驱动都会被选上。内核中除掉驱动程序以外的代码是一个框架,该框架提供一个公有的属性,不随CPU体系架构和具体硬件型号而变化,也是一个高度抽象模块集,更是内核的“基础设施”,这个基础设施向驱动程序提供一些接口和定义一些标准。驱动程序的设计要遵循内核给定给驱动程序的标准并使用内核和接口,这样就把操作具体硬件相关的工作交给了驱动程序,抽象出更一般的模块,提高了操作系统的可移植性,可扩展性,和标准化。就像做填空题那样,驱动程序在内核给定的空格上填好这个固定的空以使整个表达式是正确的。严格来说驱动程序包括:CPU体系架构驱动,各种各样的硬件设施驱动。一般的驱动开发者其实工作的重点是除CPU外的设备的适配。基于CPU体系架构的实现依赖于具体的平台如ARM,X86,SPARC,PPC,MIPS等,所以具体到平台的实现部分有些是用汇编语言写的,这些汇编因不同的体系结构而不同(某种原因是C语言实现不了的操作,某些是基于采用汇编实现效率更高更安全)。比如在关中断开断的实现又或切换进程上下文等操作采用汇编。除CPU外的设备一般C语言就完成了,因为大多数是与操作寄存器和数据读写有关。这里应该指明,现在的嵌入式芯片应该称之为SOC(System On Chip)更适合,而本文的CPU指的是处理器内核比如ARM926EJ-S。设备驱动程序是跟设备操作相关的系统调用的内核实现版本。就是说对设备的操作(比如ioctl(fd,…))其在内核的实现是由驱动完成。所以驱动要做的事情就是实现file_operations结构的函数指针,安排中断例程。当然驱动也有分层的,有些模块纯粹是一种软件抽象。比如USB驱动分层。驱动程序是直接面对硬件,内核通过驱动与硬件交互。对内核的核心来说驱动屏蔽了硬件的实现细节。驱动对硬件的操作集中表现在对寄存器的访问及数据读写。