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

MSI 与 IOAPIC LAPIC 如何协作,操作系统如何初始化和使用他们

  • 1. 核心组件角色回顾

I/O APIC (I/O Advanced Programmable Interrupt Controller):

角色: 系统全局中断控制器。负责收集来自外部设备(如PCI设备、USB控制器等)的传统引脚中断(PIN-based interrupts),并将其转换为消息。

位置: 通常位于芯片组(Chipset)中。

特点: 有多个中断输入引脚(如24个),每个引脚可以连接一个中断源。它通过系统总线向Local APIC发送中断消息。

Local APIC (Local Advanced Programmable Interrupt Controller):

角色: 每个CPU核心私有的中断控制器。负责接收来自I/O APIC的中断消息、处理来自其他CPU核心的处理器间中断(IPI)、以及处理本地中断(如定时器中断、性能计数器中断)。

位置: 集成在每个CPU核心内部。

特点: 每个Local APIC都有一个唯一的ID(APIC ID)。它直接向所属的CPU核心交付中断。

MSI (Message Signaled Interrupts):

角色: 一种中断机制,允许设备绕过I/O APIC的物理引脚,直接通过向特定内存地址执行写入操作来向Local APIC发送中断。

本质: 一次特殊的内存写事务(PCI Memory Write transaction),其目标地址和写入数据具有特定格式,CPU和芯片组能识别出这不是普通的内存写入,而是一个中断信号。

2. 三者的协作关系

下图清晰地展示了传统引脚中断与MSI中断两条路径的并行协作流程,以及I/O APIC和Local APIC在其中的不同角色:

关键协作点:

MSI“模拟”了I/O APIC的行为:OS为MSI设备设置的 Message Address 实际上包含了目标Local APIC的地址信息,而 Message Data 则包含了中断向量等信息。这使得设备产生的内存写事务,看起来就像是I/O APIC发送出来的中断消息,因此可以直接被目标Local APIC接收和处理。

I/O APIC处理传统设备,MSI处理现代设备:两者是并行工作的。I/O APIC负责处理那些只有传统引脚中断的老设备,而支持MSI的新设备则直接“空降”到Local APIC。

Local APIC是共同的终点:无论中断来自I/O APIC转发,还是来自设备直接的MSI写入,最终都由目标CPU的Local APIC统一接收、管理和交付给CPU核心。Local APIC是中断的“集散中心”。

3. 操作系统的初始化和使用流程

阶段一:系统启动早期 - 探测和初始化控制器

ACPI表解析:

OS内核启动时,会解析ACPI表(特别是MADT表)。

从表中获知系统中存在几个I/O APIC、它们的物理地址、以及每个I/O APIC的GSI(Global System Interrupt)中断输入引脚范围。

获知系统中所有Local APIC的ID(即对应的CPU核心)。

映射I/O APIC地址:

OS将I/O APIC的物理地址映射到内核的虚拟地址空间,以便后续对其进行编程配置。

初始化Local APIC:

OS在每个CPU核心上执行初始化代码,设置其Local APIC。

启用Local APIC(设置SPIV寄存器)。

设置Local APIC的定时器、LVT(Local Vector Table)等。

阶段二:中断路由设置 - 为传统中断做准备

构建中断路由表:

OS解析ACPI表中的PCI中断路由信息,得知“哪个PCI设备的哪个引脚(INTA#)连接到哪个I/O APIC的哪个输入引脚”。

OS为每个可能的I/O APIC输入引脚(即每个GSI)分配一个内核管理的虚拟中断号(virq)。

配置I/O APIC重定向表(Redirection Table):

对于每个被使用的I/O APIC输入引脚,OS需要配置其对应的重定向表条目。

此时,OS可能还不知道具体哪个设备会用这个引脚,所以它先填充一个占位的中断向量(Vector)。

配置内容包括:

Vector: 一个临时或通用的向量号。

Delivery Mode: 通常为Fixed。

Destination Field: 指定中断发送到哪个或哪些CPU核心(物理目标或逻辑目标模式)。

阶段三:设备枚举和中断分配 - 动态分配

这是最关键的阶段,OS为每个设备选择最佳的中断方式。

PCI设备枚举:

OS发现一个PCI设备,读取其配置空间。

读取 Interrupt Pin 寄存器(例如,值为1表示使用INTA#)。

检查是否支持 MSI 或 MSI-X Capability。

优先尝试启用MSI/MSI-X:

如果设备支持MSI:

OS根据设备请求的中断数量(多个队列可能需要多个向量),分配等量的空闲CPU中断向量(Vector)。

OS为每个中断向量构造一对 Message Address 和 Message Data。

Message Address: 编码了目标CPU的Local APIC的地址(通常是所有Local APIC的基地址,如 0xFEE00000),并通过Destination ID字段指定具体核心。

Message Data: 低8位就是分配的中断向量号(Vector)。其他位 delivery mode等。

OS将这些值写入设备的MSI Capability寄存器。

OS禁用设备的传统引脚中断(设置配置空间中的命令寄存器位)。

至此,该设备的中断路径被设置为MSI,完全绕过I/O APIC。

回退到传统中断:

如果设备不支持MSI或MSI启用失败:

OS查询在阶段二构建的中断路由表,找到该设备引脚(INTA#)对应的I/O APIC引脚和GSI。

OS获取该GSI对应的内核 virq。

设备驱动程序调用 request_irq(virq, handler) 申请中断。

OS此时才会为这个特定的 virq 分配一个真正的中断向量(Vector),并更新之前在I/O APIC重定向表中的配置,将占位的Vector替换为这个真正的Vector。

同时,OS会配置Local APIC,确保它能接收这个向量对应的中断。

阶段四:运行时中断处理

MSI路径: 设备产生中断 -> 直接发起内存写事务 -> 目标CPU的Local APIC接收 -> 根据 Message Data 中的Vector触发中断 -> CPU执行对应的ISR。

传统路径: 设备拉高中断引脚 -> I/O APIC检测到电平变化 -> I/O APIC根据配置的重定向表,构造中断消息并发送 -> 目标Local APIC接收 -> 根据消息中的Vector触发中断 -> CPU执行对应的ISR。

总结

操作系统通过ACPI表了解硬件布局,初始化I/O APIC和Local APIC作为基础设施。对于每个设备,OS优先选择MSI路径,通过编程设备自身的MSI寄存器,使其能够直接与Local APIC“对话”。如果MSI不可用,则回退到使用I/O APIC作为中转站的传统路径。


文章转载自:

http://XPj4b104.qnkqk.cn
http://XjmlAueN.qnkqk.cn
http://A1eSgGhw.qnkqk.cn
http://Ve0ia6zn.qnkqk.cn
http://fsCRqdTQ.qnkqk.cn
http://8ESYpNAE.qnkqk.cn
http://zqEf4102.qnkqk.cn
http://WIWK4mPR.qnkqk.cn
http://TOUbzd9G.qnkqk.cn
http://Wqz60WKM.qnkqk.cn
http://XqQYWCC2.qnkqk.cn
http://h5dPTQ87.qnkqk.cn
http://dLsAKD8T.qnkqk.cn
http://NgZphqtH.qnkqk.cn
http://usAOcjHe.qnkqk.cn
http://VtyJn0qw.qnkqk.cn
http://us0rpizn.qnkqk.cn
http://w62TMCb3.qnkqk.cn
http://28muhzrw.qnkqk.cn
http://69Ew27br.qnkqk.cn
http://JffFu3v6.qnkqk.cn
http://gr4RL8U4.qnkqk.cn
http://xlimwlUD.qnkqk.cn
http://L55FEF7L.qnkqk.cn
http://GeOpKJ74.qnkqk.cn
http://e7ZPU41s.qnkqk.cn
http://WhpDLtWC.qnkqk.cn
http://NZVbwgpL.qnkqk.cn
http://NCq42T7u.qnkqk.cn
http://ox8nIMPz.qnkqk.cn
http://www.dtcms.com/a/386267.html

相关文章:

  • 数据库优化(六)安全字段脱敏设计—东方仙盟金丹期
  • java21学习笔记
  • 大厂综合题库解析
  • 算法奇妙屋(2)-模拟
  • 贪心算法应用:区间调度问题详解
  • js中异步编程的实现方式【详细】
  • 详解 ArduPilot:开源无人机自动驾驶系统的全方位解析
  • 分页查询:时间筛选+日期筛选+增加queryWrapper 筛选条件
  • 通透理清三级缓存--看Spring是如何解决循环依赖的
  • 【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
  • 查看 Docker 守护进程日志
  • 第11章 [特殊字符]️Hutool 常用工具类
  • 【MySQL|第十篇】总结篇——各种命令集合
  • npm : 无法加载文件 d:\nvm4w\nodejs\npm.ps1,
  • 贪心算法应用:活动选择问题详解
  • C++ 模板:以简御繁-5/5
  • AI大模型学习(6)Yolo V8神经网络的基础应用
  • 【完整源码+数据集+部署教程】残疾人和正常人识别图像分割系统: yolov8-seg-act
  • 深度学习:从概念到实践,开启智能时代新篇章
  • 构建AI智能体:三十五、决策树的核心机制(一):刨根问底鸢尾花分类中的参数推理计算
  • 美创科技入选 2025 年度省级场景型数字化服务商!
  • 《COD21》新赛季海量更新:《忍者神龟》联动上线!
  • RuoYi框架Excel静态模板下载例子Demo
  • 【系列文章】Linux系统中断的应用02-中断下文 tasklet
  • GPT-5-Codex 模型评测报告
  • MAZANOKE+cpolar让照片存储无上限
  • (笔记)Linux系统设置虚拟内存
  • Kotlin-基础语法练习三
  • windows上Redis Desktop Manager链接服务器docker内Redis方法
  • jMeter小记-数组数据X_id集合获取及循环控制器使用调用数组数据X_id