# 6.7 设备驱动程序 ## 一、设备驱动程序的概念 ### 1.1 什么是设备驱动程序 **设备驱动程序**: - 控制I/O设备的软件模块 - 与设备控制器直接交互 - 是操作系统与硬件的接口 ### 1.2 设备驱动程序的功能 - **接收请求**:接收上层软件的I/O请求 - **处理请求**:将请求转换为设备可执行的命令 - **控制设备**:向设备控制器发送命令 - **检查状态**:检查设备状态 - **处理中断**:处理设备中断 - **错误处理**:处理设备错误 --- ## 二、设备驱动程序的结构 ### 2.1 设备驱动程序的组成 **设备服务程序**: - 接收和处理I/O请求 - 与设备独立性软件交互 **中断处理程序**: - 处理设备中断 - 完成I/O后的处理 ### 2.2 设备驱动程序的接口 **向上接口**: - 提供给设备独立性软件的标准接口 - 统一的操作函数(open, close, read, write, ioctl) **向下接口**: - 与设备控制器的硬件接口 - 设备寄存器操作 --- ## 三、设备驱动程序的工作过程 ### 3.1 I/O请求处理 **步骤**: 1. **接收请求**:从设备独立性软件接收I/O请求 2. **检查参数**:检查请求参数的合法性 3. **检查设备状态**:检查设备是否可用 4. **转换请求**:将逻辑请求转换为物理命令 5. **启动设备**:向设备控制器发送命令 6. **阻塞进程**:如果设备忙,将进程阻塞 ### 3.2 中断处理 **步骤**: 1. **保存现场**:保存被中断进程的CPU现场 2. **检查状态**:检查设备状态,确定中断原因 3. **处理数据**:如果需要,传输数据 4. **唤醒进程**:唤醒等待I/O完成的进程 5. **恢复现场**:恢复被中断进程的CPU现场 --- ## 四、设备驱动程序的特点 ### 4.1 与设备相关 - 每个设备类型有对应的驱动程序 - 驱动程序与硬件密切相关 - 需要了解硬件细节 ### 4.2 运行在内核态 - 直接操作硬件 - 需要特权指令 - 运行在内核空间 ### 4.3 可重入性 - 可以被多个进程同时调用 - 需要处理并发访问 ### 4.4 异步执行 - I/O操作是异步的 - 驱动程序启动设备后继续执行 - 中断时再进行处理 --- ## 五、设备驱动程序的开发 ### 5.1 驱动程序框架 ```c // 初始化函数 int init_driver() { // 注册设备 // 初始化硬件 // 分配资源 } // 打开设备 int device_open() { // 检查设备状态 // 分配资源 // 初始化设备 } // 关闭设备 int device_close() { // 释放资源 // 关闭设备 } // 读设备 int device_read() { // 检查参数 // 启动设备读取 // 等待中断 } // 写设备 int device_write() { // 检查参数 // 启动设备写入 // 等待中断 } // 中断处理 void interrupt_handler() { // 检查中断原因 // 处理数据 // 唤醒等待进程 } ``` ### 5.2 驱动程序的加载 **静态链接**: - 编译时链接到内核 - 系统启动时加载 **动态加载**: - 需要时加载 - 模块方式 --- ## 六、设备驱动程序与中断 ### 6.1 中断处理流程 1. **硬件中断**:设备发出中断信号 2. **中断响应**:CPU响应中断,保存现场 3. **中断分发**:根据中断号找到中断处理程序 4. **中断处理**:执行设备驱动程序的中断处理函数 5. **中断返回**:恢复现场,继续执行 ### 6.2 中断处理的要求 **快速**: - 中断处理要尽快完成 - 避免长时间占用CPU **原子性**: - 关键操作要原子执行 - 防止并发问题 --- ## 七、考研重点 1. **设备驱动程序的概念**:定义、功能 2. **设备驱动程序的结构**:设备服务程序、中断处理程序 3. **设备驱动程序的接口**:向上接口、向下接口 4. **设备驱动程序的工作过程**:I/O请求处理、中断处理 5. **设备驱动程序的特点**:与设备相关、运行在内核态、可重入、异步执行 6. **中断处理流程**:步骤、要求 --- *第六章完,操作系统考研复习资料全部完成!*