1、设备管理的目标设备管理的目标l计算机的设备进行管理有两大目标:一是提高设备的利用率;二是方便用户使用。课程内容:课程内容:lLinux设备管理分类lLinux设备驱动程序的接口lLinux磁盘高速缓存管理lLinux的字符设备缓冲区管理lLinux的设备驱动lLinux系统I/O软件层次结构一、一、Linux中设备的分类与表示中设备的分类与表示(1)字符设备 如键盘、鼠标、显示器、打印机等。通常用于输入输出,作为人和计算机之间的接口,信息的存取以字符为单位进行。(2)块设备 如磁盘、磁带等,用于存储信息,它对信息的存取控制是以信息块为单位的。特别文件特别文件l每个设备都有自己的设备名,用户通过
2、设备名来访问具体物理设备,设备名存放在/dev目录下。l硬盘:/dev/hda,/dev/sda l软盘:/dev/fd0 l光盘:/dev/cdrom l鼠标:/dev/psaux(ps/2)/dev/input/mice(USB)l打印机:/dev/lp l控制台:/dev/consolel网卡:/dev/eth0l但是像块设备磁盘、磁带上的普通文件和目录不是特殊文件。二、二、Linux设备驱动程序的接口设备驱动程序的接口 1、文件系统与设备驱动程序的接口、文件系统与设备驱动程序的接口lLinux系统中,用户程序通过文件操作方式如打开、关闭、读写等来使用设备,由文件系统转入设备驱动程序。l
3、在Linux中系统提供块设备开关表和字符设备开关表作为核心与设备驱动程序之间的接口。l每一种设备类型在表中占用一个表目,包含若干数据项,其中有一项为该类设备驱动程序入口地址,在系统调用时引导核心转向适当的驱动程序接口。块设备开关表 字符设备开关表 操作主设备号OpenClose Read Write0驱动程序入口地址驱动程序入口地址驱动程序入口地址驱动程序入口地址1驱动程序入口地址驱动程序入口地址驱动程序入口地址驱动程序入口地址 操作主设备号OpenClose Strategy(read/write)0驱动程序入口地址驱动程序入口地址驱动程序入口地址1驱动程序入口地址驱动程序入口地址驱动程序入
4、口地址2、文件的系统调用过程、文件的系统调用过程 对设备特殊文件的系统调用,根据文件类型转入块设备开关表或字符开关表进行打开、关闭块设备或字符设备的操作。字符设备特殊文件的系统调用Read、Write转向字符开关表中指示的设备驱动程序,而对普通文件或目录文件的Read、Write系统调用则通过高速缓冲模块转向设备驱动模块中的策略(Strategy)过程。文件系统对字符设备特殊文件的系统调用open close read write对块设备文件的系统调用open close对普通文件的系统调用read write高速缓冲模块字符设备开关表块设备开关表字符设备块设备中断向量表open close
5、read write字符设备驱动程序设备中断处理程序open close strategy 块设备驱动程序 设备中断处理程序三、三、Linux磁盘高速缓存管理磁盘高速缓存管理1、磁盘高速缓存策略、磁盘高速缓存策略lLinux磁盘缓冲管理策略试图把尽可能多的有用数据保存在缓冲区中。l从磁盘中读数据时,文件系统先从磁盘高速缓存中读,如果数据已在高速缓存中,则不必启动磁盘I/O,直接在高速缓存中读取;如果数据不在高速缓存中,则启动磁盘时I/O,从磁盘读取数据送往高速缓存,进程再从高速缓存中读取数据。lLinux采取了“延迟写”策略。2、磁盘缓冲区管理的数据结构、磁盘缓冲区管理的数据结构l Linux
6、使用多个内存缓冲区进行磁盘缓冲,为了合理有效地使用这些缓冲区,设置了一定的数据结构按照一定策略进行管理。管理的依据是缓冲区的相关信息,为了能访问这些信息,必须将其按一定的数据结构进行组织。l 每一个缓冲区建立“缓冲首部”来存放该缓冲区的相关信息 缓冲首部缓冲首部设备号dev设备缓冲区队列后向指针b-back块号blkno空闲缓冲区队列前向指针Av-forw状态flag空闲缓冲区队列后向指针Av-back设备缓冲区队列前向指针b-forw 忙标志位BUSY:缓冲区当前是否忙 有效位AVE:缓冲区包含的数据是否有效 延迟写位DELWR:是否延迟写 写标志位WRITE:是否正在把缓冲区的内容写到磁盘
7、上 读表示位READ:是否从磁盘往缓冲读取信息 等待位WAIT:是否有一个进程正在等待该缓冲区空闲缓冲区队列(空闲缓冲区队列(BUSY=0)Av-forwAv-backAv-forwAv-backAv-forwAv-back设备缓冲区队列(设备缓冲区队列(BUSY=1)b-forw b-backbv-forwbv-backb-forw b-back3、Linux磁盘缓冲区管理算法磁盘缓冲区管理算法 高速缓冲区的分配高速缓冲区的分配l 当某进程要从一个磁盘读取数据时,先检查要读取的磁盘块是否包含在某个缓冲区中,如果不在,则从空闲缓冲区队列中分配给它一个空闲缓冲区;当某进程要将数据写入磁盘时,先看
8、一下要写的磁盘块是否在某个缓冲区,如果不在则为这个磁盘块分配一个空闲缓冲区。被分配的空闲缓冲区从空闲缓冲区队列中退出,进入相应设备的设备缓冲区队列,该缓冲区的BUSY位置1。l 当缓冲区的信息读到相应进程的内存后,便释放进程使用的缓冲区,将Flag中的BUSY位置0,送入空闲缓冲区队尾;同时也将置为延迟写的缓冲区也送入空闲缓冲区队列。这样可以使有效的缓冲区得到充分利用,满足多个并发进程的需要。l 当一个缓冲区被送往空闲缓冲区队尾时,并不退出设备缓冲区队列,而仍然留在原队列中。这样做的原因是,此次使用完毕送往空闲缓冲区队列的缓冲区,其保留的信息可能被再次访问。如果将其保留在设备缓冲区队列中,当后
9、来要读取的磁盘数据块仍然保留在此缓冲时,可以直接从此缓冲区读,而不必启动磁盘I/O,提高了读盘速度,这正是使用磁盘高速缓存的目的。“延迟写延迟写”缓冲区的处理缓冲区的处理l 如果要将一个使用完毕送入空闲缓冲区队列的缓冲区分配给其他设备,则可以将该缓冲同时从空闲缓冲区队列和原设备缓冲区队列中抽出,送入新的设备缓冲区队列。l 因为被使用过的缓冲区在空闲缓冲区队列的末尾,随着不断地空闲缓冲区队列上摘下缓冲区,后面的缓冲区会不断向队首移动,如果一个延迟写标志位为1的缓冲区移到空闲缓冲区队列的头部,当其被重新分配之前,要先把其内容写到相应设备的指定的磁盘块中。四、四、Linux字符设备缓冲区管理字符设备
10、缓冲区管理(1)字符缓冲区及其队列)字符缓冲区及其队列 Linux中为字符设备的数据传输设置了一个公用的字符缓冲池,该缓冲池内含有若干个缓冲区,但每个缓冲区很小,只含几个或十几个字节。为合理使用这些缓冲区,将其组织成一定的数据结构。同块设备缓冲区的管理类似,建立空闲字符缓冲区队列和设备字符缓冲区队列。字符缓存区数据结构字符缓存区数据结构 首字符位置字符缓冲区末字符位置指向下一字符缓冲区(2)空闲字符缓冲区的分配和回收)空闲字符缓冲区的分配和回收l 在一进程用字符设备进行I/O操作时,文件系统为该字符设备分配一个空闲缓冲区。l分配时要检测空闲缓冲区队列,当队列非空时,从队首取下一个空闲缓冲区分配
11、该字符设备,送入该字符设备的字符缓冲区队列,并把指向该缓冲区的指针返回给调用进程;当队列为空时,表明已经没有缓冲区可分配,则请求I/O操作的进程被阻塞。l当字符缓冲区中的数据被提取完后,便释放该缓冲区,将该缓冲区送入空闲字符缓冲区队列的首部。(空闲字符缓存区队列其实是一个栈)若此时有因申请空缓冲区而阻塞的进程,则将其唤醒。五、五、Linux的设备驱动的设备驱动 设备驱动是指控制具体的物理设备完成I/O操作,与硬件的物理特性和数据传输控制方式密切相关,不同类型的设备、不同数据传输控制方式要采用不同设备的驱动方式。1、块设备驱动、块设备驱动(1)数据结构 块设备表 I/O请求队列(2)磁盘设备驱动
12、程序 打开硬盘 读写硬盘(1)块设备驱动的数据结构)块设备驱动的数据结构l块设备表块设备表l 对每一类块设备,分别设置块设备表,记录该类设备的相关信息。其内容包括:l忙标志:标志设备的忙闲状态,0表示空闲,1表示正忙l错误次数:指设备I/O出错次数l设备缓冲区队列头指针:分配给设备的缓冲区队列的头指针l设备缓冲区队列尾指针:分配给设备的缓冲区队列的尾指针lI/O请求队列头指针:请求该类设备I/O操作的请求块组成的队列的头指针lI/O请求队列尾指针:请求该类设备I/O操作的请求块组成的队列的尾指针I/O请求队列请求队列l 用户进程的I/O请求包括要求完成I/O操作的逻辑设备名、要求的操作、输送数
13、据在内存中的起始地址、传送数据的长度,将这些信息组织成I/O请求块iorb。逻辑设备名相同(同一类设备)的I/O请求块构成一个队列,称为I/O请求队列。每类设备分别有一个I/O请求队列。(2)磁盘驱动程序)磁盘驱动程序 驱动程序控制设备具体实现进程的高级I/O请求包括打开、关闭、读、写等。l打开。硬盘在使用之前必须进行打开操作,其目的是在使用硬盘之前进行必要的初始化设置硬盘的工作参数。硬盘的工作参数存放在主存中操作系统数据结构硬盘控制块中,它是驱动程序对硬盘进行控制的依据。硬盘工作参数存放在硬盘的引导区中,因此要将引导区内容读到硬盘控制块中。l 为了读写硬盘引导区,必须初启硬盘,首先测试该设备
14、是否就绪(通过测试设备控制器的设备状态寄存器的ready位判断),如果已就绪再测试该硬盘是否可用。设备不能使用的原因可能是没有格式化或其它一些硬件故障,测试的方法是读取该硬盘的首标,如果不能被正确读出,说明硬盘不能使用,否则是可以使用的。如果是限定时间内设备未就绪或经测试不能使用,则设备初启失败。若初启成功,便读取硬盘引导区,初始化硬盘控制块。读写硬盘读写硬盘 由策略接口程序strategy完成,每次只读写一个扇区。Linux中对硬盘有两种读方式和三种写方式。l 一般读:把当前所需盘块中的内容读入缓冲区。l 预先读:进程读顺序文件的盘块时,会预见到要读的下一个盘块,因此读出当前块后可提前读下一
15、盘块。一般写:把缓冲区数据写到盘块,且进程必须等待写操作完成。l 异步写:把缓冲区数据写到盘块,但进程不必等待写操作完成。l 延迟写:当进程要把数据写到盘上时,先写到缓冲区,然后将该缓冲区标记为延迟写,挂到空闲缓冲区队列的末尾,但并不立即将该缓冲区的内容写到磁盘。硬盘读写驱动过程硬盘读写驱动过程将逻辑块号转换为物理块号;申请DMA;将物理块号转换为盘面号/柱面号/扇区号;移动磁头到指定柱面;向硬盘控制器发送读写命令。CPU发出读写命令后不必等待,而继续执行其他进程。但传输结束后,硬盘控制器向CPU发送中断信号,CPU响应后转入硬盘中断处理程序。硬盘中断处理过程硬盘中断处理过程 检测此次数据传输
16、是否出错,传输错误记录在硬盘控制器的状态寄存器中,如果出错,进行错误处理;由于磁盘读写一次只能传输一个扇区,每传输一个扇区就中断一次,而I/O读写请求缓冲区可能有大于一个扇区的数据要传输,因此每次传输结束,中断处理程序要检查I/O读写请求缓冲区内是否还有数据传输,若有,则继续传输余下的数据,若没有,说明一个缓冲区已经传输完毕。若I/O读写请求缓冲区内的数据全部传输完毕,则唤醒等待传输完成的进程。2、字符设备驱动、字符设备驱动l 字符设备的传送用一组专用的寄存器来实现。每种字符设备的控制器一般都有3个寄存器:控制寄存器接收CPU发送来的命令,控制设备的操作;状态寄存器保存设备的状态;数据寄存器暂
17、存要传送的数据。(1)数据结构 对每类字符设备分别建立字符设备表,记录使用该类字符设备所需的各种信息。(2)终端驱动程序 字符设备种类繁多,其驱动程序各不相同,在这里以终端驱动程序为例来讲述Linux中字符设备驱动程序的工作原理。l 终端主要由键盘和显示器构成,终端驱动程序控制终端设备和进程之间的字符数据传输,包括以下5个操作:l ttopen:打开终端机,建立终端机和终端进程之间的对应关系。l ttclose:切断终端机和终端进程的联系。l ioctl:用于对终端机的控制,例如状态设置、测试、终端机属性 值的更改等。l ttread:从终端键盘读入数据。l ttwrite:向终端显示器写数据
18、。ttread过程过程l 当从键盘键入数据时,终端中断处理程序把键盘数据放入原始输入缓冲队列,同时送往输出缓冲队列,以便送到显示器输出,当键入回车键时,终端中断处理程序,唤醒所有处于睡眠状态的等待读终端的进程。当一个读终端的进程执行时,由ttread调用行规则程序,从原始输入缓冲队列中依次取出字符,进行必要的格式转换后,放入标准输入缓冲队列,同时,将输出缓冲队列中的字符送往显示器显示,然后把标准输入缓冲队列中的字符复制到应用程序数据存储区。如果当前各原始输入缓冲队列中都没有数据,则ttread睡眠。ttwrite过程过程 对于ttwrite,它首先调用行规则程序,从应用程序数据存储区把输出的数
19、据送入输出缓冲队列,并对每个输出字符进行行规则处理。当输出缓冲队列中的字符量大于某个上限时,启动终端输出数据并使写进程睡眠。输出使得输出缓冲队列中的字符存量减少,当输出缓冲队列中的字符量小于某个下限时,唤醒有关睡眠进程执行写操作。行规则程序行规则程序 行规则程序把数据按行(以回车为结束标志)缓存起来,并按标准格式或原始格式传送数据。行规则程序的功能如下:l通过分析将输入字符串组成行。l处理删除键,以便用户能够从逻辑上删除已键入的字符。l处理行删除键,从而使当前行无效。l处理字符格式,例如把制表符变为8个空格序列。l把输入的字符回送到显示器。l为中断挂起、断线或响应delete键向进程发送软中断信号。l允许不做格式变换。六、六、Linux系统系统I/O软件层次结构软件层次结构l主要的任务是充分发挥各种设备的作用,屏蔽各种设备的特殊性,在保证系统具有较高的整体性的同时,尽可能向用户提供一个友好、清晰、规范和设备独立的配置及使用界面。l操作系统中I/O软件大多数都可以看作是分层结构。LinuxLinux系统系统I/OI/O软件层次结构软件层次结构