操作系统是如何一步步发明中断机制的?

将 脚本之家 设为“星标⭐”

第一时间收到文章更新

图片

出品 | 码农的荒岛求生 (ID:escape-it)

1960年代初期,你正在开发一个批处理系统,用于自动化处理大量的数据任务。

系统需要频繁地与磁带机和打印机等外部设备交互。然而,这些设备的响应速度远远低于CPU的处理速度。例如,磁带机读取一个数据块需要约100毫秒,而打印机打印一行数据更是需要超过600毫秒。

在等待设备响应的过程中,CPU只能不断地查询设备状态,就像这样:

int poll_count = 0;// 轮询等待打印机就绪while (1) {    poll_count++;    if (check_printer_status() == PRINTER_READY) {        send_to_printer(print_data);        break;    }}

这就是所谓轮询,这个示例程序通过不断轮询打印机状态来等待设备就绪,只要打印机不READY你就没有办法跳出这个while循环,这导致大量的计算资源被浪费。

灵感时刻

1954年IBM 704的出现给了你灵感,因为这台机器上出现了一种有趣的特性。

IBM 704 具有一个溢出标志位(Overflow Flag, OV),它会在某些算术运算(如加法、乘法等)导致溢出时被设置,程序员可以手动检查这个标志位,并根据需要进行错误处理:

   ADD MQ        // AC = AC + MQ,可能导致溢出   TOV ERROR     // 如果 OV 标志为 1,则跳转到 ERROR 处理异常   TRA CONTINUE  // 否则继续执行程序ERROR    // 错误处理指令CONTINUE   // 继续执行其他指令

你看到后想了一下,为什么要程序员自己手写汇编来检查异常呢,实现在CPU硬件层面就好了,出现A错误就跳转到X代码,出现B错误就跳转到Y代码等等,这样程序员只需要编写正常的处理逻辑就好。

以程序除0错误为例:

void test_division() {    int a = 10;    int b = 0;  // 除数为零    int result = a / b;  // CPU立即触发异常处理    // 这行代码永远不会执行    printf("结果是: %dn", result);}

当CPU执行到除法操作时,它能够立即检测到除数为零的情况,并自动跳转到异常处理程序(提前定义好的),而不是等待程序员自己检查除数是否为零。

中断的发明

这种机制给你带了新的启示:实际上这相当于软件出现异常后可以通知CPU去执行一段异常处理逻辑,而且整个过程非常丝滑,因为异常处理逻辑是提前定义好的,CPU能根据异常类型去执行不同的异常处理逻辑。

到这里你灵光乍现,既然软件能通知CPU那么外部设备显然也可以通知CPU。

可以把上述机制应用在外部设备上,为此你进行了如下设计:

  • 硬件层面:外部设备通过特定的信号线连接到CPU

  • 信号触发:设备就绪时产生电平变化

  • CPU响应:检测到信号后立即切换到处理程序

  • 任务恢复:处理完成后返回原程序继续执行

  • 这种设计可以让CPU不再需要主动查询设备状态,而是由设备在就绪时主动通知CPU,从而大大减少了CPU资源的浪费,到这里你发明了中断机制。

    中断的实现

    现在CPU不但能响应软件异常也能响应外部设备,这些统统被称为中断。

    只不过来自软件的就被称为软中断,比如除零错误、内存访问违规、系统调用等;来自硬件的就被称之为硬中断,比如I/O设备中断(如打印机、磁盘完成操作)、时钟中断等。

    你在自己实现的内核中定义了这些中断类型:

    // 中断类型定义typedefenum {    // 硬件中断    INT_PRINTER = 0,    // 打印机中断    INT_DISK = 1,       // 磁盘中断    INT_TIMER = 2,      // 时钟中断    INT_KEYBOARD = 3,   // 键盘中断        // 软件中断    INT_DIVIDE_BY_ZERO = 4,    // 除零错误    INT_PAGE_FAULT = 5,        // 页面错误    INT_SYSTEM_CALL = 6,       // 系统调用        MAX_INTERRUPT_TYPE = 7} InterruptType;

    除此之外你还需要实现中断处理函数,中断处理函数应该能处理所有类型的中断,其本质就是一个函数数组,你将其命名为中断向量表:

    // 中断处理函数的类型定义typedef void (*InterruptHandler)(void);// 中断向量表结构typedef struct {    InterruptHandler handlers[MAX_INTERRUPT_TYPE];    bool enabled[MAX_INTERRUPT_TYPE];        // 中断使能状态} InterruptVectorTable;

    从其定义可以看到:

    • 中断向量表是一个存储中断号与对应中断处理程序入口地址映射的表格。

    • 每个中断号对应一个特定的事件(如硬件中断、系统调用、异常等),中断向量表中的每个条目通常包含:中断处理程序的入口地址、可能还包括其他信息(如中断优先级、状态标志等)。

    当发生中断时,CPU使用中断号作为索引,查找中断向量表中的对应条目,从而获取中断处理程序的入口地址,其本质就是:

    void handle_interrupt(InterruptVectorTable* ivt, InterruptType type) {  ...  ivt->handlers[type]();  ...}

    现在CPU不再需要一遍遍检查设备状态而是可以专注于执行正常任务的机器指令,当外部设备需要CPU关注时发起中断信号,然后CPU将跳转到提前定义好的中断处理函数去执行。

    现在你应该对操作系统的中断机制有所了解了吧。

    图片

      推荐阅读:

  • 收藏不吃灰~ 几款免费开源绘图神器,Visio、XMind 瞬间不香了!

  • 这种Windows激活方式已有20年...

  • 微软发明了世界上最流行的编程语言!

  • 解放双手!看看人家的Nginx可视化管理工具,确实清新优雅!

  • 有可能一人搞定CPU、操作系统、编译器吗?

  • (0)
    wd123_cnwd123_cn
    上一篇 2025年3月29日 下午1:24
    下一篇 2025年3月29日 下午1:24

    相关文章

    • 春季地中海饮食指南:营养师推荐的9种时令食材

      审核:注册营养师Karen Ansel, M.S., RDN 要点总结 遵循地中海饮食有诸多健康益处,包括改善心脏健康和促进健康老龄化。 在地中海饮食中加入新鲜的时令食材,能让饮食更加美味。 营养师建议在春季采购朝鲜蓟、芦笋和豌豆等当季农产品。 想必您一定听说过地中海饮食是最健康的饮食方式之一。无数研究表明,它能促进心血管健康,降低患糖尿病的风险,并延长寿命…

      2025年3月13日
    • Gwen Stefani新单曲《Still Gonna Love You》即将发布,粉丝期待满满

      Gwen Stefani近日在Instagram上分享了她即将发布的新单曲《Still Gonna Love You》的片段,引发了粉丝们的热烈讨论。这位No Doubt乐队的主唱兼独唱艺术家在3月5日发布了一段视频,展示了她在这首歌的MV拍摄中的造型,她身着飘逸的短裙,坐在木椅上,展示了她的米色绒面高跟鞋。 新单曲风格引发回忆 《Still Gonna L…

      2025年3月7日
    • 金秀贤被曝和金赛纶交往六年!二人从金赛纶15岁开始交往,遗属发声

      来源 | 新黄河、点时新闻、晨视频 据新黄河、点时新闻报道,3月10日,韩国著名娱乐记者在直播中爆料金秀贤和金赛纶恋情,记者和金赛纶遗属进行通话,爆料称金赛纶从15岁(初二)开始和金秀贤交往。金赛纶家属近日发声,要求对李振浩、金秀贤等人追究责任。 (金赛纶。) 金赛纶于2月16日下午4时54分许被发现死于家中,年仅25岁。噩耗传出后,曾一同出演《孤…

      2025年3月12日
    • 压力山大?专家:适度尖叫或有益身心,但切忌过度

      你是否也曾感到压力巨大,想要放声尖叫?最近,一位网友在Reddit论坛的AskLosAngeles板块发帖求助:“洛杉矶哪里可以让我尽情尖叫?” 这位网友表示,自己并非只是想随便喊叫,而是想寻求一种“真正能释放情绪的尖叫”。 “最近压力很大,感觉非常沮丧、愤怒和悲伤……需要在崩溃之前找到一个地方释放出来。” 帖子一出,引来众多网友纷纷支招。“我通常在高速公路…

      2025年3月14日
    • 塔夫茨大学博士生被扣押,美联邦法官紧急叫停驱逐出境

      美国马萨诸塞州一名联邦法官周五表示,本周被拘留的塔夫茨大学博士生鲁梅伊萨·厄兹图尔克(Rumeysa Ozturk)在没有法院命令的情况下不得被驱逐到土耳其。 事件经过 30岁的厄兹图尔克于周二在波士顿郊区萨默维尔的街道上行走时,被戴着面具的移民官员带走。 在她的律师能够获得法官的命令阻止转移之前,厄兹图尔克迅速被转移到路易斯安那州偏远的巴塞尔的移民和海关执…

      2025年3月29日
    • 秘鲁男子醉酒后在火车铁轨上睡觉,被火车撞上,仅手臂受伤

      来源 | 潇湘晨报 记者 | 梁婷婷 8日,秘鲁男子胡安·卡洛斯·特洛醉,酒后在火车铁轨上睡觉,被一辆货运火车撞上。幸运的是,他只是左臂受了轻伤。 视频显示,当时,特洛躺在铁轨上,双脚悬在铁轨的高架部分。几秒后,一辆货运列车驶来,他微微抬了一下头,随即便被撞上。他被车轮拖着转了一圈,竟然又跌跌撞撞地离开了铁轨。 (特洛躺在铁轨上,双脚悬在铁轨的高架部分。) …

      2025年3月12日