当前位置: 首页 > news >正文

计算机组成原理——输入/输出系统(十六)

【星辰大海终将抵达】
脚下的路或许崎岖,但每一步都算数;眼前的夜或许漫长,但长夜尽头有光。别怕跌倒,那些磨破的伤口终会成为盔甲;别惧迷茫,星辰的轨迹总在混沌中显现方向。若你此刻疲惫,不妨回头看看:曾经以为跨不过的山,如今已是身后的风景。人生没有白走的路,汗水会沉淀成底气,坚持会裂变成奇迹。继续奔跑吧,你向往的远方,终会与你不期而遇;你热爱的未来,正在回应你此刻的坚持。记住:你并不孤单——风会托起你的翅膀,时间会见证你的荣光。

计算机组成原理资源网

https://www.wenjingketang.com/这里面有ppt课后习题及答案,需要的可以自行下载

目录

9.3 程序中断方式

9.3.1 程序中断的概念

9.3.2 程序中断方式的基本中断控制逻辑

9.3.3 单级中断与多级中断


9.3 程序中断方式

9.3.1 程序中断的概念

定义与作用
程序中断是计算机系统中一种重要的异步事件处理机制,指在程序执行过程中,由硬件或软件触发事件强制暂停当前程序,转而去执行特定的中断服务程序(ISR),处理完成后恢复原程序的执行。其核心目的是实现以下功能:

  • 实时响应:快速响应外部设备请求(如键盘输入、网络数据到达)。
  • 资源复用:通过分时复用CPU资源,提升系统效率。
  • 错误处理:处理硬件故障(如内存校验错误)或软件异常(如除零错误)。

中断分类

分类标准类型说明
触发源硬件中断由硬件设备触发(如I/O设备完成操作)
软件中断由程序指令触发(如CPU的INT指令)
可屏蔽性可屏蔽中断可通过中断屏蔽寄存器禁用(如定时器中断)
不可屏蔽中断(NMI)必须立即响应的关键事件(如电源故障)
响应方式向量中断通过中断向量直接跳转至服务程序
轮询中断需软件查询中断源

中断处理流程

  1. 中断请求(IRQ):设备通过中断线向CPU发出请求。
  2. 中断响应:CPU完成当前指令后,检查中断优先级。
  3. 保存现场:将程序计数器(PC)和状态寄存器(PSW)压入堆栈。
  4. 执行ISR:根据中断向量表跳转至对应中断服务程序。
  5. 恢复现场:从堆栈恢复PC和PSW,继续原程序执行。

C

// 示例:x86架构下中断服务程序框架
void __attribute__((interrupt)) timer_isr(struct interrupt_frame* frame) {
    // 1. 处理定时器中断
    acknowledge_timer_interrupt();
    
    // 2. 业务逻辑(如更新系统时钟)
    system_clock++;
    
    // 3. 发送EOI(End of Interrupt)信号
    outb(0x20, 0x20);
}


9.3.2 程序中断方式的基本中断控制逻辑

硬件组成

  • 中断控制器(PIC/APIC):管理多个中断源,仲裁优先级。
  • 中断向量表(IVT):存储中断服务程序入口地址的数组,索引由中断号决定。
  • 中断屏蔽寄存器(IMR):控制是否允许特定中断触发。

关键电路设计

VERILOG

// 中断控制器简化逻辑(Verilog代码片段)
module interrupt_controller (
    input wire clk,
    input wire [7:0] irq_lines,  // 8个中断请求线
    input wire [7:0] imr,        // 中断屏蔽寄存器
    output reg int_signal,       // 向CPU发出的中断信号
    output reg [2:0] vector      // 中断向量
);
always @(posedge clk) begin
    if (irq_lines & ~imr) begin  // 未被屏蔽的中断请求
        // 优先级编码器:选择最高优先级中断
        casex (irq_lines)
            8'b1xxxxxxx: vector = 3'b111;
            8'b01xxxxxx: vector = 3'b110;
            // ... 其他优先级
            default: vector = 3'b000;
        endcase
        int_signal = 1'b1;       // 触发中断信号
    end else begin
        int_signal = 1'b0;
    end
end
endmodule

中断控制流程

  1. 中断检测:硬件持续监控中断请求线。
  2. 优先级仲裁:选择当前最高优先级中断。
  3. 中断响应:CPU发送INTA信号确认中断。
  4. 向量获取:控制器通过数据总线发送中断号。
  5. 服务程序调用:CPU根据向量跳转至ISR。

9.3.3 单级中断与多级中断

单级中断系统

  • 特点:所有中断共享同一优先级,不可嵌套处理。
  • 优点:实现简单,硬件成本低。
  • 缺点:无法处理紧急事件,可能丢失高优先级中断。

处理流程

PLAINTEXT

+-------------------+     +---------------------+
| 主程序执行        |     | 中断服务程序(ISR) |
| ...               |     | 1. 保存现场         |
| 发生中断 → 禁止中断 | → | 2. 处理中断         |
| 恢复中断允许       | ← | 3. 恢复现场         |
+-------------------+     +---------------------+

多级中断系统

  • 特点:支持中断优先级划分和嵌套处理。
  • 关键组件
    • 优先级编码器:动态选择最高优先级中断。
    • 嵌套中断控制:允许高优先级中断抢占低优先级ISR。

优先级设计与嵌套示例

中断源优先级典型应用场景
电源故障0(最高)不可屏蔽中断(NMI)
硬盘DMA完成1高速数据传输
键盘输入2用户交互
定时器3系统时钟更新

ASSEMBLY

; x86多级中断处理示例(汇编代码)
isr_high_priority:
    cli                 ; 禁用中断
    pushad              ; 保存通用寄存器
    ; 处理高优先级中断(如硬盘DMA)
    call handle_dma
    popad
    sti                 ; 重新启用中断
    iret

isr_low_priority:
    cli
    pushad
    ; 处理低优先级中断(如键盘)
    call handle_keyboard
    popad
    sti
    iret

; 嵌套中断场景:
; 正在执行isr_low_priority时,若发生高优先级中断,
; CPU会暂停当前ISR,转而执行isr_high_priority。

对比总结

特性单级中断多级中断
优先级支持多级(通常4-256级)
嵌套处理不可嵌套可嵌套
响应延迟较高(需等待当前ISR完成)低(高优先级可抢占)
硬件复杂度简单复杂(需优先级仲裁逻辑)
典型应用简单嵌入式系统现代操作系统、实时系统

深度扩展:现代中断管理技术

  1. 中断亲和性(Affinity):将中断绑定到特定CPU核心,提升缓存利用率。
  2. 中断共享:多个设备共享同一中断线,需软件识别来源。
  3. 线程化中断:将ISR分为顶半部(快速响应)和底半部(耗时处理)。

C

// Linux内核中的线程化中断示例
irqreturn_t irq_handler(int irq, void *dev_id) {
    // 顶半部:快速处理(如读取寄存器)
    struct device *dev = dev_id;
    u32 status = readl(dev->reg_base + STATUS_REG);
    if (!(status & INT_TRIGGERED))
        return IRQ_NONE;

    // 调度底半部
    tasklet_schedule(&dev->bottom_half);
    return IRQ_HANDLED;
}

void bottom_half_handler(unsigned long data) {
    // 底半部:耗时操作(如数据处理)
    struct device *dev = (struct device *)data;
    process_data(dev->buffer);
}


总结
程序中断机制是计算机系统实现高效异步事件处理的核心技术。从单级到多级中断的发展体现了系统对实时性和复杂场景的适应能力,而现代操作系统中的高级中断管理技术(如亲和性、线程化)进一步优化了性能与资源利用率。理解这些原理对于开发底层驱动、实时系统及性能关键型应用至关重要。

相关文章:

  • 【分布式】Hadoop完全分布式的搭建(零基础)
  • Windows 11运行《拳皇98UM》等老游戏闪退解决方案
  • 《运维工程师如何利用DeepSeek实现智能运维:分级实战指南》
  • qt的下载安装详细介绍
  • 8.【线性代数】——求解Ax=b
  • C++:类之间的关系
  • 基于golang语言开发publicChain项目实战教程
  • Aseprite绘画流程案例(3)——卡通独角兽可爱
  • python入门笔记4
  • glob 用法技巧
  • 撕碎QT面具(4):horizontal Layout修改各个控件的比例大小
  • 【Golang 面试题】每日 3 题(五十九)
  • 以deepseek为例的AI学习及公司知识库的搭建
  • Golang 相关的github 开源项目
  • 便捷批量字符一键查找替换工具
  • 首页 layout 架子(element-plus菜单组件)
  • 解锁机器学习核心算法 | 逻辑回归:不是回归的“回归”
  • 通过API 调用本地部署 deepseek-r1 模型
  • 关系中出现这10个信号,离分手就不远了(爱情友情都适用)
  • idea连接gitee后.反向创建仓库和分支
  • 京东CEO许冉:外卖日单量接近2000万单,看到外卖对平台拉动和转化效应
  • 白天气温超30℃的北京,晚间下起了冰雹
  • 中国巴西民间推动建立经第三方验证的“森林友好型”牛肉供应链
  • 体坛联播|安切洛蒂执掌巴西男足,字母哥尝试离开雄鹿
  • 小米SU7 Ultra风波升级:数百名车主要求退车,车主喊话雷军“保持真诚”
  • 区域国别学视域下的东亚文化交涉