I/O
软件通常分为以下几层 −
- 用户级别的库 − 这为用户程序提供了简单的接口来执行输入和输出。 例如,stdio 是 C
和 C++ 编程语言提供的库。
- 内核级模块 − 这提供了设备驱动程序与设备控制器和设备驱动程序使用的设备独立 I/O 模块进行交互。
- 硬件 − 这一层包括实际的硬件和硬件控制器,它们与设备驱动程序交互并使硬件活跃。
I/O 软件设计中的一个关键概念是它应该是独立于设备的,它应该可以编写可以访问任何 I/O
设备的程序,而无需事先指定设备。 例如,读取文件作为输入的程序应该能够读取软盘、硬盘或 CD-ROM
上的文件,而无需针对每个不同的设备修改程序。
设备驱动程序
设备驱动程序是可以插入操作系统以处理特定设备的软件模块。 操作系统借助设备驱动程序来处理所有
I/O 设备。 设备驱动程序封装与设备相关的代码,并以这样一种方式实现标准接口,即代码包含设备特定的寄存器读/写。
设备驱动程序,通常由设备制造商编写,并与设备一起提供在 CD-ROM 中。
设备驱动程序执行以下工作 −
- 接受来自上述设备独立软件的请求。
- 与设备控制器交互以获取和提供 I/O 并执行所需的错误处理
- 确保请求成功执行
设备驱动程序如何处理请求如下:假设一个请求来读取块N。如果驱动程序在请求到达时处于空闲状态,它立即开始执行请求。
否则,如果驱动程序已经忙于处理其他请求,它会将新请求放入待处理请求队列中。
中断处理程序
中断处理程序,也称为中断服务程序或 ISR,是一个软件,或者更具体地是操作系统中或更具体地设备驱动程序中的回调函数,其执行由接收到中断触发
.
当中断发生时,中断过程会做任何事情来处理中断,更新数据结构并唤醒等待中断发生的进程。
中断机制接受一个地址——一个从一个小集合中选择一个特定的中断处理例程/函数的数字。 在大多数架构中,此地址是存储在称为中断向量表的表中的偏移量。
该向量包含专用中断处理程序的内存地址。
独立于设备的 I/O 软件
设备无关软件的基本功能是执行所有设备通用的 I/O 功能,并为用户级软件提供统一的接口。 虽然很难编写完全独立于设备的软件,但我们可以编写一些在所有设备中通用的模块。
以下是与设备无关的 I/O 软件的功能列表 −
- 设备驱动程序的统一接口
- 设备命名 - 助记名称映射到主要和次要设备编号
- 设备保护
- 提供与设备无关的块大小
- 缓冲,因为来自设备的数据无法存储在最终目的地。
- 块设备上的存储分配
- 分配和释放专用设备
- 错误报告
用户空间 I/O 软件
这些库提供了更丰富和简化的接口来访问内核功能或最终与设备驱动程序交互。 大多数用户级 I/O
软件由库过程组成,但也有一些例外,例如后台运行系统,它是在多道程序系统中处理专用 I/O 设备的一种方式。
I/O 库(例如 stdio)位于用户空间中,为操作系统驻留的独立于设备的 I/O SW
提供接口。 例如 putchar()、getchar()、printf() 和 scanf()
是 C 编程中可用的用户级 I/O 库 stdio 示例。
内核 I/O 子系统
内核 I/O 子系统负责提供许多与 I/O 相关的服务。 以下是提供的一些服务。
- 调度 − 内核调度一组 I/O 请求以确定执行它们的良好顺序。 当应用程序发出阻塞 I/O
系统调用时,请求将被放入该设备的队列中。 内核 I/O 调度程序重新排列队列的顺序,以提高整体系统效率和应用程序的平均响应时间。
- 缓冲 − 内核 I/O 子系统维护一个称为 buffer 的内存区域,用于在数据在两个设备之间或在具有应用程序操作的设备之间传输时存储数据。
缓冲是为了应对数据流的生产者和消费者之间的速度不匹配或适应具有不同数据传输大小的设备。
- 缓存 − 内核维护缓存内存,它是保存数据副本的快速内存区域。 访问缓存副本比访问原始副本更有效。
- 后台运行和设备预留 − 后台运行是一个缓冲区,用于保存不能接受交错数据流的设备(例如打印机)的输出。
后台运行系统一次将一个排队的后台运行文件复制到打印机。 在某些操作系统中,后台运行由系统守护进程管理。
在其他操作系统中,它由内核线程处理。
- 错误处理 − 使用受保护内存的操作系统可以防范多种硬件和应用程序错误。
|