I/O 操作的实现 用户空间 I/O 软件 I/O 硬件与软件的接口 内核空间 I/O 软件
I/O 和文件操作 ° 主要教学目标 – 通过揭示高级语言程序中的 I/O 及文件操作请求的底层实 现机制,使学生深刻理解 OS 在输入 / 输出系统中的重要 作用;深刻理解计算机中硬件和软件如何协调工作以完 成计算机功能。 ° 主要教学内容 –I/O 子系统的组成和层次结构 – 用户空间 I/O 软件 –I/O 硬件与软件的接口 – 内核空间 I/O 软件
DMA 方式的基本要点 °DMA 方式的基本思想 在高速外设和主存间直接传送数据 由专门硬件(即: DMA 控制器)控制总线进行传输 °DMA 方式适用场合 高速设备(如:磁盘、光盘等) 成批数据交换,且数据间间隔时间短,一旦启动,数据连续读写 ° 采用 “ 请求 - 响应 ” 方式 每当高速设备准备好数据就进行一次 “DMA 请求 ” , DMA 控制器接受 到 DMA 请求后,申请总线使用权 DMA 控制器的总线使用优先级比 CPU 高,为什么? ° 与中断控制方式结合使用 在 DMA 控制器控制总线进行数据传送时, CPU 执行其他程序 DMA 传送结束时,要通过 “DMA 结束中断 ” 告知 CPU
读一个磁盘扇区 - 第一步 Main memory ALU Register file CPU chip Disk controller Graphics adapter USB controller mouse keyboard Monitor Disk I/O bus Bus interface CPU 对 DMA 控制器初始化: 将传送方向(读)、传送数据个数、 磁盘逻辑块号、主存起始地址等参数 送到 DMA 控制器 发送 ” 启动 DMA 传送 “ 命令 DMA 控制器 传送数据个数被 送到计数器中
读一个磁盘扇区 – 第二步 Main memory ALU Register file CPU chip Disk controller Graphics adapter USB controller MouseKeyboardMonitor Disk I/O bus Bus interface 磁盘控制器读相应的扇区,并由 DMA 控制器控制总线把数据从磁盘控制器 送主存,此时, CPU 执行其他进程 DMA 控制器 每传送一个数据 ,则计数器减 1
读一个磁盘扇区 – 第三步 Main memory ALU Register file CPU chip Disk controller Graphics adapter USB controller MouseKeyboardMonitor Disk I/O bus Bus interface 当 DMA 传送结束 ( 计数为 0) , DMA 控制器 向 CPU 发出 “DMA 结束中断请求 ” ,要求 CPU 进行相应的后处理。 DMA 控制器
DMA 方式下 CPU 的工作 copy_string_to_kernel(strbuf, kernelbuf, n); // 将字符串复制到内核缓冲区 initialize_DMA ( ); // 初始化 DMA 控制器(准备传送参数) *DMA_control_port=START;// 发送 “ 启动 DMA 传送 ” 命令 scheduler ( ); // 阻塞用户进程 P ,调度其他进程执行 acknowledge_interrupt();// 中断回答(清除中断请求) unblock_user ( );// 用户进程 P 解除阻塞,进入就绪队列 return_from_interrupt(); // 中断返回 例子:采用 DMA 方式进行字符串输出 sys_write 进行字符串输出的程序段 : ”DMA 结束 “ 中断服务程序: CPU 仅在 DMA 控制器初始化和处理 “DMA 结束中断 “ 时介入,在 DMA 传送过程中不参与,因而 CPU 用于 I/O 的开销非常小。 DMA 控制器接受到 “ 启动 ” 命令后,控制总线进行 DMA 传送。通常用 ” 周期挪用 法 “ :设备每准备好一个数据,挪用一次 ” 存储周期 “ ,使用一次总线事务进行 数据传送,计数器减 1 。计数器为 0 时,发送 DMA 结束中断请求
例:中断、 DMA 方式下 CPU 的开销 设处理器按 500MHz 的速度执行,硬盘控制器中有一个 16B 的数据缓存器,磁盘传 输速率为 4MB/Sec ,在磁盘传输数据过程中,要求没有任何数据被错过,并假定 CPU 访存和 DMA 访存没有冲突。 ( 1 )若用中断方式,每次传送的开销(包括用于中断响应和处理的时间)是 500 个 时钟周期。如果硬盘仅用 5% 的时间进行传送,那么处理器用在硬盘 I/O 操作上所 花的时间百分比(主机占用率)为多少? ( 2 )若用 DMA 方式,处理器用 1000 个时钟进行 DMA 传送初始化,在 DMA 完成后的 中断处理需要 500 个时钟。如果每次 DMA 传送 8000B 的数据块,那么当硬盘进行 传送的时间占 100% (即:硬盘一直进行读写,并传输数据)时,处理器用在硬盘 I/O 操作上的时间百分比(主机占用率)为多少? 想象一下:假定大仓库门口有一个箱子,可放 16 个零件。要将大仓库中的一批零 件运到小仓库中,可以有几种方法? 中断方式:每装满一个箱子就喊车床上的技工来运到车间,再从车间运到小仓库 DMA 方式:车床技工停下来告诉搬运工说,一次要 8000 个零件放到小仓库固定 的地方,然后回到车床工作;搬运工开始分两组工作,一组从大仓库搬货到箱子 中,另一组将箱子直接运到小仓库指定地方,搬完 8000 个后, 搬运工告知技工已 完成任务,技工进行相应处理。 上述两种方式中,哪种方式的生产效率更高呢?
例:中断、 DMA 方式下 CPU 的开销 ° 中断传送: 硬盘每次中断,可以以 16 字节为单位进行传送,为保证没有任何数据被 错过,应达到每秒 4MB /16B=250k 次中断的速度; 每秒钟用于中断的时钟周期数为 250kx500=125x10 6 ; 在一次数据传输中,处理器花费在 I/O 上的时间的百分比为: 125x10 6 /(500x10 6 )=25% ; 假定硬盘仅用其中 5% 的时间来传送数据,则处理器花费在 I/O 方面的百 分比为 25%x5%=1.25% 。 °DMA 传送: 每次 DMA 传送将花费 8000B/(4MB/Sec)≈2x10 -3 秒; 一秒钟内有 1/(2x10 -3 )=500 次 DMA 传送; 如果硬盘一直在传送数据的话,处理器必须每秒钟花 ( )x500=750x10 3 个时钟周期来为硬盘 I/O 操作服务; 在硬盘 I/O 操作上处理器花费的时间占: 750x10 3 /(500x10 6 )=1.5x10 -3 =0.15% 。 一旦磁盘被启动传送,就以 4MB/s 的速度进行,主机要保证没有数据丢失!
I/O 操作的实现 ° 分以下三个部分介绍 第一讲:用户空间 I/O 软件 -I/O 子系统概述 - 文件的基本概念 - 用户空间的 I/O 函数 第二讲: I/O 硬件和软件的接口 -I/O 设备和设备控制器 -I/O 端口及其编址方式 -I/O 控制方式 第三讲:内核空间 I/O 软件 - 与设备无关的 I/O 软件 - 设备驱动程序 - 中断服务程序
内核空间 I/O 软件 ° 所有用户程序提出的 I/O 请求,最终都通过系统调用实现 ° 通过系统调用封装函数中的陷阱指令转入内核 I/O 软件执行 ° 内核空间 I/O 软件实现相应系统调用的服务功能 ° 内核空间的 I/O 软件分三个层次 设备无关软件层 设备驱动程序层 中断服务程序层 ° 设备驱动程序层、中断服务程序层与 I/O 硬件密切相关 系统调用服务例程,被陷阱指令调出执 行,一旦发送 “ 启动 ” 命令,则所代表的 进程被送等待队列(即被阻塞) 外设 CPU 启动启动 完成完成 启动启动 完成完成 工作 请求请求 响应响应 启动启动 请求请求 响应响应 返回返回 P 被阻塞 Q Q Q P
在 Linux 内核中单 向调用 20 次以上 read sys_read Int 0x80 触发系统调用 与设备无关层与设备无关层 设备驱动层 文件 系统 层 通用块设备层 I/O 调度层
设备无关 I/O 软件层 ° 设备驱动程序统一接口 操作系统为所有外设的设备驱动程序规定一个统一接口,这样,新设备的 驱动程序只要按统一接口规范来编制,就可在不修改操作系统的情况下, 添加新设备驱动程序并使用新的外设进行 I/O 。 所有设备都抽象成文件,设备名和文件名在形式上没有差别,设备和文件 具有统一的接口,不同设备名和文件名被映射到对应设备驱动程序。 ° 缓冲处理 每个设备的 I/O 都需使用内核缓冲区,因而缓冲区的申请和管理等处理是所 有设备公共的,可包含在与设备无关的 I/O 软件部分 ° 错误报告 I/O 操作在内核态执行时所发生的错误信息,都通过与设备无关的 I/O 软件返 回给用户进程,也即:错误处理框架与设备无关。 直接返回编程等错误,无需设备驱动程序处理,如,请求了不可能的 I/O 操 作;写信息到一个输入设备或从一个输出设备读信息;指定了一个无效缓 冲区地址或者参数;指定了不存在的设备等。 有些错误由设备驱动程序检测出来并处理,若驱动程序无法处理,则将错 误信息返回给设备无关 I/O 软件,再由设备无关 I/O 软件返回给用户进程,如 写一个已被破坏的磁盘扇区;打印机缺纸;读一个已关闭的设备等。
设备无关 I/O 软件层 ° 打开与关闭文件 对设备或文件进行打开或关闭等 I/O 函数所对应的系统调用,并不涉 及具体的 I/O 操作,只要直接对主存中的一些数据结构进行修改即可 ,这部分工作也由设备无关软件来处理。 ° 逻辑块大小处理 为了为所有的块设备和所有的字符设备分别提供一个统一的抽象视 图,以隐藏不同块设备或不同字符设备之间的差异,与设备无关的 I/O 软件为所有块设备或所有字符设备设置统一的逻辑块大小。 对于块设备,不管磁盘扇区和光盘扇区有多大,所有逻辑数据块的 大小相同,这样,高层 I/O 软件就只需处理简化的抽象设备,从而在 高层软件中简化了数据定位等处理
设备驱动程序 ° 每个外设具体的 I/O 操作需通过执行设备驱动程序来完成 ° 外设种类繁多、其控制接口不一,导致不同外设的设备驱动程序千差万别, 因而设备驱动程序与设备相关 ° 每个外设或每类外设都有一个设备控制器,其中包含各种 I/O 端口。 CPU 通 过执行设备驱动程序中的 I/O 指令访问个各种 I/O 端口 ° 设备所采用的 I/O 控制方式不同,驱动程序的实现方式也不同 程序直接控制:驱动程序完成用户程序的 I/O 请求后才结束。这种情况下, 用户进程在 I/O 过程中不会被阻塞,内核空间的 I/O 软件一直代表用户进程在 内核态进行 I/O 处理 。 中断控制:驱动程序启动第一次 I/O 操作后,将调出其他进程执行,而当前 用户进程被阻塞。在 CPU 执行其他进程的同时,外设进行 I/O 操作,此时, CPU 和外设并行工作。外设完成 I/O 时,向 CPU 发中断请求,然后 CPU 调出 相应中断服务程序执行。在中断服务程序中再次启动 I/O 操作。 DMA 控制:驱动程序对 DMA 控制器初始化后,便发送 “ 启动 DMA 传送 ” 命令 ,外设开始进行 I/O 操作并在外设和主存间传送数据。同时 CPU 执行处理器 调度程序,转其他进程执行,当前用户进程被阻塞。 DMA 控制器完成所有 I/O 任务后,向 CPU 发送一个 “DMA 完成 ” 中断请求信号。
中断服务程序 ° 中断控制和 DMA 控制两 种方式下都需进行中断 处理 ° 中断控制方式:中断服 务程序主要进行从数缓 器取数或写数据到数缓 器,然后启动外设工作 °DMA 控制方式:中断服 务程序进行数据校验等 后处理工作 在内核 I/O 软件中用到的 I/O 指 令、 “ 开中断 ” 和 “ 关中断 ” 等指令 都是特权指令,只能在操作系 统内核程序中使用
本章小结 ° 用户程序通常通过调用编程语言提供的库函数或操作系统提供的 API 函数来实现 I/O 操作 °I/O 库函数最终都会调用系统调用的封装函数,通过封装函数中 的陷阱指令使用户进程从用户态转到内核态执行 ° 在内核态中执行的内核空间 I/O 软件主要包含三个层次: 与设备无关的操作系统软件 设备驱动程序 中断服务程序 ° 具体 I/O 操作通过设备驱动程序和中断服务程序控制 I/O 硬件来实 现 ° 设备驱动程序的实现主要取决于具体的 I/O 控制方式: 程序查询方式、中断方式、 DMA 方式
本章作业 °3、4、5、6、8°3、4、5、6、8