浅谈NVMe与MSI-X
2017-10-30 10:31
183 查看
(阅读本文前需对NVMe/PCIe/MSI有一定的了解)
1. 单个设备INTx最多支持4个中断,MSI支持最多32个中断,MSI-X可以达到更多。
2. INTx需要专门的中断pin。
3. INTx随时发生,MSI发生在DMA完成后,对上下文切换影响较小。
data字段包含的数据,当系统软件初始化时,PCIe设备需要初始化MSI-X capabilities结构的Message
Address和Message Data字段(由host中断控制器驱动填写),并使能MSI-X。如图为Message
data字段定义:
表1 message data
Vector字段表示这个中断请求使用的中断向量,总线事务在提交中断请求的同时,将中断向量也通知给处理器。
fireware交互。
图1 NVMe cq vector
Host向中断控制器申请三个中断,读PCIe配置空间MSI-X capbility table如图:
图2 PCIe配置空间
从图2中可以看出MSI-X已使能,MSG Address:
0xC0041740, 三个中断的MSG Data依次为:0、0x20、0x40。对于设备来说写0、0x20、0x40到host
address:0xC0041740会产生三个不同的中断。对于Host EPIC(中断控制器)来说,它们分别叫:vector
address/vector value。
那么Host怎么知道中断来自哪个CQ呢?其实图1的cq-vector和图2的MSI-X
table是一一对应的(比如创建cq的时候interrupt vector = 1,设备就知道了如果这个q有完成状态就写0x20到0xC0041740,这时host
epic就根据MSG data把中断挂到具体的中断处理函数)。如图3为中断处理的整个流程:
图3中断处理流程
INTX与MSI
为什么在越来越多的PCIe外设驱动中摒弃INTx,而采用MSI/MSI-X?概括有三:1. 单个设备INTx最多支持4个中断,MSI支持最多32个中断,MSI-X可以达到更多。
2. INTx需要专门的中断pin。
3. INTx随时发生,MSI发生在DMA完成后,对上下文切换影响较小。
MSI-X如何发生
PCIe设备发出MSI/MSI-X中断请求都是向Message address所在地址写Messagedata字段包含的数据,当系统软件初始化时,PCIe设备需要初始化MSI-X capabilities结构的Message
Address和Message Data字段(由host中断控制器驱动填写),并使能MSI-X。如图为Message
data字段定义:
表1 message data
Vector字段表示这个中断请求使用的中断向量,总线事务在提交中断请求的同时,将中断向量也通知给处理器。
MSI-X与NVMe双剑合璧
不知道有多少人为NVMe协议中CQ vector(图1)而纠结过,反正笔者曾被它迷惑多时。简而言之,这个vector不同于device-irq,亦不同于EPIC(中断控制器)vector,它仅和NVMefireware交互。
图1 NVMe cq vector
Host向中断控制器申请三个中断,读PCIe配置空间MSI-X capbility table如图:
图2 PCIe配置空间
从图2中可以看出MSI-X已使能,MSG Address:
0xC0041740, 三个中断的MSG Data依次为:0、0x20、0x40。对于设备来说写0、0x20、0x40到host
address:0xC0041740会产生三个不同的中断。对于Host EPIC(中断控制器)来说,它们分别叫:vector
address/vector value。
那么Host怎么知道中断来自哪个CQ呢?其实图1的cq-vector和图2的MSI-X
table是一一对应的(比如创建cq的时候interrupt vector = 1,设备就知道了如果这个q有完成状态就写0x20到0xC0041740,这时host
epic就根据MSG data把中断挂到具体的中断处理函数)。如图3为中断处理的整个流程:
图3中断处理流程
相关文章推荐
- 浅谈Apple Pay开发
- 浅谈JavaScript--Array数组的join()方法
- 浅谈sql中return和 returns的区别
- 浅谈SQL Server 对于内存的管理
- 浅谈网络爬虫爬js动态加载网页(三)
- 浅谈CSRF攻击方式
- 浅谈MongoDB中几种不同查询方法
- 浅谈Django的Q查询以及AngularJS的Datatables分页插件
- Windows SDK入门浅谈 — 写给初学者
- 市场定位和硬件设计的错误-浅谈GM8126的封装
- PCI MSI MSI-X学习笔记
- 浅谈Exchange会议室应用现状分析
- 浅谈最大流-最小割
- 浅谈Serializable与Parcelable
- 猫与虎——浅谈开源协议与开源精神
- 浅谈Servlet的本质_2
- 黑马程序员—浅谈对委托的理解,与事件的关系
- 浅谈SDN中北向接口发展
- 浅谈Java中的接口和抽象类
- 浅谈Django的Q查询以及AngularJS的Datatables分页插件