《Linux设备管理》课件.ppt
第六章 Linux设备管理,设备管理概述总线、桥、端口、接口设备驱动Linux块设备管理块设备buffer headbio和bio_vecI/O请求队列(Request queue)调度算法deadline、as、cfq、noopLinux其他设备管理字符设备网络设备/时钟设备/终端设备设备管理相关技术中断DMA,设备分类(1),输入设备、输出设备输入设备:键盘、鼠标输出设备:显示器、打印机输入/输出设备:磁盘、网络、串口设备系统设备与外部设备系统设备:系统时钟、系统扬声器、总线接口系统设备的驱动由内核本身完成外部设备:外部设备的驱动由专门的驱动程序实现,以内核模块的方式附加到内核中外部设备可以被安装和卸载,而系统设备则不能,设备分类(2),独占设备与共享设备独占设备:在某一时间段内只能被一个进程所使用的设备打印机、终端设备等共享设备:允许多个进程同时使用的设备。磁盘等存储设备:允许多个进程同时访问文件,存取文件的数据字符设备与块设备字符设备:终端设备(显示器、键盘、鼠标等)、打印机、串口设备顺序访问块设备:磁盘、光盘、闪存随即访问块设备都是以“文件系统挂载”的方式进行访问,设备管理,设备管理目标从资源的角度出发要尽可能地提高设备的使用效率,提高I/O系统的性能;从用户的角度出发设备管理系统要屏蔽各种设备的物理特性,为用户提供一个统一的、方便的I/O操作界面设备管理功能设备分配根据设备的特点对设备进行合理的分配和调度设备驱动根据进程的I/O请求,启动设备操作,控制数据传输设备中断处理:对设备产生的中断进行处理虚拟设备:用共享设备模拟独占设备,实现虚拟设备,设备与系统的接口,外部物理设备无法直接与CPU相连接的,存在以下差异控制方式不同CPU是数字化命令,而设备需要物理信号来控制传输方式不同CPU以字节为数据传输单位,设备可能以位或者块为单位速度不匹配设备的工作速度要比CPU慢许多时序不一致设备的定时控制电路,难以与CPU的时钟一致信息形式不同CPU处理信息是数字的,设备则可能是模拟的总线、桥、端口、接口Busses,Bridges,Ports,and Interfaces,第六章 Linux设备管理,设备管理概述总线、桥、端口、接口设备驱动Linux块设备管理块设备buffer headbio和bio_vecI/O请求队列(Request queue)调度算法deadline、as、cfq、noopLinux其他设备管理字符设备网络设备/时钟设备/终端设备设备管理相关技术中断DMA,总线(bus)与 桥(bridge),总线(bus)以总线为纽带,系统板上的部件都通过总线相连,所有的信号都要通过总线进行传输。a processor communicates with its surrounding devices is through a series of electrical connections(line).address bus data buscontrol bus北桥 vs.南桥Bridge是两个bus之间连接硬件,front-side bus,总线(bus),Intel HubsThe newer Intel system architecture has moved to the concept of hubs GMCHGraphics and Memory Controller Hub ICHI/O Controller Hub,总线(bus),AMD HyperTransportPCI compatible,总线(bus),总线由CPU控制CPU通过总线访问内存和设备,以及控制在内存和设备之间传输数据独占使用方式总线采用独占使用方式,任何设备若需要直接和内存交换数据,先要申请总线使用权,获得使用权后独占总线进行通信数据交换字符设备CPU与慢速字符设备交换数据时,由CPU控制设备与内存之间的数据交换输入时,CPU从控制器中将数据读到CPU的寄存器中,再写到内存单元输出时,将内存数据读到CPU的寄存器中,再写到控制器的数据寄存器中块设备CPU与某些高速的块设备交换数据时,以DMA方式进行DMA控制器先申请总线使用权,然后控制设备直接与内存传输数据,端口、接口,设备适配器与设备显卡 vs.显示器声卡 vs.音响网卡 vs.网线设备适配器(控制器)通过总线插槽(ISA或PCI等)接入系统总线,端口、接口,出于通用性设计的考虑,计算机硬件结构都提供了一些标准的设备接口,这些接口遵照统一的标准来设计,不同的设备只要遵从同一标准即可通过该接口与系统连接。I/O接口分为两类通用接口如串口、并口、USB接口专用接口IDE(Integrated Device Electronics,集成设备电路)SCSI接口一个I/O接口可以带多个同类型的设备例如一个IDE接口可以带两个IDE磁盘驱动器标准的I/O接口为设备的开发和使用提供了方便,端口、接口,设备资源I/O设备与系统通信必须首先获得一些系统资源I/O端口地址适配器中的每个I/O端口寄存器都有一个唯一的地址,一个适配器所拥有的I/O端口地址的总和称为该设备的I/O范围。如COM1的I/O范围为0 x03f80 x03ff。中断申请号IRQ设备申请中断使用的中断号码缓冲区地址适配器中的缓冲区所映射的内存地址范围DMA通道号设备申请DMA使用的DMA通道号码在安装设备时,由系统为适配器分配这些资源,并保证各个设备的资源彼此不相冲突。,第六章 Linux设备管理,设备管理概述总线、桥、端口、接口设备驱动Linux块设备管理块设备buffer headbio和bio_vecI/O请求队列(Request queue)调度算法deadline、as、cfq、noopLinux其他设备管理字符设备网络设备/时钟设备/终端设备设备管理相关技术中断DMA,I/O设备的软件结构,设备识别,设备号 主设备号(8bit)major number usually referred to a device driver or controller次设备号(8bit)minor number was a particular device within that controller主设备号标识设备的控制器,次设备号用来区分同一控制器下的不同设备实例主设备号与设备的驱动程序一一对应,而次设备号供驱动程序内部使用devfs:通过devfs(设备文件系统)访问(Linux的新动向)With devfs,a module can register a device by name rather than a major/minor number pair通过一个16bit设备号进行识别为了兼容,devfs可以将major:minor模式转换为唯一的16bit设备号,设备驱动,The hardware device driver直接操控底层硬件熟知底层设备的物理特性register locations,I/O,timing,设备管理方式interrupt,DMA封装对物理设备的操作提供open、close、read、write等操作函数,通用块设备驱动,Generic Block Driverregister_blkdev(major,dev_name,fops)注册struct gendisk*alloc_disk(int minors);include/linux/genhd.h创建gendisk结构体blk_init_queue(request_fn_proc,spinlock_t)初始化I/O请求队列void add_disk(struct gendisk*disk);使得内核对该块设备可见,访问块设备,Device driver registers itself at driver initialization timeThis adds the driver to the kernels driver tablemapping the device number/devices name(每个设备被视为一个文件)to the block_device_operations structure,第六章 Linux设备管理,设备管理概述总线、桥、端口、接口设备驱动Linux块设备管理块设备buffer headbio和bio_vecI/O请求队列(Request queue)调度算法deadline、as、cfq、noopLinux其他设备管理字符设备网络设备/时钟设备/终端设备设备管理相关技术中断DMA,块设备 硬盘,扇区Sector(扇区)512BSector是磁盘存储的最小物理单位块(block)块(block)由若干个相邻的扇区组成块是对存储空间的逻辑划分块是分区格式化时指定的“最小存储单位”Sblock=2k Ssector(但小于或等于页的大小)常见块大小:512B,1KB,4KB说明扇区:设备的最小寻址单位块:文件系统的最小寻址单位文件系统以块为单位对磁盘进行读/写,Buffer Head结构体(1),bufferThe buffer represents a disk block in memory当磁盘上的一个block调入内存时,其存储在一个buffer中每个buffer和一个block对应一个page可存储一个或多个blockbuffer_head结构体buffer_head是buffer的描述符记录了buffer与block对应关系:来自哪个设备、哪个block记录了内核操作buffer的所需信息:状态、计数等A buffer_head contains all the information necessary to map a physical block to a buffer in physical memory.,Buffer 与 Buffer Head(2),buffer_head结构体(include/linux/buffer_head.h L50)说明b_data指向buffer在内存的起始地址b_data+b_size即为buffer在内存中的结束地址,Buffer 与 Buffer Head(3),unsigned long b_state;/*buffer state flags*/,bio(block I/O)和bio_vec结构体(1),为了更好地利用内存碎片,一个磁盘block能否对应多个不连续内存片段呢?bio_vec 来描述内存中的片段(segment),这些segment可位于不同的pagebio被引入用来描述一个磁盘block与多个内存片段对应,bio和bio_vec结构体(2),bio结构体(include/linux/bio.h L70),bio和bio_vec结构体(3),bio_vec结构体(include/linux/bio.h L56)描述一个segment片段,buffer_head 与 bio总结,buffer_head描述一个连续内存空间,它与磁盘上一个block对应bio用来描述一个磁盘block与多个内存片段对应bio_vec 来描述内存中的片段(segment),这些segment可位于不同的物理page,访问块设备,通用块设备层(Generic Block Device Layer)request queue,请求队列,Request Queues and Scheduling I/O When a read or write request traverses the layers from VFS,through the filesystem drivers and page cache,it eventually ends up entering the block device driver to perform the actual I/O on the device that holds the data requested I/O请求队列(I/O request queue)每个块设备拥有自己的I/O request queue进程在对request queue“更新”前,须先对该队列加“锁”attempting to optimizes throughput but does not indefinitely postpone requests.(吞吐率 vs.等待延迟),I/O请求队列,request_queue结构体(include/linux/blkdev.h L287)字段struct list_head queue_head;/指向I/O请求队列头struct request*last_merge;/最近刚合并的请求 elevator_t*elevator;/电梯调度算法(三者之一)struct request_list rq;/read请求队列和write请求队列只要请求队列不为空,对应的块设备驱动就从队列头获取请求,然后处理。在Linux2.6内核,块设备通过在_init()函数中调用request_queue_t*blk_init_queue(request_fn_proc*rfn,spinlock_t*lock)来初始化请求队列.(drivers/block/ll_rw_blk.c L1505),I/O请求,request结构体(include/linux/blkdev.h L108)request_queue中的每一项I/O请求用request结构体描述字段struct bio*bio;/第一个biostruct bio*biotail;/最后一个biosector_t hard_sector;/*next sector to complete*/unsigned long hard_nr_sectors;/*no.of sectors left to complete*/unsigned int hard_cur_sectors;/*no.of sectors left to complete in the current segment*/struct gendisk*rq_disk;/指向磁盘unsigned long start_time;unsigned int timeout;说明:一个request可能涉及多个连续的磁盘block,每个block用一个bio表示磁盘上的block必须连续,但在内存中并不一定连续,即每个bio结构体可以组织多个内存segment(每个segment用bio_vec来描述),下课了!,I/O调度,为什么需要I/O调度?磁盘寻址是指将磁头定位到特定的块磁盘寻址是整个计算机中最慢的操作之一想一想:若按request提交的次序响应操作,会怎么样?磁头频繁来回移动(相当于电梯为每一个请求来回跑),非常耗时I/O schedulerI/O scheduler的工作是管理块设备的request queue决定队列中request的排列顺序,及派发request的时机目标:减少全局磁盘寻址时间、提高吞吐率为了提高系统整体性能,可能对某些request不公平法宝:对request进行预处理合并(merging)和排序(sorting),I/O调度,排序(sorting)将请求队列按照扇区地址同向方向有序排列新提交的请求可以“插队”合并(merging)在磁盘访问时,若block相邻的两个请求可以合并,The Linus Elevator,说明在Linux 2.4中,linux elevator是默认的I/O调度程序在Linux 2.6中,被deadline和as算法替代当一个新request加入队列中时当一个新请求到来时,先检查队列看能否合并如果队列中已存在一个相邻磁盘扇区操作的请求,则新请求和这个已存在的请求合并否则,新请求被插入到队列中一个合适的位置按扇区地址增长原则,能否插入到两个请求之间否则,新请求加入到队列尾特殊情况若队列中某个请求等待时间超过了一个阀值(threadhold),新请求被加入到队列尾部,防止其他请求饥饿缺点:并不能真正地防止饥饿,Deadline I/O Scheduler(1),为了消除饥饿,特别是读请求饥饿,提出了Deadline I/O Schedulerdrivers/block/deadline-iosched.c区分read request和write request的紧迫程度Read request:必须和进程同步,因为进程必须挂起,直到读操作完成Write request:可以和进程异步执行(但页不能让write reqeust等太久才执行)缺省的deadline每个请求都有一个超时时间(an expiration time)Read请求:500mswrite请求:5s三个队列在sorted queue,请求按磁盘扇区地址增长方向排列在read queue和write queue,请求按FIFO排列,Deadline I/O Scheduler(2),Deadline I/O Scheduler新请求到来时在sorted queue中进行插入或合并以保证sorted queue中请求按磁盘扇区地址增长方向排列根据请求类型,按FIFO加入到read queue或者write queue的队尾处理请求(读请求优先)先检查read queue的队首元素,若该请求已到期限,则马上处理若无read请求到期,则去检查write queue的队首元素若无read请求和write请求到期,则按sorted queue进行处理缺点:降低了系统吞吐率有可能多次寻址,Anticipatory I/O Scheduler(预测、期待),Anticipatory I/O scheduler目标是通过短暂时间停滞,期待临近地址的请求到来,以减少磁头频繁来回寻址attempts to anticipate what the next operation is and aims to improve I/O throughput.drivers/block/as-iosched.c 与deadline I/O scheduler异同相同点Read queue,write queue,sorted queue对每个请求设置deadline:read request 500ms,write request 5s不同点处理完一个请求后,Anticipatory并不马上处理其他请求,而是暂停6ms(预等待期),以等待一个位置临近的请求到来若在预等待期内,有一个临近区域的请求到来,则处理该请求过了预等待期,则调度程序回归正常操作(和deadline调度一样),cfq:Complete Fair Queuing I/O Scheduler,cfq(完全公平调度算法)是为特殊任务设计的Round robin per-process disk scheduling drivers/block/cfq-iosched.c 核心思想cfg为每个进程创建一个I/O请求队列在每个队列中,I/O请求按序排列(支持“插队”或“合并”)以时间片轮转调度进程的I/O请求This provides fairness at a per-process level,assuring that each process receives a fair slice of the disks bandwidth.说明:The intended workload is multimediacfq is recommended for desktop workloads,The noop I/O Scheduler(no-operation),no-op I/O Schedulerdrivers/block/noop-iosched.c It is intended only for random-access devices,e.g.,flash memory cards.核心思想Noop面向random-access device,故不存在磁头来回移动问题,故无需使I/O request按地址增长方向排序(无需插队)reqeust queueI/O请求按FIFO排队对地址相邻的两个请求进行“合并”故在noop中,请求队列是一种near-FIFO(近似FIFO)队列说明常用于无磁盘的嵌入式系统(RAM),I/O调度算法总结,Linux2.6提供了以上四种块设备I/O请求调度算法在启动阶段,可以通过命令行修改 elevator=foo 激活新的I/O调度算法,第六章 Linux设备管理,设备管理概述总线、桥、端口、接口设备驱动Linux块设备管理块设备buffer headbio和bio_vecI/O请求队列(Request queue)调度算法deadline、as、cfq、noopLinux其他设备管理字符设备网络设备/时钟设备/终端设备设备管理相关技术中断DMA,其他设备(1),字符设备(Character device)字符设备与主机之间的I/O通过字符或者字符流例如:key board(serial devices)Block device和character device比较All Linux device I/O is based on files.All Linux device I/O is either character or blockRandom accessBlock device(Yes)vs.character device(No)请求队列(Request queue)Block device需要request queue,而character device不需要中断(Interrupt)对无buffer的character device来说,每接受一个字符须发生中断而对于Block device而言,一个数据块才发生一次中断,其他设备(2),网络设备(Network Devices)Network devices have attributes of both block and character devicesLike a character device,at the physical level,data is transmitted serially.Like a block device,data is packetized and moved to and from the network controller via direct memory access(DMA).时钟设备(Clock Devices)Clocks are I/O devices that count the hardware heartbeat of the system.Without the concept of elapsed time,Linux would cease to function.终端设备(Terminal Devices)tty:send and receive text data,第六章 Linux设备管理,设备管理概述总线、桥、端口、接口设备驱动Linux块设备管理块设备buffer headbio和bio_vecI/O请求队列(Request queue)调度算法deadline、as、cfq、noopLinux其他设备管理字符设备网络设备/时钟设备/终端设备设备管理相关技术中断DMA,中断,中断(interrupt)在计算机运行期间,当系统内部或外部发生了某个异步事件需要CPU处理时,CPU将暂时中止当前正在执行的程序,而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处,继续执行或者调度新的进程执行,这个过程就称为“中断”。异步事件指与系统运行没有时序关系的、不可预期的事件用户按下键盘按键、磁盘传输数据完成、系统硬件出现故障等中断最早应用在I/O传输过程中,它使外部设备和CPU的并行工作成为可能中断技术已扩大到设备之外的其他事件凡是需要CPU干涉或处理的异步事件都采用中断的手段进行处理。中断对于操作系统的意义重大,它是系统一切并发活动的基础,因而是操作系统最基本的技术。,中断,中断源与中断分类引起中断发生的事件称为中断源。通常中断源是由硬件产生的信号,通知CPU某个需要处理的事件例,当敲打键盘时,键盘控制器就会产生一个键盘中断源信号中断种类I/O中断:由设备数据传输过程中发生的中断属于I/O中断时钟中断:周期性的时钟中断其他中断:由内部故障或程序故障引起的“异常”(exception)电源掉电、CPU故障、除数为0、内存溢出、执行了陷入指令,中断,中断请求中断源通过中断线送到中断控制器的输入端,这称为中断请求。中断控制器一个硬件装置,它负责捕获中断请求,并以一定的方式向CPU提交中断。竞争由于同时可能会有多个中断信号产生,它们需要共用有限的中断控制线。因此,当设备要使用中断控制线时就要先进行中断请求(IRQ),以获得中断控制线的使用权。,中断,中断响应CPU在收到来自中断控制器的中断信号后,暂停执行当前的进程,转入相应的中断处理程序进行处理,这个反应的过程称为中断响应。通常CPU在执行完一条指令后,会检查有无中断请求。如有,则会立即作出响应。由硬件和软件相结合的一整套中断机构实施中断响应由硬件实施,中断处理主要由软件实施中断实施过程保存现场中止当前进程的执行,对被响应的中断进行应答,保存当前进程的断点信息(主要是程序状态字PSW和程序计数器PC)中断处理转到中断处理程序入口恢复现场中断返回,中断,中断处理程序主要由软件实施。响应中断后,CPU转去执行相应的中断处理程序每个中断都对应一个特定的中断处理程序如时钟中断处理程序、键盘中断处理程序等在设备的驱动程序中包含了对该设备所有中断的处理程序中断向量表所有中断处理程序的入口地址都保存在一个中断向量表中CPU响应中断时,根据中断源检索中断向量表,得到的中断向量中包含相应中断处理程序的入口地址和程序状态字将中断向量加载到CPU中,在下一个指令周期CPU就会转去执行相应的中断处理程序,中断,DMA,Direct Memory Access(DMA)在以总线为中心的体系结构中,任何数据交换都要通过总线进行,总线控制权在CPU。为了减少CPU对I/O传输过程的干预,引入了DMA方式,用来控制设备的批量数据传送DMA controller 位于I/O device与bus之间,通过DMA控制器控制设备,使其可以直接与主存交换数据,无须CPU参与数据传送不必经CPU的寄存器为中介,可直接从设备写入内存或从内存送入设备,DMA,DMA传输过程DMA请求CPU通过I/O指令对DMA控制器初始化,向DMA控制器发送要启动的设备号、数据传输的内存起始地址、要交换的数据字节数等参数CPU向设备控制器发出操作命令,设备控制器准备好数据后,向DMA控制器提出请求。DMA响应DMA控制器对DMA请求予以判别,向CPU发出总线使用权的请求CPU在本机器周期执行结束后响应该请求,与系统总线脱离。DMA控制器接管数据总线与地址总线的控制,开始控制DMA传输DMA传输DMA控制器获得总线控制权后,对设备控制器发出读/写命令,控制设备直接与内存进行数据传输。在传输过程中,DMA控制器对传送的字节进行计数。当传输的数据块达到预定的字节数时传输完毕,DMA,DMA传输过程DMA结束DMA控制器即释放总线控制权,向设备控制器发出结束信号,并向CPU提出DMA中断请求。CPU响应中断后转到中断处理程序中处理DMA的结果包括校验送入内存的数据是否正确,测试在传送过程中是否发生了错误,决定是否继续传送下去等。中断处理完成后,CPU返回原来的进程继续执行。总结:DAM传输的特点数据传输的基本单位是数据块所传输的数据是从设备直接送入内存的,或者相反整块数据的传送是在控制器的控制下完成的,仅在传输的开始和结束时才需要中断CPU,第六章 Linux设备管理,设备管理概述总线、桥、端口、接口设备驱动Linux块设备管理块设备buffer headbio和bio_vecI/O请求队列(Request queue)调度算法deadline、as、cfq、noopLinux其他设备管理字符设备网络设备/时钟设备/终端设备设备管理相关技术中断DMA,下课了,功德圆满!,