摘要:PCIE——第 10 章——MSI 和 MSI⁃X 中断机制

目录

第 10 章  MSI 和 MSI⁃X 中断机制

10. 1  MSI / MSI⁃X Capability 结构

10. 1. 1  MSI Capability 结构

10. 1. 2  MSI⁃X Capability 结构

10. 2  PowerPC 处理器如何处理 MSI 中断请求

10. 2. 1  MSI 中断机制使用的寄存器

10. 2. 2  系统软件如何初始化 PCIe 设备的 MSI Capability 结构

10. 3  x86 处理器如何处理 MSI⁃X 中断请求

10. 3. 1  Message Address 字段和 Message Data 字段的格式

10. 3. 2  FSB Interrupt Message 总线事务

10. 4  小结


第 10 章  MSI 和 MSI⁃X 中断机制

在 PCI 总线中, 所有需要提交中断请求的设备, 必须能够通过 INTx 引脚提交中断请求, 而 MSI 机制是一个可选机制。 而在 PCIe 总线中, PCIe 设备必须支持 MSI 或者 MSI⁃X 中断请 求机制, 而可以不支持 INTx 中断消息。

10. 1  MSI / MSI⁃X Capability 结构

PCIe 设备可以使用 MSI 或者 MSI⁃X 报文向处理器提交中断请求, 但是对于某个具体的PCIe 设备, 可能仅支持一种方式。 在 PCIe 设备中含有两个 Capability 结构, 一个是 MSI Ca⁃ pability 结构, 另一个是 MSI⁃X Capability 结构。 通常情况下一个 PCIe 设备仅包含一种结构, 或者为 MSI Capability 结构, 或者为 MSI⁃X Capability 结构

10. 1. 1  MSI Capability 结构

10. 1. 2  MSI⁃X Capability 结构

MSI⁃X Capability 中断机制与 MSI Capability 的中断机制类似。 PCIe 总线引出 MSI⁃X 机制 的主要目的是为了扩展 PCIe 设备使用中断向量的个数, 同时解决 MSI 中断机制要求使用中 断向量号连续所带来的问题。

有时在一个中断控制器中, 虽然具有 8 个以上的中断向量号, 但是很难保证这些中断向 量号是连续的。而使用 MSI⁃X 机制可以合理解决该问题。 在 MSI⁃X Capability 结构中, 每一个中断请求 都使用独立的 Message Address 字段和 Message Data 字段, 从而中断控制器可以更加合理地为 该设备分配中断资源。

1. MSI⁃X Capability 结构

2. MSI⁃X Table 

3. Pending Table 

10. 2  PowerPC 处理器如何处理 MSI 中断请求

PowerPC 处理器使用 OpenPIC 中断控制器或者 MPIC 中断控制器, 处理外部中断请求。

使用 MPIC 中断控制器处理 MSI 中断时, PCIe 设备的 MSI 报文, 其目的地址为 MPIC 中 断控制器的 MSIIR 寄存器。 当该寄存器被 PCIe 设备写入后, MPIC 中断控制器将向处理器内 核提交中断请求, 之后处理器再通过读取 MPIC 中断控制器的 ACK 寄存器获得中断向量号, 并进行相应的中断处理。 这种方式与 x86 处理器的 FSB Interrupt Message 机制相比, 处理器 需要读取 ACK 寄存器, 从而中断处理的延时较大。

由上图所示, MPIC 中断控制器可以处理内部中断请求㊀ 、 外部中断请求, Message、 处 理器间中断请求和 Share MSI 中断请求等。

10. 2. 1  MSI 中断机制使用的寄存器

在 PowerPC 处理器系统中, MSI 机制的实现过程是 PCIe 设备向 MSIIR 寄存器写入指定 的数据。 MPIC 中断控制器发现该寄存器被写入后, 将向处理器提交中断请求。 处理器收到 这个中断请求后, 将通过读取 MPIC 中断控制器的 ACK 寄存器确定中断向量, 并依此确定 中断源。 为此 PowerPC 处理器还设置了其他寄存器实现 MSI 中断机制。

1. MSIIR 寄存器

在 PowerPC 处理器中, MSIIR ( Shared Message Signaled Interrupt Index Register) 寄存器 是实现 MSI 机制的重要寄存器。当 PCIe 设备对 MSIIR 寄存器进行写操作时, MPC8572 处理器将使能 MSIR0⁃MSIR7 寄存 器的相应位, 从而向 MPIC 中断控制器提交中断请求, 而中断控制器将转发这个中断请求, 由处理器进一步处理。

2. MSIR 寄存器组

MSIR ( Shared Message Signaled Interrupt Registers) 寄存器组共由 8 个寄存器组成, 分别为 MSIR0 ~ MSIR7。其中每一个 MSIRx 寄存器中有 32 个有效位, 分别为 SH0 ~ 31。系 统软件通过读取该寄存器获得中断源, 该寄存器读清除, 对此寄存器进行写操作没有意义。

 3. MSISR 寄存器

MSISR 寄存器 ( Shared Message Signaled Interrupt Status Register) 共由 8 个有效位组成, 每一位对应一个 MSIR 寄存器。MPC8572 处理器设置该寄存器的主要目的是方便系统软件定 位究竟是哪个 MSIR 寄存器中存在有效的中断请求。

 4. MSIVPR 寄存器组

MSIVPR ( Shared Message Signaled Interrupt Vector / Priority Register) 寄存器组由 8 个寄存 器组成, 分别为 MSIVPR0 ~ 7 寄存器。分别为 MSIVPR0 ~ 7 寄存器。 该组寄存器设置对应中断请求的优先级别和中断向 量。 其中每个 MSIVPR 寄存器对应一个 MSIR 寄存器, MSIVPR 寄存器各字段的详细解释如 表 10-5 所示。

 5. MSIDR 寄存器组

MSIDR ( Shared Message Signaled Interrupt Destination Registers) 寄存器组共由 8 个寄存 器组成, 分别为 MSIDR0 ~ 7。 其中每一个 MSIDRn 寄存器对应一个 MSIR 寄存器。 MPIC 中断控制器支持 Pass⁃through 方式, 在这种方式下, PowerPC 处理器可以使用外部 中断控制器处理中断请求 (这种方法极少使用) , 而不使用内部中断控制器。 MPIC 中断控 制器可以使用 cint#和 int#信号提交中断请求, 但是绝大多数系统软件都使用 int#信号向处理 器提交中断请求。 此外在 MPC8572 处理器中有两个 CPU, 分别为 CPU0 和 CPU1, MSI 机制提交的中断请 求可以由 CPU0 或者 CPU1 处理。 系统软件可以通过设置 MSIDRn 寄存器完成这些功能, 该 寄存器各字段的详细描述如表 10-6 所示。

10. 2. 2  系统软件如何初始化 PCIe 设备的 MSI Capability 结构

如果 PCIe 设备支持 MSI 机制, 系统软件首先设置该设备 MSI Capability 结构的 Message Address 和 Message Data 字段。如果该 PCIe 设备支持 64 位地址空间, 即 MSI Capability 寄存 器的 64 bit Address Capable 位有效时, 系统软件还需要设置 Message Upper Address 字段。 系 统软件完成这些设置后, 将置 MSI Capability 结构的 MSI Enable 位有效, 使能该 PCIe 设备的 MSI 机制。

其中 Message Address 字段所填写的值是 MSIIR 寄存器在 PCI 总线域中的物理地址。

10. 3  x86 处理器如何处理 MSI⁃X 中断请求

PCIe 设备发出 MSI⁃X 中断请求的方法与发出 MSI 中断请求的方法类似, 都是向 Message Address 所在的地址写 Message Data 字段包含的数据。 只是 MSI⁃X 中断机制为了支持更多的 中断请求, 在 MSI⁃X Capablity 结构中存放了一个指向一组 Message Address 和 Message Data 字段的指针, 从而一个 PCIe 设备可以支持的 MSI⁃X 中断请求数目大于 32 个, 而且并不要求 中断向量号连续。 MSI⁃X 机制使用的这组 Message Address 和 Message Data 字段存放在 PCIe 设备的 BAR 空间中, 而不是在 PCIe 设备的配置空间中, 从而可以由用户决定使用 MSI⁃X 中 断请求的数目。

10. 3. 1  Message Address 字段和 Message Data 字段的格式

10. 3. 2  FSB Interrupt Message 总线事务

与 MPC8572 处理器处理 MSI 中断请求不同, x86 处理器使用 FSB 的 Interrupt Message 总 线事务, 处理 PCIe 设备的 MSI / MSI⁃X 中断请求。由上文所示, MPC8572 处理器处理 MSI 中 断请求时, 首先由 MPIC 中断控制器截获这个 MSI 中断请求, 之后由 MPIC 中断控制器向 CPU 提交中断请求, 而 CPU 通过中断响应周期从 MPIC 中断控制器的 ACK 寄存器中获得中 断向量。

在 x86 处理器中, 这种方式基 本上已被弃用。 下面以图 10-9 为例, 说明 x86 处理器如何使用 FSB 总线的 Interrupt Message 总线事务, 向 CPU 提交 MSI / MSI⁃X 中断请求。

PCIe 设备在发送 MSI / MSI⁃X 中断请求之前, 系统软件需要合理设置 PCIe 设备 MSI / MSI⁃ X Capability 寄存器, 使 Message Address 寄存器的值为 0xFEExx00y㊀ , 同时合理地设置 Mes⁃ sage Data 寄存器 Vector 字段。 ㊀  其中 xx 表示 APIC ID, 而 y 为 RH + DM。 PCIe 设备提交 MSI / MSI⁃X 中断请求时, 需要向 0xFEExx00y 地址写 Message Data 寄存器 中包含的数据, 并以存储器写 TLP 的形式发送到 RC。 如果 ICH 收到这个存储器写 TLP 时, 将通过 DMI 接口将这个 TLP 提交到 MCH。 MCH 收到这个 TLP 后, 发现这个 TLP 的目的地 址在 FSB Interrupts 存储器空间中, 则将 PCIe 总线的存储器写请求转换为 Interrupt Message 总 线事务, 并在 FSB 总线上广播。 FSB 总线上的 CPU, 根据 APIC ID 信息, 选择是否接收这个 Interrupt Message 总线事务, 并进入中断状态, 之后该 CPU 将直接从这个总线事务中获得中断向量号, 执行相应的中断 服务例程, 而不需要从 APIC 中断控制器获得中断向量。 与 PowerPC 处理器的 MPIC 中断控 制器相比, 这种方法更具优势。

10. 4  小结

本章详细描述了 MSI / MSI⁃X 中断机制的原理, 并以 PowerPC 和 x86 两个处理器系统为例 说明这两种中断机制实现机制。 本章因为篇幅有限, 并没有详细讲述这两个处理器使用的中 断控制器。 而理解这些中断控制器的实现机制是进一步理解 MSI / MSI⁃X 中断机制的要点。 对此部分有兴趣的读者可以继续阅读 MPIC 中断控制器和 APIC 中断控制器的实现机制, 以 加深对 MSI / MSI⁃X 中断机制的理解。 设备的中断处理是局部总线的设计难点和重要组成部分, 而中断处理的效率直接决定了 局部总线的数据传送效率。 在一个处理器系统的设计与实现中, 中断处理的优化贯彻始终。

PCIE——第 10 章—— MSI 和 MSI⁃X 中断机制相关推荐

  1. PCIe系列第八讲、MSI和MSI-X中断机制

    本章将着重讲述PCIe的MSI和MSI-X中断机制,在FPGA应用中主要通过XDMA中断与上位机进行通信,本文略长. 简介 在PCIe总线中,MSI和MSI-X中断机制使用存储器写请求TLP向处理器提 ...

  2. PCIE——第7章——PCIe 总线的数据链路层与物理层

    摘要:PCIE--第7章--PCIe 总线的数据链路层与物理层 目录 第 7 章 PCIe 总线的数据链路层与物理层 7. 1 数据链路层的组成结构 7. 1. 1 数据链路层的状态 7. 1. 2 ...

  3. 学籍管理系统 c语言流程图,程序设计基础 ——C语言第10章 综合应用案例——学生学籍管理系统...

    程序设计基础 第 10章 综合应用 案例 -学生学籍 管理系统 1 详细设计 需求分析 总体设计 第 10章 综合应用 案例 -学生学籍管理系统 编码实现 运行结果 2 设计一个利用 文件 处理方式, ...

  4. 翻译连载 | 第 10 章:异步的函数式(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...

    为什么80%的码农都做不了架构师?>>>    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS> ...

  5. 10-1-直接插入排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第10章  内部排序 - 直接插入排序 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课 ...

  6. mySQL教程 第10章 事务和锁

    第10章 事务和锁 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据 ...

  7. 第10章 序列的修改、散列和切片

    # <流畅的Python>读书笔记 # 第10章 序列的修改.散列和切片 转载于:https://www.cnblogs.com/larken/p/10576719.html

  8. 《构建之法》之第8、9、10章读后感

    第8章 第8章主要介绍了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术. 软件需求的步骤为:1.获取和引导需求(Eli ...

  9. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第10章-滤波器设计

    第3章 回到目录 第5章 第10章-滤波器设计 10.1 H∞H_\inftyH∞​ 滤波器设计 10.1 H∞H_\inftyH∞​ 滤波器设计

最新文章

  1. Flash/Flex学习笔记(4):如何打开网页及Get/Post数据
  2. matlab软件介绍_活动回顾 | 您要的MATLAB课堂总结上线啦!
  3. intelliJ idea 下载安装
  4. 监督学习和无监督学习_让半监督学习再次伟大!谷歌最新无监督数据增强研究,全面超越现有半监督学习方法...
  5. mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了
  6. RabbitMQ和Kafka选型用哪个
  7. 语音识别首次全平台比拼,讯飞依图BAT各家算法差异巨大
  8. 生存分析——KM生存曲线、hazard比例、PH假定检验、非比例风险模型(分层/时变/参数模型)(二)
  9. 蜘蛛采集单域名网站克隆镜像源码
  10. Redis开发运维实践开发者设计规范之延迟考虑
  11. VISTA、Win7激活administrator用户
  12. php的cmf框架哪个比较好,不要用这个CMF ThinkCMF内容管理框架,做最简约的ThinkPHP开源软件...
  13. Tom猫游戏代码iOS 素材
  14. winvnc出现错误时,删除以下注册表
  15. c语言中数的表示 叙述正确,关于C语言中数的表示,以下叙述正确的是(
  16. MySQL获取当前时间的各种方式
  17. Python自动化运维开发实战
  18. lyse-building otp applications
  19. opm openresty的包管理器-中文文档
  20. Java-Tomcat如何修改端口号

热门文章

  1. 三、数据缓冲区高速缓冲
  2. Selenium+Python 下载文件与上传文件
  3. 数据仓库概念扫盲,kimball和Inmon两大派系在争什么?
  4. 创业板首批十家公司今天集体招股
  5. 哥德巴赫猜想说是说,任何一个超过 2 的偶数都可以写成两个素数之和,例如,4=2+2,8=5+3 等
  6. java hook 和反射_反射基本概念与Class(四):Hook技术动态编程
  7. 阿里郎-听起来很舒服
  8. __builtin_expect 解惑
  9. Vue 3最新力作 Vue.js 3企业级应用开发实战
  10. C# 调用各种播放器代码大全