linux操作系统 第08章 设备管理

                                                                                         第8章  设 备 管 理


1  设备管理概述
1.1  设备的分类
  计算机系统中除CPU和内存之外的所有设备都称为外部设备(I/O设备)。计算机系统中的设备种类繁多,虽然它们的物理形态、技术特性和操作方式等各不相同,但都可以看作是完成某种输入/输出操作的功能部件。对设备进行分类的标准有多种。可以按照不同的指标对设备进行分类。

  1. 输入设备与输出设备
  按数据传输方向的不同,I/O设备分为输入设备输出设备输入/输出设备3类。输入设备用于从外界采集或产生数据,传送给系统。如键盘、鼠标等都是输入设备。输出设备是从系统获得数据,以某种形式向外界表现或传递的设备。如显示器、打印机等都是输出设备。输入/输出设备则是兼具输入与输出数据功能的设备。如磁盘、网络、串口设备等都是输入/输出设备。

  2. 系统设备与外部设备
  系统设备是由系统内核管理和使用的设备,如系统时钟、系统扬声器、总线接口等。系统设备之外的设备都属于外部设备。两者区别在于系统设备的驱动由内核本身完成,而外部设备的驱动由专门的驱动程序实现,以内核模块的方式附加到内核中。因此,外部设备可以被安装和卸载,而系统设备则不能。本章所介绍的内容只针对外部设备。

  3. 字符设备与块设备
  按数据传输单位的不同,设备分为字符设备和块设备。字符设备:以字节为单位组织和传送数据的设备,如终端设备(显示器、键盘、鼠标等)、打印机、串口设备等。
块设备:以数据块为单位组织和传送数据的设备,如磁盘、光盘、闪存等。
  

  4. 独占设备与共享设备
  按设备的使用方式,设备分为独占设备和共享设备。
  
独占设备:在某一时间段内只能被一个进程所使用的设备。打印机、终端设备等都是独占设备。当一个进程占用打印机输出时,其他要打印的进程只能等待。
  
共享设备:允许多个进程同时使用的设备。磁盘等存储设备都是共享设备,它们允许多个进程同时访问文件,存取文件的数据。

1.2  设备管理的功能
  设备是系统中的重要资源,无论是用户程序还是内核本身都要使用到设备。设备管理的目标有两个:一是从资源的角度出发,要尽可能地提高设备的使用效率,提高I/O系统的性能;二是从用户的角度出发,设备管理系统要屏蔽各种设备的物理特性,为用户提供一个统一的、方便的I/O操作界面。
  具体来说,设备管理主要完成以下功能:
  
(1) 设备的分配:根据设备的特点对设备进行合理的分配和调度。

  (2) 设备的驱动:根据进程的I/O请求,启动设备进行操作,控制数据的传输。
  
(3) 设备的中断处理:对设备产生的中断进行处理。
  
(4) 虚拟设备:用共享设备模拟独占设备,实现虚拟设备。

1.3  设备与系统的接口
  计算机的I/O设备通常由物理设备和电子部件两部分组成。物理设备是以某种物理方式(机械、电磁、光电、压电等)运作,实际执行数据I/O操作的物理装置;电子部件是以数字方式操作的硬件,用于与计算机接口,控制物理设备的I/O操作。
  一个物理设备是无法直接与
CPU相连接的,这是因为两者之间存在着以下差异:
  
(1) 控制方式不同:CPU产生的是数字化命令,而设备需要某种物理信号来控制。

  (2) 传输方式不同CPU以字节为单位传输数据,而设备可能是以位为单位传输的。
  
(3) 速度不匹配:设备的工作速度要比CPU慢许多。
  
(4) 时序不一致:设备有自己的定时控制电路,难以与CPU的时钟取得一致。
  
(5) 信息形式不同CPU表达信息的形式是数字的,设备则可能是模拟的。
  基于以上分析,
CPU与设备的连接必须解决译码解码、数据装配、速度匹配、时序同步以及信息格式转换等诸多问题。这需要借助一个介于CPU与物理设备之间的硬件接口来实现,这就是I/O设备的电子部件要完成的功能。

  1. 设备控制器
  在许多情况下,I/O设备的电子部件与物理设备是分离的。电子部件称为设备控制器,物理设备就简称为设备。例如:显卡是显示控制器,显示器是由显卡控制的设备;声卡是音频控制器,音箱或耳机是音频设备。
  控制器通过总线插槽
(ISAPCI)接入系统总线。一个控制器可以带多个同类型的设备。设备控制器是CPU与物理设备之间的接口,它接受从CPU发来的命令,自行控制I/O设备工作。
  设备控制器的复杂性因设备而异,相差很大。控制器的典型结构如图7‑1所示。

图7‑1  设备控制器的典型结构

 

  设备控制器通常由以下部分组成:
 
 1)  I/O端口
  I/O端口由一组寄存器组成,它们是设备与CPU的接口。根据设备复杂程度的不同,端口寄存器可多可少,通常会包括数据寄存器、控制寄存器和状态寄存器。控制寄存器用来存放从CPU接收到的命令和参数,用以启动设备或者改变设备的工作模式;数据寄存器存放要传输的数据;状态寄存器记录设备的当前状态,用来指示当前命令是否执行完毕以及是否有任何错误发生。
 

         每个I/O端口寄存器都具有一个可被CPU访问的独立的地址。CPU通过专门的I/O指令读/写设备的I/O端口,实现对设备的控制和数据交换。在执行I/O指令时,CPU使用地址总线选择所请求的I/O端口,使用数据总线在CPU寄存器和端口之间传送数据。

  2) 缓冲区
  在块设备以及数据流量大的设备(音频、视频等设备)的控制器中通常还配有缓冲区,用于存放批量传输的数据。缓冲区通常由寄存器或高速存储芯片组成,缓存区的地址被映射为内存地址,可以被CPU直接访问,它们也可以通过总线直接与系统内存交换数据。

  3) 设备控制逻辑
  设备控制逻辑是I/O端口与设备之间的翻译器,它的主要功能包括:
  
(1) 命令译码:设备控制逻辑负责对控制寄存器中的I/O命令进行译码,确定具体的设备,产生对设备的一系列控制信号,控制设备的操作。例如,磁盘控制器接收到I/O命令后,先要根据实际磁盘的几何结构对I/O请求进行优化,确定访问位置及顺序;然后进行译码,产生驱动磁头定位和数据读/写的磁盘操作信号,发送给磁盘驱动器。
  
(2) 状态解释:当设备执行完一个操作后,设备控制逻辑对从设备接收到的状态信号进行解释和编码,存入状态寄存器。

  (3) 信息格式转换:控制逻辑需要完成I/O端口与设备之间的数据转换,主要是串行和并行的转换,以及数/模或模/数转换等。
  
(4) 传输控制:控制逻辑负责控制I/O端口或缓冲区与设备之间的数据传输,以及I/O端口或缓冲区与CPU之间的数据传输。为此,控制逻辑需要具有中断请求的功能,块传输时还需要有缓冲区读/写控制以及DMA请求的功能。

  4) 中断与DMA控制
  大部分的设备都工作在中断方式下,它们具有中断控制的逻辑,可以向中断控制器发送中断请求信号并接收中断控制器发回的中断应答信号。启用了DMA方式的控制器还具有DMA控制逻辑,可以向DMA控制器发送DMA请求和接收DMA应答。
  
5) 设备接口
  设备接口是控制器与设备之间的接口。一个控制器可以连接多台设备,每个接口连接一台设备。设备接口主要负责针对具体设备的信号发送、数据和状态采集等操作。

  2.  I/O接口
  出于通用性设计的考虑,计算机硬件结构都提供了一些标准的设备接口,这些接口遵照统一的标准来设计,不同的设备只要遵从同一标准即可通过该接口与系统连接。根据所接驳的设备种类的不同,可以将I/O接口分为两类:一类是可连接各种类型的设备的通用接口,如串口、并口、USB接口等都属于通用I/O接口;另一类是为连接某类设备而设置的专用接口,如IDESCSI接口都是块存储设备的专用接口。一个I/O接口可以带多个同类型的设备。例如一个IDE接口可以带两个IDE磁盘驱动器。

  通过I/O接口连接设备的方式可以看做是将设备控制器的功能分散实现了:I/O接口实现与CPU直接连接部分的功能,包括I/O端口、缓冲区、中断及DMA控制等。而与设备直接相关的控制逻辑则由设备自行实现。例如,IDE硬盘连接在IDE接口上,磁盘设备通过这个接口与CPU通信,而与磁盘直接相关的控制器部分则与物理的磁盘驱动器集合在一起,这从IDE (Integrated Device Electronics,集成设备电路)的名称可以看出。

  标准的I/O接口为设备的开发和使用提供了方便,设备部分只需实现必要的设备控制功能即可。这种自己带有一定控制功能的设备称为“智能”设备。例如:IDE的磁盘驱动器就是这样的设备,其他许多串口设备、USB设备等都是具有某种程度智能的设备。从这个观点出发,I/O接口可以看做是简化了的设备控制器,而设备则可看做是“智能化”了的设备。习惯上我们经常称一些专用的I/O接口为控制器,如IDE控制器、SCSI控制器等,而称那些通用的I/O接口就是某某接口了。

  3. 设备与系统的连接
  归纳起来,设备与系统的连接方式主要有两种:一种是集成的设备控制器+“(dumb)”设备,如内置声卡+音箱;另一种是I/O接口+“智能(intelligent)”设备,如USB接口+USB音箱(USB接口+外置声卡+音箱)。为叙述上的方便,我们把这些方式都看做是一种,就是设备控制器+设备

  4.  I/O设备的资源
  I/O设备与系统通信必须首先获得一些系统资源,主要是I/O端口的地址和中断申请号等。控制器是资源的占有者,系统以控制器为对象来分配资源。
  
I/O设备的资源有如下几种:
  
(1)  I/O端口地址:控制器中的每个I/O端口寄存器都有一个唯一的地址,一个控制器所拥有的I/O端口地址的总和称为该设备的I/O范围。如COM1I/O范围为0x03f80x03ff
  
(2) 中断申请号IRQ:设备申请中断使用的中断线号码。
  
(3) 缓冲区地址:控制器中的缓冲区所映射的内存地址范围。

  (4)  DMA通道号:设备申请DMA使用的DMA通道号码。
  在安装设备时,由系统为控制器分配这些资源,并保证各个设备的资源彼此不相冲突。只有正确地配置了设备的资源,才能保证设备能够正常地工作。

1.4  I/O系统的硬件结构
  对于不同规模的计算机系统,I/O系统的结构也有较大的差异。大致可以分为主机I/O系统微机I/O系统。主机系统的设备较多,对传输速度的要求也高,因而采用具有通道的I/O系统结构。微机的I/O系统结构则比较简单,通常采用总线结构,即CPU、内存和I/O设备都连接到总线上,如图7‑2所示。

图7‑2  微型机I/O体系结构

 

  总线体系结构的特点是以总线为纽带。系统板上的部件都通过总线相连,所有的信号都要通过总线进行传输。系统总线分为3个逻辑功能部分:地址总线、数据总线和控制总线。地址总线指定数据传送的地址;数据总线用于传送数据;控制总线包含一些信号线,用来控制时序和系统中的其他控制信号,如中断请求、DMA请求信号等。
  总线由CPU控制,
CPU可以通过总线访问内存和设备,以及控制在内存和设备之间传输数据。总线采用独占使用方式,任何设备若需要直接和内存交换数据,先要申请总线使用权,获得使用权后独占总线进行通信。

  在总线结构系统中,数据的交换路线主要有以下两种:
  (1)  
CPU与慢速的字符设备交换数据时,由CPU控制设备与内存之间的数据交换。输入时,CPU从控制器中将数据读到CPU的内部寄存器中,再写到内存单元中;输出时则相反,将内存数据读到CPU的寄存器中,再写到控制器的数据寄存器中。
  
(2)  CPU与高速的块设备交换数据时,以DMA方式进行。DMA控制器先申请总线使用权,然后控制设备直接与内存传输数据。关于DMA技术的介绍见2.3小节。

1.5  I/O系统的软件结构
  I/O软件是控制设备与内存、CPU进行数据交换的所有软件的统称。其主要的任务是充分发挥各种设备的作用,屏蔽各种设备的特殊性,在保证系统具有较高的整体性能的同时,尽可能向用户提供一个方便、规范的设备使用界面。
  I/O软件大多采用分层结构,底层软件用来屏蔽硬件的细节,高层软件则主要为用户提供一个规范的使用接口。图7‑3所示为I/O系统的软件结构。

图7‑3  I/O系统的软件结构

 

  分层结构的底层是设备相关部分,称为设备驱动程序。它们直接和相应的设备打交道,负责设备的具体驱动和控制。上层通常是和设备无关的,这个部分接受来自用户层的访问请求,并把这些访问请求传给具体的设备驱动程序,再将驱动程序的执行结果进行转换,传给用户。各个部分的功能大致如下:
  (1)
设备命名与保护:为方便用户指定设备,I/O系统应按某种规则对每个设备加以命名。用户用设备名来访问设备,由I/O系统完成从设备名到设备的映射。系统还应对每个设备指定访问权限,防止设备被非法使用。

  (2) 缓冲区管理:块设备(以及某些字符设备)的数据传输采用缓冲方式。在传输数据前,系统需要在内存中为设备分配缓冲区;传输结束后,系统还要管理缓冲区,为后续的I/O操作提供缓存功能。
  
(3) 设备分配:在多任务系统中,进程可能会竞争设备,因此系统必须有一个分配程序来分配和调度设备资源。当进程向系统提出I/O请求时,设备分配程序便按一定的策略将设备分配给进程使用。

  (4) 设备驱动与中断处理:驱动程序是操作硬件控制器的软件。驱动程序利用上层传来的指令,操纵设备控制器读/写数据,设备控制器则控制设备进行具体的数据I/O操作。当设备完成I/O操作后,向CPU发出中断请求,CPU转入中断处理程序进行处理。

     设备管理的相关技术
  现代设备管理普遍采用了一些关键技术,主要是中断技术、缓冲技术、通道技术、DMA技术等。这些技术的目标都是为了提高数据传输速率和系统的并发程度,优化系统的整体I/O性能。

2.1  中断技术
  1. 中断的概念

  在计算机运行期间,当系统内部或外部发生了某个异步事件需要CPU处理时,CPU将暂时中止当前正在执行的程序,而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处,继续执行或者调度新的进程执行,这个过程就称为“中断”(interrupt)。异步事件是指与系统运行没有时序关系的、不可预期的事件,如用户按下键盘按键、磁盘传输数据完成、系统硬件出现故障等都是异步产生的事件。

  在中断技术出现之前,CPU启动设备进行I/O操作后,要不断地探察设备控制器的“忙/闲”状态位,直到设备完成操作。在这种I/O控制方式下,CPU与设备是串行工作的,这对CPU来说是极大的浪费。中断技术实现了由设备向CPU报告的手段,这样,CPU启动设备操作后可以继续进行其他计算,不必再轮询设备了。因此,中断使得CPU可以与设备并行工作,极大地提高了系统的运行效率。

  中断技术最早应用在I/O传输过程中,它使外部设备和CPU的并行工作成为可能。而后中断技术扩大到设备之外的其他事件。现在,凡是需要CPU干涉或处理的异步事件都采用中断的手段进行处理。可以看出,中断对于操作系统的意义重大,它是系统一切并发活动的基础,因而是操作系统最基本的技术。

  2. 中断源与中断分类
  引起中断发生的事件称为中断源。通常中断源是由硬件产生的信号,目的是通知CPU某个需要处理的事件。例如,当敲打键盘时,键盘控制器就会产生一个键盘中断源信号。
  在计算机系统中有很多种类的中断源。其中,由设备数据传输过程中发生的中断属于
I/O中断,是中断源中的一大类。其他中断源有周期性的时钟中断、电源掉电产生的中断等。此外,一些来自CPU内部的事件或程序执行中的异常事件(CPU故障、除数为0、内存溢出、执行了陷入指令等)也会被作为中断对待和处理。这类由内部故障或程序故障引起的中断事件称为“异常”(exception)。

  3. 中断请求
  中断源需要通过中断线送到中断控制器的输入端,这称为中断请求。中断控制器是一个硬件装置,它负责捕获中断请求,并以一定的方式向CPU提交中断。由于同时可能会有多个中断信号产生,它们需要共用有限的中断线。因此,当设备要使用中断线时就要先进行中断请求(IRQ),以获得中断线的使用权。

  4. 中断响应
  对中断请求的整个处理过程是由硬件和软件相结合的一整套中断机构实施的。中断响应由硬件实施,中断处理主要由软件实施。
  CPU在收到来自中断控制器的中断信号后,暂停执行当前的进程,转入相应的中断处理程序进行处理,这个反应的过程称为中断响应。通常CPU在执行完一条指令后,会检查有无中断请求。如有,则会立即作出响应。
  一般说来,中断响应过程顺序执行下述动作:
  (1) 中止当前进程的执行;

  (2) 对被响应的中断进行应答;
  
(3) 保存当前进程的断点信息(主要是程序状态字PSW和程序计数器PC)
  
(4) 转到中断处理程序入口。
  所有中断处理程序的入口地址都保存在一个
中断向量表中。CPU在响应中断时,根据中断源检索中断向量表,得到的中断向量中包含相应中断处理程序的入口地址和程序状态字。将中断向量加载到CPU中,在下一个指令周期CPU就会转去执行相应的中断处理程序了。

  并不是所有中断请求都会得到及时的响应。在很多情况下,比如系统正在执行内核的进程调度或者内存调度操作,为了保证操作的原子性,这时不允许CPU响应中断。在这种情况下,CPU通过设置中断机构,使其不产生中断请求,这个过程称为关中断。当CPU完成必要的操作之后必须对硬件重新设置才能够接收中断,这个过程称为开中断。

  5. 中断处理
  中断处理主要由软件实施。响应中断后,CPU转去执行相应的中断处理程序。每个中断都对应一个特定的中断处理程序,因而系统中会有许多中断处理程序,如时钟中断处理程序、键盘中断处理程序等。在设备的驱动程序中包含了对该设备所有中断的处理程序。
  中断处理程序的执行过程大致分为如下几个阶段:

  1) 保存现场
  现场指的是在程序运行时CPU中的各个寄存器、计数器的状态。通常,中断响应时硬件处理的时间很短,只保存了程序状态字等现场信息。在随后的中断处理过程中,其他一些寄存器的内容可能会被改变。因此,在进入中断处理程序时,首先要将那些在中断处理程序中要用到的寄存器的内容保存在堆栈中,以便在处理完成后可以恢复它们。

  2) 处理中断
  中断的处理方式因中断的不同而异。对于I/O中断来说,通常是从设备控制器读取设备状态,判别此次中断是正常完成中断还是异常结束中断。若是完成中断,则进行结束处理,需要的话再向控制器发送新的命令,启动下一轮数据传送。若是异常结束中断,则根据异常的原因做相应的处理,比如重试或报告错误。
 
 3) 恢复现场
  恢复现场是将保护现场时保存的数据恢复到CPU的寄存器中。

  4) 中断返回
  中断处理程序完成处理后,执行一个特定的中断返回指令。该指令将恢复程序的断点信息(PSW和PC),使原来被中断的程序恢复执行。有时,中断处理程序也可能需要唤醒某些睡眠进程。如果设置了重调度标志,则在中断返回时会引起系统重新进行进程调度,选择一个新的进程运行。

2.2  缓冲与缓存技术
  中断技术的引入,使得系统中各I/O设备之间以及I/O设备和CPU之间可以并行工作。但I/O设备与CPU的处理速度存在着巨大的差异,这导致进程在需要传输大量数据时不得不经常等待。因此,I/O设备与CPU的速度不匹配的问题制约了系统性能的进一步提高。解决此问题的有效方法是缓冲技术

  1. 缓冲技术
  缓冲(buffer)技术就是为了解决设备和CPU之间处理速度不匹配的问题而引入的。CPU的数据传输速度可以达到纳秒级,而对于像磁盘这样的机电存储设备,其数据传输速度是微秒级的。两者直接交换数据就如同将一个大口径的水管与一个小口径的水管连接起来,必然会产生性能上的瓶颈问题。结果就是,进程运行中在高速地产生或处理数据,却不得不时时等待低速的设备慢慢地输出或输入这些数据。

  产生这一问题的根源在于CPU处理数据的速度与I/O设备处理数据的速度不相匹配。实际生活中,凡是存在输出与输入速度不匹配的地方都可以采用缓冲技术来解决。比如,为了缓解降水与灌溉用水的速度不匹配问题,可以用修建水库的方法,这就是缓冲的思想。对于I/O操作来说,缓冲的思想就是在高速存储区(内存或高速缓存)内设置缓冲区。进程要进行输出时,将数据高速地倾泻到缓冲区中,然后继续执行后续操作。输出设备则按自己的速度从缓冲区中取出数据并完成输出操作。对于数据输入操作则正好相反。设备将输入数据写入缓冲区中,数据准备好后用中断通知CPU,然后进程直接从缓冲区高速地获取输入数据。这样就缓解了进程的等待现象,从而提高CPU与外设之间的并行程度。

  2. 缓存技术
  与缓冲技术有着细微差别的另一个技术是
缓存(cache)技术缓存区(cache memory)是为了临时存放与设备交换的数据而设置的数据暂存区,通常位于内存或设备控制器的内存芯片中。在数据传输过程中,缓存区起到I/O缓冲的作用,同时对通过缓存区的数据保留备份。当下一次访问数据时首先在缓存区中查找,如果命中则不需要启动外部设备就可以立即从缓存中得到数据,其读/写速度是内存级的;如果查找没有命中,则启动设备进行数据I/O操作。这样,经过一段时间的积累,经常访问的数据基本都在缓存区中,系统启动设备的次数就会大大降低,系统的I/O效率因此而显著地提高,同时还可延长设备的使用寿命。

  操作系统中广泛地应用了缓存技术,如文件系统中的i节点缓存、目录项缓存等。内存管理中的快表和slab也是一种缓存。此外,应用软件中常用缓存技术来提高性能,如Web服务器将经常被访问的网页保存在缓存中,以提高网络访问速度,减少网络流量。

  3. 缓冲与缓存的差异
  缓冲与缓存的基本原理和作用是相似的,如果不加区分的话,都可以称之为缓冲。但两者之间确实存在细微的差异:
缓冲的作用在于协调速度不匹配的I/O传输过程,而缓存的作用在于减少对设备的实际访问次数。这个差异导致了两者的管理方法有所不同。
  一般来说,
缓冲区的生命期较短,当进程开始数据传输时建立,一旦数据传输完毕,将立即释放缓冲区,它只起暂存数据的作用。而缓存区的生命期较长,缓存的数据可以长时间地保存在缓存区中,服务于各种应用目的。如文件系统中的i节点缓存、目录项缓存等在整个系统运行期间都存在于内存中,由文件系统管理和使用。

  另外,缓冲区的管理相对简单,系统只需提供简单的分配算法以及同步机制即可。而缓存区的管理则需要利用更复杂的算法,以提高访问的命中率,最大限度地发挥缓存的作用。例如,磁盘的缓存算法要确定哪些数据应存放在缓存中,哪些数据应从缓存中撤出等。
  在应用上,进程间的通信多使用缓冲技术,而设备的I/O往往使用缓冲兼缓存技术。

  4. 缓冲的实现方式
  根据缓冲区所在的位置,可以分为硬缓冲和软缓冲两种。硬缓冲就是设备自带的缓冲区,位于设备控制器或设备上,软缓冲是在内存中开辟的缓冲区。
  
1) 软缓冲的实现方式
  软缓冲是在内存中设置缓冲区,用于暂存数据供进程快速地获取或输出。根据设置的缓冲区的个数,缓冲区分为以下几种:
  
(1) 单缓冲:只设置一个缓冲区。由于缓冲区属于临界资源,读/写此缓冲区的进程或设备必须串行访问。

  (2) 双缓冲:设置两个缓冲区,当一个进程写一个缓冲区时,另一个进程可以读另一个缓冲区,这样就在一定程度上实现了读/写操作的并行性。
  
(3) 环形缓冲:将多个缓冲区连接成一个环形,输入进程沿着环路顺序地写各个缓冲区,输出进程随后顺序地读各个缓冲区。只要后者没有追上前者,它们就可以并行地工作。环形缓冲提高了读/写的并行化程度,缓冲的效果更好。
  
(4) 缓冲池:以上缓冲区都是为某个I/O进程设置的,属于专用缓冲区,利用率不高。缓冲池是一组公用缓冲区,由专门的管理程序统一管理,供多个I/O进程共享。进程需要时就申请,使用完毕后再释放。这种管理方法提高了缓冲区的利用率。

  2) 硬缓冲的实现方式
  硬缓冲就是在设备上设置缓存器,在设备内部存储和I/O接口之间起到一个缓冲和缓存的作用。以磁盘缓存为例,磁盘上带有一个存取速度极快的缓存芯片,用于暂存读/写的数据块。在读取磁盘时,磁盘控制器会控制磁头把正在读取的数据块的下一个或者几个块中的数据读到缓存中。下次执行读操作时先在缓存中查找,如果命中则可立即送出数据,而不必启动磁盘操作。由于磁盘上数据存储是比较连续的,所以下一次的读取命中率会较高。写入数据时,磁盘并不会马上将数据写入到盘片上,而是先暂存在缓存里,然后发送给系统一个操作完成中断。而后,磁盘在空闲时再将缓存中的数据写入到盘片上。

  从磁盘缓存的例子中可以看出,使用缓存可以减少访问设备的中断次数和延迟,提高设备的使用寿命。另外,缓存的大小直接关系到设备的传输速度,大的缓存能够大幅度地提高设备的整体性能。现今主流磁盘所采用的缓存容量一般是8~16 MB,在服务器中的磁盘缓存容量可以达到16~64 MB。

2.3  DMA技术
  用中断方式控制I/O传送时,每传送一个字节或字就要向CPU发一次中断请求,传输1 KB数据需要发一千多次中断请求,这对于块设备来说效率太低。为了减少CPUI/O传输过程的干预,在PC机系统中引入了DMA方式,用来控制块设备的批量数据传送。
  
DMA直接存储器访问(Direct Memory Access),其思想是用一个特殊的设备控制器来控制块设备,使其可以直接与主存交换数据。这个控制器就称为DMA控制器

  在以总线为中心的体系结构中,任何数据交换都要通过总线进行。总线控制权在CPU,也就是说,所有的数据交换都需要CPU参与完成,外设无权使用总线直接访问内存。DMA控制器的特殊之处在于它能从CPU那里暂时地获得总线控制权,在没有CPU的参与下控制外设与内存直接传送数据。直接的意思就是指数据传送不必经CPU的寄存器为中介,可直接从设备写入内存或从内存送入设备。在整个传输期间,设备不产生任何中断,仅在全部数据传输完成后才向CPU发出中断。

  在启用了DMA控制的设备中,通常在控制器中设置了数据缓存区。设备先把数据准备好,放在缓存中,然后只需一次中断就可以完成数据传输,使系统效率得到明显的改善。
  一个完整的DMA传输过程需要经过下面的4个步骤。

  1.  DMA请求
  CPU通过I/O指令对DMA控制器初始化,向DMA控制器发送要启动的设备号、数据传输的内存起始地址、要交换的数据字节数等参数。随后,CPU向设备控制器发出操作命令,设备控制器准备好数据后,向DMA控制器提出请求。
  
2.  DMA响应
  DMA控制器对DMA请求予以判别,然后向CPU发出总线使用权的请求。CPU在本机器周期执行结束后响应该请求,与系统总线脱离。而后,DMA控制器接管数据总线与地址总线的控制,开始控制DMA传输。

  3.  DMA传输
  DMA控制器获得总线控制权后,对设备控制器发出读/写命令,控制设备直接与内存进行数据传输。在传输过程中,DMA控制器对传送的字节进行计数。当传输的数据块达到预定的字节数时传输完毕。

  4.  DMA结束
  完成规定的批量数据传送后,DMA控制器即释放总线控制权,向设备控制器发出结束信号,并向CPU提出DMA中断请求。CPU响应中断后转到中断处理程序中处理DMA的结果,处理内容包括校验送入内存的数据是否正确,测试在传送过程中是否发生了错误,决定是否继续传送下去等。中断处理完成后,CPU返回原来的进程继续执行。
  可以看出,
DMA方式有如下特点:数据传输的基本单位是数据块;所传输的数据是从设备直接送入内存的,或者相反。整块数据的传送是在控制器的控制下完成的,仅在传输的开始和结束时才需要中断CPU。因此,DMA方式成百倍地减少了CPU对I/O控制的干预,大大提高了CPU与设备的并行化程度。

  实现DMA的方式主要有周期挪用方式CPU停机方式,目前后者更为常用。无论哪种方式,在DMA传输过程中都会占用CPU的工作周期,CPU的利用率自然会有所降低。因此,DMA控制器能带的设备数量有限,只适用于PC机等低端机型。

        3    I/O控制方式
  I/O控制就是控制数据在I/O设备与CPU、内存之间的传输,这是设备管理的一个主要功能。随着计算机技术的发展,I/O控制方式也在不断地发展。从最早的程序I/O方式,发展到中断驱动方式、DMA控制方式和通道方式,数据传输速率不断提高。而贯穿整个发展过程的一条宗旨就是尽量减少CPUI/O控制的干预,把CPU从繁杂的I/O控制事务中解脱出来,提高CPU与外设的并行化程度。

3.1  程序I/O方式
  在设备控制器的状态寄存器中,有一个用于表示设备工作状态的“忙/闲”(busy)标志位。进程通过执行I/O测试指令可以检测这个标志位,获得设备的当前工作状态。程序I/O方式就是由执行I/O的程序直接访问这个标志位来控制设备的I/O操作的方式。以输入为例,程序通过I/O命令启动设备,设备开始准备数据,并设标志位为“忙”(busy=1)。在数据准备过程中,程序循环地检测“忙/闲”位,直到设备准备好了数据,并将“忙/闲”标志位置为“闲”(busy=0)。进程取走数据,继续下面的执行。图7‑4描述了程序控制I/O方式的操作时序。

图7‑4  程序控制I/O方式的操作时序

 

  在整个传输过程中,进程一直占用着CPU,而CPU所做的大量工作是不断地查询设备的状态,所以这种传输方式也称为轮询(polling)方式。由于外备的速度比CPU要低很多,使CPU的大量时间浪费在轮询上,因此,在这种方式下CPU与外设实际上是串行工作的,CPU的利用率非常低。
  程序I/O方式是早期计算机系统采用的/I/O方式。它不需要额外的硬件支持,甚至可以不需要驱动程序。目前多用在一些单片机等简单系统中。

3.2  中断I/O方式
  中断I/O方式的过程是:当进程需要数据传输时,CPU为其启动设备进行I/O操作。此后CPU不是被动地测试等待,而是将原进程挂起,继续执行其他进程。设备控制器按照I/O命令的要求控制设备进行数据传输,当设备完成I/O操作后,采用中断方式向CPU报告。CPU响应中断后,暂时停止当前进程的执行,转去进行中断处理,然后唤醒等待数据传输的进程,转入就绪状态。中断处理完成后,CPU转到被中断的进程或新调度的进程继续执行。图7‑5描述了中断驱动的I/O方式的操作时序。

 

图7‑5  中断I/O方式的操作时序

  中断I/O方式的优点是显而易见的。在中断方式下,CPU与I/O设备是并行执行的,这样可以使CPU和I/O设备都处于忙碌状态,从而提高了整个系统资源的利用率和吞吐量。但中断方式需要硬件和软件上的支持。系统需要设置一个中断机构来响应中断,还需要一组中断处理程序来处理中断事件。响应中断时的保留和恢复现场以及处理中断时执行的中断处理程序都要耗费CPU的时间。因此,在进行大量数据交换时,频繁发生的中断会使系统的性能降低。

3.3  DMA方式
  DMA方式的传输过程是:当进程需要数据传输时,CPUDMA控制器发出启动命令,同时把设备号、内存地址和数据量等参数通知DMA控制器。此时原进程转入等待状态,CPU继续执行其他进程。DMA控制器控制设备不断地与内存传输数据,直到所有数据传输全部完成,然后通过中断通知CPU进行相应的中断处理。处理完成后,唤醒等待数据的进程。图7‑6描述了DMA方式的I/O操作时序。

图7‑6  DMA方式的I/O操作时序

 

  在DMA方式中,整个数据块的传输过程不需要CPU的干预,较之中断方式又大大降低了CPU的负担,进一步提高了CPUI/O设备的并行操作程度。
  DMA方式的缺点是会降低进程的运行效率,尤其是DMA设备较多时,需要占用较多的CPU工作周期,对其他进程的影响会很大。

3.4  通道方式
  对于追求高效的中大型机器多采用具有独立处理器的通道来实现I/O传输控制。通道(channel)是一个专门用于控制I/O操作的处理机,它执行通道程序,控制外设与主存之间交换数据。通道的工作过程是:CPU生成通道程序,启动通道执行,然后继续执行进程。这段时间中,通道与CPU是完全并行工作的,CPU执行进程,通道执行通道程序,控制设备与内存传输一批数据。传输结束后,通道产生通道中断向CPU报告,CPU处理完通道中断后就可以直接使用内存的数据了。

  由于通道是可独立运行的硬件,所以它的运行不会影响到CPU的执行效率。通道承担了所有的I/O控制工作,使得CPU可以完全摆脱对I/O操作的干涉,因而采用通道结构的系统具有非常高的I/O性能。

     设 备 的 分 配
  由于设备资源的有限性,所有的设备都由I/O管理系统进行统一地管理和调度。进程需要进行I/O操作时,必须向系统提出申请,由系统为它分配设备。如果进程得不到所申请的设备资源,它将被放入等待队列中等待,直到所需的设备可用。

4.1  设备分配策略
  设备分配是由I/O系统中的设备分配程序完成的。每当进程提出I/O请求时,设备分配程序便按照一定的策略把所需的设备分配给进程使用。设备分配的原则是要尽可能地让设备忙碌,充分发挥设备的使用效率。

  1. 分配方式
  设备的分配方式有静态分配动态分配两种,静态分配是在进程开始运行前就一次性地为它分配所有需要的设备,进程在运行期间一直保持这些设备,直到运行结束后才释放。静态分配的算法简单,但设备的利用率低。
  动态分配就是进程在运行过程中根据需要提出对设备的请求,系统按分配算法为它分配设备,使用结束后立即释放。动态分配有利于提高设备的利用率,因而是现代系统普遍采用的分配方式。不过动态分配的算法要设计适当,否则容易造成进程的死锁。

  2. 分配策略
  设备分配时主要应考虑的因素是与分配有关的设备属性,即设备是独占设备还是共享设备。对于独占设备,应采用独占分配策略,也就是将一个设备分配给某进程后便一直由它独占,直至该进程完成或释放该设备,然后系统才能把这个设备分配给其他进程。而对于共享设备,系统可以将它同时分配给多个进程使用,同时系统还要合理地调度这些进程对设备的访问次序。
  由于独占设备只能采用独占分配,因而设备的利用率低。解决这个问题的一个策略是采用虚拟分配,即为进程分配一个虚拟的设备,具体的实现技术见4.2小节。

  3. 分配算法
  当有多个进程同时请求设备时,系统应采用某种策略决定将设备分配给哪个进程使用。主要的分配策略有先来先服务和优先级两种。
  
先来先服务算法根据进程对某设备提出请求的先后次序,将这些进程排成一个设备请求队列,设备分配程序总是把设备首先分配给队首的进程。先来先服务的算法简单、公平,但无法满足某些紧迫进程对I/O响应时间的要求。
  
优先级算法的策略是对高优先权进程的I/O请求也赋予高优先权,这有助于这种进程尽快完成。在利用该算法形成设备队列时,将优先级高的进程排在设备请求队列的前面,而对于同优先级的I/O请求,则按先来先服务的原则排队。

  4. 设备分配的相关数据结构
  为了实施对设备的管理和分配算法,设备分配程序需要用到一些数据结构来记录设备的相关信息。主要的数据结构有设备控制表(DCT)控制器控制表(COCT)系统设备表(SDT)等。每个设备都对应有一个设备控制表,用于记录该设备的信息,包括设备标识、使用状态和等待进程队列等。每个设备控制器对应一个控制器控制表,用于记录该控制器的信息,包括控制器的标识和使用状态等。整个系统有一个系统设备表,它记录已连接到系统中的所有设备的情况,每类设备占一个表项,内容包括该类设备的标识、数量、等待队列以及设备控制表的位置等

4.2  虚拟设备技术
  独占设备在一个期间内只能被一个进程使用,由于设备的速度很慢,造成其他要使用同一设备的进程不得不长时间地等待。例如,假设有多个进程要使用打印机,每个进程的打印时间以分钟计。当第一个获得打印机的进程正在打印时,排在后面的所有进程都必须长时间地等待。这样就严重影响了进程的执行速度,极端情况下还会引起死锁。因此,独占设备是I/O系统性能的“瓶颈”。

  要解决独占设备分配所带来的问题,最根本的策略就是用某种方法将其转化为一个共享设备,而实现这种转换的有效方法就是假脱机(SPOOLing)技术SPOOLing的思想是在高速共享设备上模拟出多台低速独占设备,从而提高系统效率。这种模拟出来的设备并不实际存在,所以称为虚拟设备。
  
SPOOLing系统的实现方案是在外存储器中开辟一些缓冲区,称为“I/O井”。用户进程需要与设备交换数据时,只对I/O井高速读/写数据,由SPOOLing系统控制在适当的时候将I/O井中的数据传输给实际设备。对用户进程来说,I/O井就是一台高速的虚拟设备。

  图7‑7描述SPOOLing系统的工作原理。系统在外存开辟了一个打印机输出井和一个磁带机输入井。对用户进程来说,这就是一台虚拟打印机和一台虚拟磁带机。当进程需要从磁带机输入数据时,SPOOLing系统启动磁带机,将数据读入磁带机输入井中,随后进程直接从输入井提取数据,不需再等待。当进程需要打印输出时,它们将数据高速地送入打印机输出井,然后继续运行。在输出井等待打印的数据形成打印队列,由SPOOLing系统控制在适当的时候完成实际的打印工作。
  虚拟设备除了可以减少进程对设备的等待时间外,还可以解决多个进程对独占设备的竞争问题。例如,在设置了虚拟打印机的系统中,每个进程都可以随时执行打印输出操作,好像系统的打印机是自己独占的。也就是说,使用虚拟设备永远不会引起进程死锁。

图7‑7  SPOOLing系统工作原理示意图

 

      设 备 的 驱 动
  设备的驱动是I/O系统最底层的功能,由设备驱动程序完成。
5.1  设备驱动程序
  设备驱动程序(device driver)是直接管理和操纵设备控制器的软件。它是针对具体的设备控制器设计的,每个设备控制器都由一个特定的设备驱动程序来控制。设备驱动程序是内核的一部分,它们运行在核心态,可以访问控制器的I/O端口,驱动各自的设备。
  
设备驱动程序是设备管理的主要软件之一。从图7‑3中可以看出,设备驱动程序位于I/O软件系统的底部,它们使用一致的接口与I/O系统相连接,将设备的特殊性在这个层次中隐藏起来。设备驱动程序接受上层I/O软件的I/O请求,将其转化为设备控制器的命令代码,操纵设备控制器完成数据传输的全过程。图7‑8所示是设备驱动程序与控制器的关系。

图7‑8  设备驱动程序与控制器的作用关系

 

  设备驱动程序与设备控制器交互的大致过程是:驱动程序将控制命令发到控制器的命令寄存器中,控制器启动设备进行I/O操作。当数据准备好后,驱动程序负责与控制器交互,完成数据传输工作。控制器将设备产生的状态信息存入状态寄存器中,供驱动程序查询。当有设备中断事件发生时,控制器发出中断请求信号,系统进入中断处理程序进行处理。

5.2  设备中断处理程序
  中断处理程序负责处理设备的中断事件,每个使用了中断的设备都有一个中断处理程序,如时钟中断处理程序专门处理来自系统时钟的定时中断,键盘中断处理程序专门处理键盘产生的中断。在CPU响应一个中断时,它会根据中断向量转去执行该中断对应的中断处理程序。
  中断处理程序与具体的设备密切相关,因此可以把它看做是设备驱动程序的一部分。不同之处在于,设备驱动程序是与I/O系统接口的,而中断处理程序是由中断系统调用执行的。

  中断处理程序的工作是对传输的结果进行必要的处理。需要指出的是,在中断处理程序执行过程中会关闭同一中断线上的中断请求,因此它必须尽快地完成工作,不然就会造成后续中断的丢失。此外,中断处理程序不允许被阻塞,因此它不能做任何会引起自己被阻塞的操作,如访问有竞争的资源,或调用某些会引起阻塞的函数等。这也是为保证中断处理能在限定的时间内结束。还有就是,中断处理程序运行在中断上下文中,也就是说它不与任何进程相关联,因此它不能访问用户进程的地址空间,向用户进程传输数据等。除此之外,中断处理程序与普通的C程序没有什么区别。

       6  Linux设备管理
6.1  Linux设备管理的特点
  Linux设备管理的最突出的特点就是设备独立性。这是指系统把设备统一当作文件来看待,只要安装它们的驱动程序,就可以像使用文件一样使用这些设备,而不必知道它们的具体存在形式和操作方式。
  之所以能够将设备作为文件对待,是因为
Linux文件的物理结构是字节流,而设备传输的数据也是字节流。如果将向设备输出数据看做是写设备操作,将从设备输入数据看做是读设备操作,就可以把读/写文件与设备I/O操作统一在一起,用同一组系统调用完成文件与I/O操作。设备独立性的好处是简化了I/O系统的设计,使系统结构简洁而高效,同时也方便了用户使用设备。

  并非所有的Linux设备都可以作为文件来处理。Linux系统将设备分为3类,即字符设备块设备网络设备。字符设备和块设备都可以通过文件系统进行访问,因为它们传输的是无结构的字节流,而网络设备则是个例外。网络设备传输的数据流是有结构的数据包,这些数据包由专门的网络协议封装和解释,因此需要经过一组专门的系统调用进行访问。Linux 设备管理通常指的是字符设备和块设备,本节也只介绍这两类设备的管理技术。

6.2  Linux系统的I/O软件结构
  实现设备独立性的手段是通过分层软件结构,把设备纳入文件系统的管理之下,使进程通过文件系统的接口来使用设备。图7‑9所示是Linux系统的I/O软件结构。
  
Linux系统的I/O软件采用两层结构设计,上层是文件系统,它负责设备的命名、保护、缓冲区管理以及设备分配等工作。在这个层面上,设备被抽象成了文件,设备的各种特殊性都被屏蔽了,用户可以像使用普通文件那样操作各种设备。下层是与设备相关的软件层,主要是设备驱动程序和对应的中断处理程序。

  用户进程使用文件系统的标准系统调用来打开、关闭和读/写设备文件。文件系统接受用户对设备文件的请求并进行相应的判别处理,然后将文件操作映射到设备驱动的I/O操作上,由设备驱动程序驱动控制器完成具体的I/O操作。

图7‑9  Linux 系统的I/O软件结构

 

  文件系统采用与文件相同的一套操作来实现设备的命名、保护与操作,这大大简化了系统的结构。对Linux系统来说,设备管理的主要工作实际上只是设备驱动而已。只要正确地实现了设备的驱动程序,就可以把设备纳入文件系统的管理之下。为此,Linux定义了文件系统与设备驱动程序之间的接口规范,任何设备的驱动程序只要遵守这些规范就可以与文件系统接口。接口方式既可以是静态的也可以是动态的。实际上,大多数设备驱动程序都是独立的内核模块,可以动态地加载和卸载。这种设计使得Linux 系统的I/O软件结构既简洁又灵活。

6.3  Linux的设备文件
  1. 设备的标识

  在Linux系统中,每个设备对应一个设备文件,设备文件一般都位于/dev目录下。用户用设备的文件名来指定设备,而内核则使用主设备号(major number)和次设备号(minor number)来标识一个具体的设备。一般来讲,主设备号标识设备的控制器,次设备号用来区分同一控制器下的不同设备实例。主设备号与设备的驱动程序一一对应,而次设备号供驱动程序内部使用。2.6内核的Linux系统支持高达4095个主设备号,每类主设备可以有多于100万个次设备号,这足以支持高端企业系统的设备配置。

  设备文件是一个特殊类型的文件,字符设备的文件类型为“c”,块设备的文件类型为“b”,设备文件的访问权限就是对该设备的访问控制。例如,下面的ls命令显示了软盘、打印机和硬盘文件的详细信息:
  $ ls  -l /dev/fd0 /dev/lp0 /dev/hda 
   brw-rw----  1  root  floppy  2, 0  May 12  15:13  dev/fd0
   crw-rw----  1  root  lp  6, 0  May 12  15:13 /dev/lp0
   brw-rw----  1  root  disk  3, 0  May 12  15:13  dev/hda
  $

  与普通文件的描述信息有所不同,设备文件的文件大小字段中显示的是主设备号和次设备号。在上面的输出信息中,/dev/fd0是软盘A驱动器的文件名,类型是块设备,主设备号是2,次设备号是0/dev/lp0是第一台打印机的文件名,类型是字符设备,主设备号是6,次设备号是0/dev/hda是第一个IDE磁盘驱动器的文件名,类型是块设备,主设备号是3,次设备号是0
  当对设备文件执行读
/写操作时,实际上实现的是对设备的I/O操作。例如,命令echo “Hello!” > /dev/lp0将会使打印机打印出一个字符串。

  2. 设备文件的描述
  同普通文件一样,每个设备文件也都有一个独立的i节点。不同之处在于,设备文件的i节点中没有指向文件存储块的索引表,而是通过主设备号和次设备号指明相应的设备驱动程序。
  与普通的文件一样,每个打开的设备文件也对应一个file结构、VFS i节点以及文件操作集file_operations(见图6-18)。不同之处在于,普通文件的file_operations中是标准的文件操作,而设备文件的file_operations中是设备驱动提供的一组专门针对该类设备的操作。VFS正是通过这个file_operations结构实现了将文件操作映射到驱动程序的操作函数上。

6.4  Linux设备驱动程序
  1. 驱动程序与内核的接口

  Linux系统的所有驱动程序都是内核的一部分,部分系统设备的驱动程序被静态地编译进内核,其余的驱动程序则是采用独立的内核模块的方式动态地加载到内核上。为了能与内核正确地结合,Linux对驱动程序的模块结构和接口都有规范的定义。
  
设备驱动程序与内核的接口是file_operations结构,它通过文件系统为用户进程和内核其他部分提供统一的接口,将对设备的操作通过文件系统映射到具体的设备驱动程序。

  file_operations提供的设备操作函数因设备的不同而有所不同,通常的操作有:
  ● open()    打开并初始化设备。
  ●
read()    从设备读数据。
  ●
write()    向设备写数据。
  ●
ioctl()    控制设备。
  ●  lseek()    定位读/写位置。
  ● release()  关闭设备,将其归还给系统。

  2. 驱动程序的功能
  不同设备的驱动程序在功能上会有或多或少的差别,但通常应包括以下几个。
  
1) 驱动程序的注册与注销
  注册是向内核登记驱动程序的信息,使内核知道该用哪个文件操作集来实现针对该设备的文件操作。注册的工作包括登记驱动程序(包括中断处理程序)信息、为驱动程序分配资源(内存与主设备号等)以及初始化驱动程序。驱动程序的注册是在系统引导或驱动模块加载时完成的。注销是注册的反操作,它解除驱动程序与内核的联系,释放驱动程序所注册的资源。驱动程序的注销是在系统关闭或者驱动模块卸载时完成的。

  2) 设备的打开与关闭
  和普通文件一样,设备首先要打开才能够进行读/写操作,完成操作之后也要及时地关闭。打开设备文件对应的操作是建立起文件系统到设备驱动程序的映射关系,并使设备准备好执行I/O操作。关闭文件对应的操作是释放这种映射关系、复位设备等,以确保下次可以正常打开和使用设备。
  文件系统提供的
open()和close()系统调用同样用于设备文件的打开和关闭,它将调用设备驱动的open()或release()操作,完成具体设备的初始化或复位操作。

  3) 设备的读/写操作
  进程使用read()write()系统调用来读/写设备,它们被映射到设备驱动的read()、write()或request()操作。在读/写过程中,针对不同的数据传输控制方式,驱动程序采取不同的管理方式实现具体的数据传输。

  4) 设备的控制操作
  对设备的控制操作通过系统调用ioctl()来完成。ioctl()的功能是向设备发出特定的请求,请求的含义及对应的操作与具体的设备相关,在各自的驱动程序中定义。例如,光驱的控制操作可以是弹出光盘,摄像头的控制操作可以是释放快门等。
 
 5) 设备中断的处理
  设备驱动程序需提供应对各种中断原因的中断处理程序。

6.5  字符与块设备的驱动技术
  1. 字符设备
  字符设备的驱动相对比较简单,主要工作包括注册、打开、操作、关闭和注销。
  
1) 字符设备的注册与注销
  系统启动时,初始化进程将调用各个设备驱动程序的初始化程序,执行驱动程序的登记和初始化任务。

  内核中设置了一个字符设备注册表chrdevs,每个注册了的字符设备驱动都在表中占有一个表项,以其主设备号作为散列索引来确定位置。驱动程序在向内核登记时,首先要指定或从内核获得一个主设备号,然后以此号为索引向字符设备表中添加一个表项。表项中name字段是设备的名字,fops字段是指向文件操作表file_operations的一个指针。file_operations表中保存了指向驱动程序提供的各个服务例程的函数指针。通过chrdevs表,内核可以掌握所有可用的字符设备以及它的可用的文件操作集。图7‑10是注册字符设备的描述结构。

图7‑10  字符设备的注册结构

 

  当驱动模块卸载时将执行系统的驱动注销函数。注销的操作主要是回收注册时分配给驱动程序的资源,包括主设备号和在chrdevs表中注册的表项。

  2) 字符设备的打开与关闭
  用户进程用open()系统调用打开设备。Open()系统调用的工作是:读取设备文件的i节点,建立它的VFS i节点以及file等对象(见图6-18);用chrdevs表中登记的文件操作集file_operations替换filef_op,然后将file连到当前进程的打开文件表file_struct(见图6-19);调用设备驱动的open()函数,设备的open()函数根据传来的i节点参数中的次设备号确定要打开的具体设备,检查设备错误并对其作初始化。至此,设备已准备就绪。

  用户进程执行close()系统调用来关闭设备。close()完成如下工作:释放该文件占用的fd等资源,将其file结构中的文件引用计数f_count1。若引用计数为0则释放file,并调用设备驱动的release()函数实际地关闭该设备。
 
 3) 字符设备的操作
  用户进程执行read()write()ioctl()系统调用来操作打开的设备文件,VFS的文件操作集file_operations将其映射到设备驱动的read()write()ioctl()函数,实现对设备的实际操作。对于只写设备(如打印机),它的read()函数是个空函数null()。同样,只读设备的write()函数也是空函数。

  2. 块设备
  块设备的驱动比字符设备的驱动要复杂得多,往往需要涉及到诸如缓冲、I/O调度、请求队列等相关技术。这一方面是因为块I/O与字符I/O的操作方式有极大的不同,另一方面是因为与字符设备相比,块设备的I/O效率对于系统的整体性能更为重要。

  1) 块设备驱动技术
  块设备与字符设备的主要区别在于块设备的操作是以块为单位的,因此需要经过缓冲区传输数据。为提高块设备的效率,Linux采用了缓冲区缓存(buffer cache)机制,所有对块设备的操作都要经过缓冲区缓存来进行。当用户进程需要读/写块设备时,它们实际执行的是缓冲区缓存的读/写函数。缓冲区缓存的读函数在缓冲区中检索数据,若命中就返回用户请求的数据,否则就请求设备执行实际的读出操作;缓冲区缓存的写函数将要写入设备的数据暂存在缓冲区中,在必要的时候再请求设备执行实际的写入操作。缓冲区缓存机制的好处是可以减少对设备的实际操作次数,提高进程的I/O速度。

  当实际执行块设备的I/O操作时,操作的执行顺序对I/O速度的影响很大。因为多数块设备(主要是磁盘)/写连续的扇区比分离的扇区速度更快。为提高I/O的效率,需要对操作顺序进行排序、调整和合并,以优化磁头移动性能。因此,Linux采用了请求队列和I/O调度策略。系统将对某个块设备的所有I/O操作请求排成一个队列,当缓存的读/写函数需要执行设备I/O操作时,它将调用IO调度程序对操作进行排序和合并,转换为一个请求加入到设备的请求队列中,等待处理。设备驱动程序逐个地处理请求队列中的各个请求,完成实际的设备I/O操作。由此可见,读/写块设备与读/写字符设备有着很大的不同。在读/写字符设备时,实际的硬件I/O一般紧接着就发生了,而读/写块设备时,实际的硬件I/O可能发生,也可能不发生或延时发生。

  2) 块设备的注册与注销
  Linux用块设备注册表blkdevs来登记已经注册了的块设备。blkdevs表的结构和作用与chrdevs表相似,也是使用设备的主设备号作为索引。当块设备驱动初始化时,它将通过填写blkdevs表向内核注册它的文件操作集。与字符设备不同的是,设备驱动还要为设备注册一个请求队列,它是驱动程序与缓冲区缓存的接口。请求队列的结构如图7‑11所示。

图7‑11  块设备的请求队列

 

  内核中为块设备的请求队列设置了一个blk_dev表,表的索引是设备的主设备号。每一个块设备驱动程序都要在blk_dev表中注册一个表项。表项中的request_fn字段是一个函数指针,它指向驱动程序提供的处理I/O请求的函数request()current_request字段是一个指针,它指向请求队列中的当前请求节点。每个请求节点代表了对块设备的一个请求,它是一个request结构,包含了一次块I/O操作的所有信息,如请求的状态rq_status、次设备号rq_dev、读/写命令cmd、开始扇区sector、扇区数nr_sectors、使用的缓冲区bh等。
  注销块设备时,需要释放驱动程序在blkdevs表以及blk_dev表中占有的所有资源。

  3) 块设备的打开与关闭
  打开与关闭块设备文件的操作与字符设备类似,只是在块设备的file结构中,f_op指向的文件操作集file_operations中的read()和write()不是由设备驱动提供的操作函数,而是系统提供的公共的缓存读/写函数。

  4) 块设备的读/
  块设备的读/写操作是通过缓存的read()write()公共函数进行的。当它需要启动设备执行I/O操作时,就通过I/O调度生成一个对设备的请求并将请求挂到设备的请求队列上。当请求队列不空的时候,系统将调用设备驱动在blk_dev中注册的request_fn函数来逐个处理请求队列中的各个I/O请求。驱动程序每次处理一个请求,将数据从设备读出到缓冲区,或从缓冲区写入到设备。请求完成后,系统将唤醒等待I/O的进程处理数据,驱动程序则继续处理下一个请求。

        习    题
  7-1 简述设备管理的基本功能。
  
7-2 什么是设备控制器?设备是怎样与I/O系统接口的?
  
7-3 I/O传输控制方式有哪几种?比较它们的优缺点。
  
7-4 什么是中断?为什么要引入中断?中断处理过程包括哪些步骤?
  
7-5 什么是DMA方式?简述DMA方式的数据传输过程。
  7-6 什么是缓冲?为什么引入缓冲?
  7-7 什么是缓存?缓存与缓冲有什么区别?

  7-8  什么是虚拟设备?实现虚拟设备的关键技术是什么?
  7-9  试说明SPOOLing系统的工作原理。
  
7-10  什么是设备驱动程序?它的主要功能是什么?
  
7-11  块设备与字符设备的驱动有哪些不同?
  
7-12  设备中断处理要完成哪些工作?Linux的设备中断处理有何特点?
  7-13  什么是设备独立性?Linux如何实现设备独立性?

di      

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
大量的在Linux下进行系统管理的命令。使用命令行进行管理是Linux系统的特点,对于Windows用户来说,需要尽快适应这种操作方式。   了解了命令的功能之后,还需要通过实践来掌握这些命令的使用方法,因为它们是进行系统管理的基础。 ·2.1 Linux的DOS-like命令 ·2.3 Linux的多人多工命令 ·2.5 Linux查找文件的相关命令 ·2.2 Linux特有的命令 ·2.4 Linux常用的压缩及解压缩命令 ·2.6 Linux常用的磁盘命令 第三:Shell操作与简易编程   Shell是Linux系统下的命令解释器,也是使用Linux系统的主要环境,Shell的功能很多,本主要从Shell的基本概念、Shell的种类、Shell中的特殊字符、重定向以及Shell程序几个方面来讲解,重点内容是Shell的特殊字符和Shell编程。 ·3.1 什么是Shell ·3.3 Shell基础 ·3.5 标准输入与输出 ·3.2 几种流行的Shell ·3.4 Shell特殊字符 ·3.6 Linux的Shell编程 第四:使用Vi编辑器   Vi是Linux下最重要的文本编辑器,在Linux的系统管理和网络管理中,会经常使用文本编辑器进行编辑工作,因此,Vi是进行系统和网络维护的基础。本主要介绍如何使用Vi编辑器进行基本的文本编辑工作。 ·4.1 Vi编辑器介绍 ·4.2 Vim的操作 第五Linux的引导过程及原理   本主要介绍计算机的启动顺序,包括从硬件自检到进入Linux系统当中的各个步骤,还介绍了Linux下的多系统引导工作GRUB(需要掌握GRUB的工作机制)。 ·5.1 计算机的启动顺序 ·5.3 GRUB的使用 ·5.5 从软盘启动GRUB ·5.2 Linux启动方式 ·5.4 设置GRUB 第六:软件安装及RPM的使用   在Windows下安装软件时,只需运行软件的安装程序(Setup, Install等)或者用解压缩软件解开即可安装,运行反安装程序(Uninstall, Unware, 卸载等)就能将软件清除干净。这些完全图形化的操作接口,简单到只要用鼠标一直单击【下一步】就可以了。而Linux就不一样了,很多的初学者都抱怨在Linux下安装和卸载软件非常地困难,没有像使用Windows时那么直观。   在Linux系统中,软件安装程序比较复杂,不过最常见的有两种: 一种是软件的源代码,您需要自己动手编译它。这种软件安装包通常是用gzip压缩过的tar包(后缀名为.tar.gz)。   另一种是软件的可执行程序,你只要安装它就可以了。这种软件安装包通常是一个RPM包(RedHat Linux Packet Manager,就是RedHat的软件包管理器),后缀名是.rpm。 当然,也有用RPM格式打包的源代码、用gzip压缩过的可执行套装程序。只要您理解了以下的思路,这两种形式的安装包也不在话下了。 ·6.1 RPM格式软件包的安装 ·6.3 源 码 包 ·6.2 提供安装程序的软件包 第七:配置和使用X Window   X Window是Linux下的图形用户界面,它可以简化系统和网络管理工作,使操作更加直观和简便。虽然大部分的系统管理员和网络管理员乐于在字符界面下工作,但是,X Window仍是Linux中必备的知识。   本主要介绍X Window的基本概念和基本工作原理,还介绍了基于X Window的图形窗口管理系统KDE。 ·7.1 X Window概述 ·7.3 配置和使用KDE ·7.2 启动X Window系统 第八:用户和用户组管理   Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。每个用户账号都拥有一个惟一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。   实现用户账号的管理,要完成的工作主要有如下几个方面:   · 用户账号的添加、删除与修改。   · 用户口令的管理。   · 用户组的管理。 ·8.1 Linux系统用户账号的管理 ·8.3 与用户账号有关的系统文件 ·8.5 赋予普通用户特殊权限 ·8.2 Linux系统用户组的管理 ·8.4 添加大量用户 ·8.6 Linux系统用户管理 第九:进程管理   Linux是一个多用户多工的操作系统。多用户是指多个用户可以在同一时间使用电脑系统;多工是指Linux可以同时执行多个任务,它可以在还未执行完一个任务时又执行另一项任务。   操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主存,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共用资源,当你提出一个请求时,给你造成一种假象,好像系统只被你独自占用。而实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户作业、操作系统任务、邮件和显示作业等。操作系统根据每个任务的优先顺序为每个任务分配合适的时间片段,每个时间片段大约都有零点几秒,虽然看起来很短,但实际上已经足够电脑完成成千上万的命令。每个任务都会被系统运行一段时间,然后挂起,系统转而处理其他任务;过一段时间以后再回来处理这个任务,直到某个任务完成,从任务队列中去除。 ·9.1 进程及作业 ·9.3 进程管理 ·9.2 创建进程 ·9.4 基于Webmin的进程管理 第十:文件管理   在Linux操作系统下,要经常对Linux文件和磁盘进行管理和操作。本主要介绍如何在Linux环境下对文件、磁盘、目录进行管理,还介绍了进行这些管理所需要的命令,并且详细的介绍了这些命令的用法和例子。需要掌握的是Linux系统是如何组织磁盘、目录和文件的,并熟练的掌握这些管理命令的用法。 ·10.1 磁盘管理 ·10.3 文件系统 ·10.2 文件与目录操作 ·10.4 高级文件系统管理
第一 Linux系统安装与环境介绍 5 1.1 Linux产生 5 1.2 Linux功能 5 1.3 Linux术语 5 1.4 Kernel 5 1.5 版本 5 1.6 安装RedHat Enterprise Linux ES 6 1.7 开关机操作 7 1.8 桌面环境简介 7 1.9 安装故障排除 7 1.10 安装逻辑卷 8 第二 Linux设备管理和引导流程 9 2.1 Linux文本编辑器 9 2.2 Linux下安装配置网卡 12 2.2.1 Linux下支持的网络设备 12 2.2.2 以太网网卡 13 2.3 配置显卡 13 2.4 Linux下使用外设 13 2.4.1 文件系统类型、设备名、装载目录 14 2.5 Linux文件目录 15 2.5.1 文件名 15 2.5.2 路径 15 2.6 Linux引导流程 15 2.7 有关的配置文件 16 2.8 Linux Shell 简介 17 第三 Linux 用户管理与磁盘管理 20 3.1用户和组 20 3.1.1 添加用户和组 20 3.1.2 与用户和组有关的重要文件 20 3.1.3 查封用户 21 3.2 权限管理 21 学习权限要掌握的基础 21 3.2.1 Linux中的访问权限 22 3.2.2 改变权限的命令 22 实例练习: 23 3.2.3 改变文件作者 26 3.3 Linux文件系统 26 3.4 Linux磁盘管理 26 第四 远程登录和PAM 30 4.1 OpenSSH 30 4.1.1 OpenSSH的安装 30 4.1.2 OpenSSH服务器的配置 30 4.1.3 使用ssh命令登录SSH服务器 30 4.2 Telnet服务 31 4.3 插入式身份认证模块 32 第五 SAMBA和NFS服务 33 5.1 SAMBA服务简介 33 5.2 配置方法 33 5.3 NFS服务配置方案 36 第六 DHCP服务 38 6.1 DHCP服务简介 38 6.2 DHCP服务的原理 38 6.3 DHCP服务的配置 38 配置方案: 39 测试及管理方法: 39 第七 域名系统 40 7.1 域名系统简介 40 7.2 配置文件 40 7.3 相关工具 40 7.4 安装DNS服务 40 7.5 DNS的配置 41 7.6 测试及管理办法 43 第八 Apache和Vhost服务 44 8.1 Web服务器简介 44 8.2 安装和启动Adache 44 8.3 Apache的配置 44 1、查看编译配置参数 44 2、查看已经被编译的模块 44 3、Apache的配置文件 44 4、基本配置 44 5、分割配置任务 45 8.4 Vhost配置 45 1、DNS配置 45 第九 邮件服务器和数据库服务器 49 9.1 SendMail 服务 49 9.2服务原理 49 9.3配置文件 49 9.4安装sendmail 50 9.5 配置方案 50 9.6 数据库服务器的安装和配置 52 一、所需软件: 52 二、安装和配置 52 三、测试 54 四、Server的启动与关闭 54 第十 FTP服务器和Linux安全 55 10.1 FTP服务器简介 55 10.2 FTP运行原理 55 10.3 Linux下的FTP服务器 55 10.3.1安装并启动vsftpd 55 10.3.2 配置vsftpd 55 10.4 使用vsftp服务 56 10.4 Linux安全初步 56
Linux是一个多任务、多用户的操作系统,它以其良好的特性和资源的免费性而得到了蓬勃的发展。  本书通过大量的图示和实例,深入浅出的介绍了Linux的基本原理和应用。主要包括Linux的基本概念和操作,Linux的树型结构,Linux的文本编辑,Linux的安装和启动,用户管理,Shell编程技术,进程管理,C编译器,系统扩充,维护与监视,Linux的图形界面,网络的基本概念与设置,Linux在网络资源共享和电子邮件方面的应用,以及DNS、FTP、Web和Proxy服务器等内容。  本书可作为Linux操作系统课程的教材,也可作为电脑爱好者,相关技术人员及参加Linux认证考试人士的参考书。 一、关于Linux Linux是一个正在蓬勃发展的极富生命力的操作系统。芬兰青年Linus Torvalds和其杰作的传奇故事吸引了无数的电脑爱好者尝试去使用Linux,但他们中的大多数人却被Unix类操作系统传统的枯燥的字符界面、艰涩难懂的操作命令和数量庞大的基本概念以及基础知识所吓退。Linux在这几年中迅速地发展,Turbo Linux宣布该公司已经开始盈利了,这说明了Linux正在逐渐大众化。在未来的几年中,Linux在各行各业中的应用将遍地开花,能熟练操作Linux将是每一个系统管理员所需掌握的基本技能。 曾经有一种说法:能熟练操作Linux的人,必定是电脑业界的顶尖高手。本书正是为改变这一种看法而面世的,它主要面向那些对电脑系统有初步认识的初学者,即使读者从未接受过电脑方面的系统训练,甚至连微软的Windows都没有学过,也能从本书中获益。 二、本书特点 1)在介绍过程中,着重于概念的层次性和内容的衔接,使读者更容易进行学习。 2)为了能把深奥、复杂的概念和操作表达明白,本书使用了大量的插图和实际操作例子,使之通俗易懂。例如:在网络应用部分中的很多例子,都在中山大学服务器上运行,每天都在承受巨大的访问量。 3)配置了大量习题。 三、本书结构安排 本书共分19,遵循由简到繁、由易到难的讲解方式来组织、安排内容。 第1Linux基础。本首先对Unix进行了概述,然后介绍了Linux的技术特点、Linux的版本,以及Linux对中文的支持。 第2:基本操作。本主要介绍了Linux的一些基本操作。如:注册、注销、远程登录、更改时间、关闭系统等。 第3:树型结构。本主要介绍了Linux的文件结构、目录结构,同时还介绍了链接,并用大量的实例形象生动地说明了Linux下各种文件的操作。 第4:文本编辑。本主要介绍了Linux下的文本编辑器,这是使用Linux的一些基本技能。学好本,有利于以后的学习。 第5Linux的安装和启动。本主要介绍了Linux的安装和启动,其中涉及到一些原理以及其他Unix类操作系统上的原理。 第6:用户管理。本主要介绍了Linux下增加用户、删除用户、设置用户组的各种操作,这些操作是进入Linux系统的第一步。 第7:Shell和Shell编程。本主要介绍了Shell的基本概念、Shell脚本以及awk的相关知识。 第8:进程管理。本主要介绍了在Linux中的进程管理。其中包括了进程、进程数、进程的优先级、定时执行等。 第9:C编译器—— gcc。本主要介绍了Linux下面的编译器—— gcc的基本用法以及Make与Makefile的一些基本知识。 第10:系统扩充。本主要介绍了在Linux中系统的扩充,包括软件的安装和内核的升级等内容。 第11:系统维护与监视。本主要介绍了Linux中的文件系统维护与监视。其中包括交换空间、/proc的信息以及各种日志文件和进程记账等。 第12:图形界面。本主要介绍了X Window以及它的配置,并且介绍了在KDE环境下汉化的基本思想,用实例来讲解了Linux汉化的基础知识。 第13:网络的基本概念与设置。本主要介绍了网络的基本概念,并在讲解这个概念的同时,讲解Linux中的网络配置。在此同时讲解了Linux的基本的网络命令,这对于理解Linux的网络上面的基本运用有着很大的作用。 第14:网络资源共享。本主要介绍了NFS文件系统、NFS文件系统的架设、Samba的资源共享、打印机网络共享等内容。 第15:电子邮件。本主要介绍电子邮件系统、Linux下的电子邮件系统,以及建立Linux下的邮件服务器。 第16:DNS服务器。本主要介绍DNS工作的原理、Linux下的域名服务器系统以及BIND的安装与配置等内容。详细叙述了主DNS服务器和辅助DNS服务器的配置以及DNS的安全。 第17:FTP服务器。本主要介绍了wu-ftp服务器的安装、配置和使用,Proftpd服务器的安装、配置和使用。 第18:Web服务器。本主要介绍了Apache的安装和配置。从Apache的最基本配置到它的高级运用,在本中都有详细的叙述。 第19:Proxy服务器。本主要介绍在Linux上比较常用的两个proxy服务器软件的配置。 本书最后还附有参考答案,以供读者对照课后习题进行练习。 四、本书适用对象 本书适合用于大专院校、电脑培训班等作为Linux或UNIX操作系统课程的教材,也可作为电脑爱好者、相关技术人员或准备参加Linux认证的读者的参考书。 本书写作过程中受到广东省自然科学基金和中山大学青年启动基金的帮助,在此特表感谢! Linux发展至今,经历了无数人的努力,是千万人智慧的结晶。最新的Linux发布版,完全安装需要占用1G以上的空间,要完全掌握这样一个庞大的系统,并不是一件容易的事情,这对于作者本身也毫不例外。读者在学习本书的过程中如遇到疑难问题或觉得不妥之处,可到相关网站的论坛进行探讨,网址:http://www.cnbook.net。 尽管作者写这本书时具有良好初衷而且竭尽全力,但由于水平有限和时间仓促,疏漏之处在所难免,敬请读者批评指正和原谅。 编 者 2002年12月 第1 Linux基础 1 1.1 Unix概述 1 1.1.1 Unix的历史 1 1.1.2 Unix的特点 3 1.1.3 Unix的现状和未来 5 1.2 Linux基础知识 5 1.2.1 Linux的历史 6 1.2.2 Linux的技术特点 6 1.2.3 Linux的版本 7 1.2.4 Linux对中文的支持 8 小结 8 习题一 8 一、思考题 8 二、选择题 9 三、上机操作 9 第2 基本操作 10 2.1 进入Linux系统 10 2.1.1 开机与系统选择 10 2.1.2 注册 10 2.1.3 控制和终端操作 11 2.1.4 进入图形界面 11 2.1.5 用Telnet方式远程连入 12 2.2 一些基本命令 13 2.2.1 修改密码 13 2.2.2 查询、修改日期与时间 14 2.2.3 观看月历 15 2.2.4 清屏 16 2.2.5 获取注册信息 16 2.2.6 与其他用户作简单通讯 17 2.2.7 观看主机配置情况 18 2.2.8 寻找命令使用方法 18 2.3 退出Linux 19 2.3.1 注销 19 2.3.2 关闭系统 19 小结 20 习题二 21 一、思考题 21 二、选择题 21 三、上机操作 21 第3 树型结构 23 3.1 文件 23 3.1.1 Linux的文件 23 3.1.2 文件操作相关命令 24 3.2 目录和路径 27 3.2.1 树型结构基础知识 27 3.2.2 路径 30 3.2.3 与树型结构相关的操作 32 3.2.4 通配符与多文件操作 37 3.3 链接 41 3.3.1 硬链接 41 3.3.2 符号链接 42 3.4 文件的属性 43 3.4.1 显示文件的属性 43 3.4.2 权限字与权限操作 46 3.5 设备文件 48 3.6 磁盘的操作 51 3.7 备份 60 小结 62 习题三 62 一、思考题 62 二、选择题 63 三、上机操作 64 第4 文本编辑 65 4.1 行编辑器ed 65 4.1.1 启动ed 65 4.1.2 输入和修改 65 4.1.3 查找与替换 67 4.1.4 保存与退出 67 4.2 全屏幕编辑器vi 67 4.2.1 进入vi及vi状态 67 4.2.2 光标移动 68 4.2.3 删除与恢复 69 4.2.4 替换 69 4.2.5 保存与退出 70 4.2.6 进入插入状态 70 4.2.7 寻找指定字符或字符串 72 4.2.8 块操作 75 4.3 功能强大的Emacs 76 4.3.1 Emacs是什么 76 4.3.2 Emacs的操作 77 4.4 文本的基本操作命令 87 4.4.1 more与less 87 4.4.2 pr 88 4.4.3 tail与head 89 4.4.4 spell 90 4.4.5 diff与cmp 90 4.4.6 wc 91 4.4.7 find与grep 92 小结 94 习题四 94 一、思考题 94 二、选择题 95 三、上机操作 95 第5 Linux的安装和启动 96 5.1 安装的基本知识 96 5.1.1 硬件要求 96 5.1.2 硬盘分区 96 5.1.3 Linux的起动与多系统并存 96 5.1.4 安装前的准备 97 5.2 安装的过程 97 5.3 Loadlin方式的引导 105 5.4 安装后Linux系统的构成 107 5.5 引导过程 109 5.5.1 lilo 109 5.5.2 内核 111 5.5.3 init与inittab 112 5.5.4 Shell 114 小结 114 习题五 115 一、思考题 115 二、选择题 115 三、上机操作 115 第6 用户管理 116 6.1 用户账号的设置 116 6.1.1 增加用户 116 6.1.2 /et/passwd文件与/etc/shadow文件 117 6.1.3 删除用户 119 6.1.4 观看和修改用户资料 120 6.2 用户组的设置 122 6.2.1 /etc/group文件 122 6.2.2 用户组的操作 123 小结 124 习题六 124 一、思考题 124 二、选择题 124 三、上机操作 125 第7 Shell和Shell编程 126 7.1 什么是Shell 126 7.1.1 Shell的类型 126 7.1.2 为用户指定Shell 127 7.1.3 Shell的环境 128 7.2 Shell脚本 130 7.2.1 Shell脚本的编写 130 7.2.2 控制流 132 7.2.3 here文本 135 7.2.4 几个特别的Shell脚本 135 7.3 awk 141 7.3.1 调用awk 141 7.3.2 awk脚本 142 7.3.3 模式和动作 142 7.3.4 域和记录 142 7.3.5 awk内置变量 143 7.3.6 awk的字符函数 144 7.3.7 数组 144 7.3.8 控制流和循环 145 小结 145 习题七 145 一、思考题 145 二、选择题 149 三、上机操作 149 第8 进程管理 150 8.1 进程管理的应用 150 8.2 定时执行 155 小结 156 习题八 157 一、思考题 157 二、选择题 157 三、上机操作 157 第9 C编译器—— gcc 158 9.1 什么是gcc 158 9.1.1 gcc简介 158 9.1.2 gcc的用法 158 9.2 make与Makefile 159 小结 160 习题九 161 一、思考题 161 二、选择题 161 三、上机操作 161 第10 系统扩充 166 10.1 软件安装 166 10.1.1 传统安装 166 10.1.2 rpm 168 10.2 内核升级 171 10.2.1 获得内核源码 171 10.2.2 配置内核 171 10.2.3 编辑与安装新内核 182 小结 185 习题十 185 一、思考题 185 二、选择题 185 三、上机操作 186 第11 系统维护与监视 187 11.1 文件系统维护 187 11.2 交换空间 187 11.3 系统监视 189 小结 194 习题十一 195 一、思考题 195 二、选择题 195 三、上机操作 195 第12 图形界面 196 12.1 X Window 196 12.1.1 什么是X 196 12.1.2 X的结构 196 12.2 Linux下的X——XFrea86 197 12.2.1 配置 197 12.2.2 Xfea86图形界面的功能与操作 199 12.2.3 中文化问题 202 小结 206 习题十二 206 一、思考题 206 二、选择题 206 三、上机操作 206 第13 网络的基本概念与设置 207 13.1 什么是网络 207 13.1.1 网络的定义 207 13.1.2 网络的分类与结构 207 13.1.3 网络的硬件与软件 208 13.1.4 网络的应用 209 13.2 Internet与TCP/IP协议 210 13.2.1 Internet的历史与现状 210 13.2.2 TCP/IP基础知识 212 13.3 Linux的基本网络配置 213 13.3.1 安装与驱动网卡 213 13.3.2 设定IP地址及TCP/IP 基本参数 213 13.3.3 检测连通性 215 13.3.4 使用MODEM拨号上网 216 13.4 TCP/IP实用程序 218 13.4.1 ping 218 13.4.2 Telnet 219 13.4.3 FTP 220 13.4.4 traceroute 223 13.4.5 ifconfig 224 小结 225 习题十三 225 一、思考题 225 二、选择题 225 三、上机操作 225 第14 网络资源共享 226 14.1 Linux/Unix系统之间 文件共享——NFS 226 14.1.1 NFS的概念 226 14.1.2 NFS的安装和启动 226 14.1.3 架设NFS文件系统 227 14.2 Linux/Windows系统之间文件 共享——Samba 229 14.2.1 什么是Samba 229 14.2.2 安装与启动Samba 229 14.2.3 Samba的配置 230 14.2.4 在Linux上访问Windows 的共享资源 233 14.3 打印机网络共享 233 14.3.1 建立打印服务器 233 14.3.2 使用远程打印机 234 小结 234 习题十四 235 一、思考题 235 二、选择题 235 三、上机操作 235 第15 电子邮件 236 15.1 电子邮件系统 236 15.1.1 电子邮件的历史 236 15.1.2 电子邮件的体系结构和服务 236 15.2 Linux下的电子邮件系统 237 15.2.1 Linux下的邮件服务器 237 15.2.2 Linux下的邮件用户代理 242 15.3 mail命令 242 15.4 建立Linux下的邮件服务器 247 15.4.1 sendmail的复杂性 247 15.4.2 sendmail的组成结构和原理 247 15.4.3 编译和配置sendmail 251 15.4.4 技巧和提示 253 小结 256 习题十五 256 一、思考题 256 二、选择题 256 三、上机操作 257 第16 DNS服务器 258 16.1 DNS的工作原理 258 16.1.1 域名 258 16.1.2 因特网的域名系统 258 16.1.3 DNS的消息格式 260 16.1.4 对象内容与资源记录内容 261 16.2 Linux下的域名服务器系统 261 16.3 BIND的安装与配置 262 16.3.1 BIND的编译与安装 262 16.3.2 Linux下与域名系统相关的 几个配置文件 263 16.3.3 Caching Only域名服务器 的配置 264 16.3.4 主域名服务器的配置 269 16.3.5 从域名服务器的配置 272 16.4 设置chroot的DNS 273 小结 275 习题十六 276 一、思考题 276 二、选择题 276 三、上机操作 276 第17 FTP服务器 277 17.1 wu-ftp 277 17.1.1 wu-ftp的安装 277 17.1.2 wu-ftp的配置 278 17.1.3 wu-ftpd的启动和测试 285 17.1.4 实用命令 286 17.2 Proftpd 286 17.2.1 Proftpd的安装 286 17.2.2 Proftpd的配置 286 17.2.3 一个实例 289 17.2.4 proftpd的启动和测试 292 小结 292 习题十七 292 一、思考题 292 二、选择题 292 三、上机操作 292 第18 Web服务器 293 18.1 Apache的安装 293 18.1.1 编辑设置 293 18.1.2 编译和安装 294 18.2 Apache的配置 294 18.2.1 全局设置 295 18.2.2 主服务器设置 297 18.3 虚拟Web服务器 308 18.3.1 虚拟主机的类型与运行方式 308 18.3.2 基于IP的虚拟主机 308 18.3.3 基于域名的虚拟主机 310 小结 312 习题十八 312 一、思考题 312 二、选择题 312 三、上机操作 312 第19 Proxy服务器 313 19.1 Proxy的概念 313 19.1.1 什么是Proxy 313 19.1.2 Proxy的应用 313 19.2 利用Apache建立Proxy 313 19.2.1 配置前的准备工作 314 19.2.2 建立Proxy服务器 314 19.2.3 建立Cache服务器 315 19.2.4 常用的mod_proxy模块的指令 315 19.3 Squid 316 19.3.1 安装Squid 316 19.3.2 配置Squid 317 19.3.3 更多的配置参数 319 19.3.4 启动和关闭Squid 327 19.3.5 日志文件 327 小结 328 习题十九 328 一、思考题 328 二、选择题 328 三、上机操作 329 参考答案 330
LINUX设备驱动第三版_ 前言 第一 设备驱动程序简介 设备驱动程序的作用 内核功能划分 设备和模块的分类 安全问题 版本编号 许可证条款 加入内核开发社团 本书概要 第二 构造和运行模块 设置测试系统 Hello World模块 核心模块与应用程序的对比 编译和装载 内核符号表 预备知识 初始化和关闭 模块参数 在用户空间编写驱动程序 快速参考 第三 字符设备驱动程序 scull的设计 主设备号和次设备号 一些重要的数据结构 字符设备的注册 open和release scull的内存使用 read和write 试试新设备 快速参考 第四 调试技术 内核中的调试支持 通过打印调试 通过查询调试 通过监视调试 调试系统故障 调试器和相关工具 第五 并发和竞态 scull的缺陷 并发及其管理 信号量和互斥体 completion 自旋锁 锁陷阱 除了锁之外的办法 快速参考 第六 高级字符驱动程序操作 ioctl 阻塞型I/O poll和select 异步通知 定位设备 设备文件的访问控制 快速参考 第七 时间、延迟及延缓操作 度量时间差 获取当前时间 延迟执行 内核定时器 tasklet 工作队列 快速参考 第八 分配内存 kmalloc函数的内幕 后备高速缓存 get_free_page和相关函数 vmalloc及其辅助函数 per-CPU变量 获取大的缓冲区 快速参考 第九 与硬件通信 I/O端口和I/O内存 使用I/O端口 I/O端口示例 使用I/O内存 快速参考 第十 中断处理 准备并口 安装中断处理例程 实现中断处理例程 顶半部和底半部 中断共享 中断驱动的I/O 快速参考 第十一 内核的数据类型 使用标准C语言类型 为数据项分配确定的空间大小 接口特定的类型 其他有关移植性的问题 链表 快速参考 第十二 PCI驱动程序 PCI接口 ISA回顾 PC/104和PC/104+ 其他的PC总线 SBus NuBus 外部总线 快速参考 第十三 USB驱动程序 USB设备基础 USB和Sysfs USB urb 编写USB驱动程序 不使用urb的USB传输 快速参考 第十四 Linux设备模型 kobject、kset和子系统 低层sysfs操作 热插拔事件的产生 总线、设备和驱动程序 类 各环节的整合 热插拔 处理固件 快速索引 第十五 内存映射和DMA Linux的内存管理 mmap设备操作 执行直接I/O访问 直接内存访问 快速参考 第十六 块设备驱动程序 注册 块设备操作 请求处理 其他一些细节 快速参考 第十七 网络驱动程序 snull设计 连接到内核 net_device结构细节 打开和关闭 数据包传输 数据包的接收 中断处理例程 不使用接收中断 链路状态的改变 套接字缓冲区 MAC 地址解析 定制 ioctl 命令 统计信息 组播 其他知识点详解 快速参考 第十八 TTY驱动程序 小型TTY驱动程序 tty_driver函数指针 TTY线路设置 ioctls proc和sysfs对TTY设备的处理 tty_driver结构详解 tty_operations结构详解 tty_struct结构详解 快速参考 参考书目 9112405-1_o.jpg (85.53 KB, 下载次数: 50)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值