I/O 子系统的层次结构
我们来详细解析操作系统 I/O 子系统的层次结构。这个分层设计是操作系统核心思想——抽象与隔离的完美体现,每一层都为上层隐藏下层的复杂性,并提供清晰统一的接口。
整个 I/O 子系统的层次结构,以及一个“读取文件”请求的自顶向下流动过程(和数据的自底向上返回过程)可以直观地表示为下图:
flowchart TD
    A[应用程序]
    B[用户层I/O软件<br>库函数/SPOOLing]
    C[设备独立性软件<br>统一接口/设备保护/缓冲/分配]
    D[设备驱动程序<br>设置设备寄存器/发出命令]
    E[中断处理程序<br>处理完成信号/唤醒进程]
    F[硬件设备<br>执行I/O操作]
    A -- "调用read(fd, buffer, nbytes)" --> B
    B -- "标准库处理系统调用" --> C
    C -- "通用I/O操作<br>(e.g. 选择设备)" --> D
    D -- "写入控制寄存器<br>发起I/O" --> F
    F -- "I/O完成<br>发出中断信号" --> E
    E -- "唤醒驱动程序/上层程序" --> D
    D -- "返回状态信息" --> C
    C -- "返回数据" --> B
    B -- "返回数据" --> A
    subgraph 用户空间
        A
        B
    end
    subgraph 内核空间
        C
        D
        E
    end
    subgraph 物理硬件
        F
    end
各层次详细功能说明
1. 用户层 I/O 软件
- 位置:操作系统内核之外,处于用户空间。
- 功能:
- 提供库函数:为应用程序提供简单易用的I/O函数接口(如C语言的 printf,scanf,fread,fwrite)。这些库函数最终会通过系统调用(如read,write)陷入内核,但给程序员提供了更友好、功能更强大的包装。
- SPOOLing(假脱机)技术:模拟脱机操作,解决独占式设备(如打印机)的共享问题。例如,当多个进程要打印文件时,它们并不直接操作打印机,而是将数据高速输出到磁盘上的输出井。之后,由后台的守护进程(如 lpd)真正控制打印机,从输出井中取出数据打印。这样,打印机这种独占设备就被“虚拟”成了多个可共享的设备。
 
- 提供库函数:为应用程序提供简单易用的I/O函数接口(如C语言的 
- 目标:让用户程序能够方便、高效地使用I/O设备,无需关心底层硬件细节。
2. 设备独立性软件(设备无关性软件)
- 位置:操作系统的内核中,I/O子系统的核心部分。
- 功能:
- 统一接口:为所有类型的设备提供一致的系统调用接口(如 open,read,write,close)。无论底层是磁盘、键盘还是打印机,上层都使用相同的函数操作。
- 设备保护与权限检查:检查用户是否有权限访问所请求的设备(如文件权限 rwx)。
- 提供逻辑设备名到物理设备名的映射:应用程序使用逻辑设备名(如 /dev/ttyS0,一个串口)或文件名,这一层负责通过逻辑设备表将其映射到具体的设备驱动程序。
- 缓冲管理:管理磁盘缓冲和字符设备的缓冲队列,以平滑CPU与I/O设备之间的速度差异。
- 分配与释放独占设备:负责分配和回收独占设备,避免冲突。
- 错误处理:处理一些设备无关的错误,并向用户报告。
 
- 统一接口:为所有类型的设备提供一致的系统调用接口(如 
- 目标:实现设备无关性,即应用程序不必依赖于特定的硬件设备。更换设备后,应用程序无需修改即可使用新的驱动程序。
3. 设备驱动程序
- 位置:操作系统内核中,与硬件直接相关的部分。
- 功能:
- 翻译命令:接收来自上层设备独立性软件的抽象请求(如 read块123),并将其翻译成设备控制器能够理解的具体指令和参数。
- 初始化设备:检测和初始化硬件设备。
- 发出命令:向设备控制器的寄存器中写入这些特定命令,启动I/O操作。
- 管理设备状态:轮询或等待中断,以检查设备状态。
- 处理底层错误:处理设备相关的错误,如磁盘坏道、打印机缺纸,并尝试恢复或向上层报告。
 
- 翻译命令:接收来自上层设备独立性软件的抽象请求(如 
- 特点:每个设备驱动程序只负责一种或一类特定的硬件设备。硬件厂商通常会为自己生产的设备编写相应的驱动程序。驱动程序是操作系统内核中与硬件平台差异最相关的部分。
4. 中断处理程序
- 位置:操作系统内核中,是设备驱动程序的底层部分。
- 功能:
- 响应中断:当I/O操作完成时,设备控制器会向CPU发出一个中断信号。CPU收到信号后,会暂停当前工作,转而执行相应的中断处理程序。
- 保存现场:保护被中断进程的CPU环境(寄存器等)。
- 分析中断原因:根据中断号等信息,判断是哪个设备引发了中断。
- 执行中断服务:从设备控制器中读取状态信息,判断I/O操作是否成功完成。如果完成,则唤醒正在等待该I/O结果的、阻塞的驱动程序进程。
- 恢复现场:中断处理完毕后,恢复被中断进程的CPU环境,使其继续执行。
 
- 目标:实现CPU与I/O设备的并行工作。CPU启动I/O操作后即可去处理其他任务,无需轮询等待,设备完成后通过中断来“通知”CPU。
5. 硬件
- 位置:物理设备本身。
- 组成:
- I/O设备本身:执行最终操作的机械/电子部分(如磁盘盘片、打印头)。
- 设备控制器:一块插入主板的芯片或电路板(如磁盘控制器、显卡)。它接收来自驱动程序的指令,并直接控制设备操作。它包含:
- 控制寄存器:供CPU写入命令。
- 状态寄存器:供CPU读取设备状态。
- 数据缓冲区:暂存要写入设备或从设备读出的数据。
 
- I/O端口与接口:设备控制器与CPU、内存之间通信的硬件通道。
 
总结与类比
你可以将这个分层结构类比为公司CEO想要一份市场报告:
- 用户层软件 (CEO):CEO说:“我需要一份关于X的市场报告。”(调用 get_report("X"))
- 设备独立性软件 (中层经理):经理理解任务,检查CEO权限,决定派谁去做,并准备好文件格式和存放位置(统一接口、权限检查、缓冲)。
- 设备驱动程序 (团队主管):主管将任务分解为具体的指令:“小王,你去查数据库;小李,你做街头调查……”(翻译为设备指令)。
- 中断处理程序 (秘书):团队成员完成后,会打电话给秘书报告。秘书接听电话,记录结果,然后去通知主管:“小王的任务已完成”(响应中断、唤醒进程)。
- 硬件 (团队成员):小王、小李等实际执行调查任务(硬件操作)。
这种分层结构极大地简化了操作系统的设计和实现,提高了系统的模块化程度、可移植性和稳定性。
    Do not communicate by sharing memory; instead, share memory by communicating.

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号