解释PCIe MSI 中断要求中断向量连续?PCIe 规范里并没有明确指出

MSI 向量必须连续?

前言

MSI 物理条件,MSI 中断产生的逻辑是RC初始化的时候,由软件将配置写入到 EP 的 2 个寄存器中,这两个寄存器一个指示的是地址 Message Address,一个指示的是数据 Message Data。当 EP 试图触发中断的时候,将会发起一个 MW 事务,往对应的 Message Address 写入 Message Data 的值。

引入问题

MSI 可以配置多达 32 个中断,那么如果是一个相同的 MW 事务,往对应的 Message Address 写入 Message Data 的值,而 Message Data 的值一直是 RC 初始化时配置的值,那么 RC 怎么可以区分不同的中断呢?

分析问题

上面的问题,写入同样的 Message Data 肯定是不能解决的。所以 EP 写的 Data 肯定是变化的,这样 RC 才能区分不同的中断。所以修改代码进行验证。

验证步骤

  1. 硬件 CPU: FT E2000 PCIe: NVME 硬盘 (CPU 使用的 ITS 的中断方式来处理 MSI 中断)
  2. 修改代码逻辑
    在这里插入图片描述
    __pci_write_msi_msg 为最后的将 msi_msg 写入 EP 配置空间的操作函数。
  • 修改1:struct msi_msg *msg 传入的数据结构里面 Message Address 是 ITS 的某个寄存器的地址,Message Data 是 its_get_event_id 获取的 id 。申请一个非缓存的内存空间 __phys_addr 来冒充这个 Message Address。随机选取了 Message Data 为 0xF0 来观察变化。
// 分配非缓存空间noncache_memory = kmalloc(ALLOC_SIZE, GFP_KERNEL | __GFP_HIGHMEM);if (!noncache_memory) {printk(KERN_ERR "Failed to allocate non-cacheable memory\n");return -ENOMEM;}    __phys_addr = virt_to_phys(noncache_memory);printk(KERN_INFO "Non-cacheable memory allocated. Physical Address: %pa\n", &__phys_addr);
  • 修改 2:创建一个定时器,来定时查询这个 __phys_addr 的值有没有被修改
#define ALLOC_SIZE 128
static void* noncache_memory;
static phys_addr_t __phys_addr;
static void __iomem *its_virtual_address;#include <linux/timer.h>
struct irq_data * irq_data_save[128] = {0};//irq_chip_retrigger_hierarchy
// 内核线程函数
static struct timer_list my_timer;#define DATA_MSI   0xF0static void my_kernel_thread(struct timer_list *timer) {int *paddr = noncache_memory;if (*paddr != 0) {printk("msi data change :0x%x irq_data:%px", *paddr, (void*)irq_data_save[97 + (*paddr-(DATA_MSI))]);irq_chip_retrigger_hierarchy(irq_data_save[97 + (*paddr-DATA_MSI)]);*paddr = 0;}// 重新设置定时器,以实现循环定时mod_timer(timer, jiffies + msecs_to_jiffies(1)); 
}

代码中使用 irq_chip_retrigger_hierarchy 来触发 ITS 的中断。97 是写死了,是人为查看系统中 MSI 中断的号起始。

实验结果

nvme 可以正常使用,CPU 是 2 核心,系统中创建了 3 个 MSI 的中断号,97 98 99 一共 3 个中断。
通过观察打印,可以分析得出,EP试图触发中断时,会往刚刚修改的 __phys_addr 的这个内存地址写入数据,有 0xF0, 0xF1, 0xF2 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/167278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你再不学Git就来不及了!!!

其他系列文章导航 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 版本控制 什么是版本控制 为什么要版本控制 一、认识 Git 1.1Git 简史 1.2Git 与其他版本管理系统的主要区别 1.3Git 的三种状态 二、Git 使用快速入门 2.1获…

springboot使用redis缓存乱码(key或者 value 乱码)一招解决

如果查看redis中的值是这样 创建一个配置类就可以解决 package com.deka.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; i…

CPU+GPU多样化算力,ZStack Cloud助力游戏精酿核心业务上云

游戏精酿通过ZStack Cloud云平台提供高性能、高可用的云主机、云存储和云网络&#xff1b;前期通过超融合架构快速构建云基础设施&#xff0c;来支持Jira、Redis等关键业务&#xff1b;并实现对原有私有云平台业务的替代&#xff0c;按需将原有私有云业务滚动迁移到ZStack Clou…

移动端浏览器 jquery 获取 pdf blob文件流 预览pdf

最近遇到一个需求&#xff0c;一个古早的移动端 juery 项目要求做一个页面&#xff0c;从接口获取 pdf 文件流&#xff0c;然后预览出来 这里使用第三方工具&#xff1a;pdf.js 代码如下&#xff1a; // 引入相关文件<script src"../js/pdf.js" type"text…

N_1 验证密码

N_1 验证密码 题目 设计一个用户密码验证程序&#xff0c;要求密码输入只有3次机会&#xff0c;且密码中不能包含”*”字符。 分析 需要考虑3个问题&#xff1a;验证次数、特殊字符和正误密码判断&#xff1b;验证次数需要使用循环&#xff0c;3个问题需要用到分支结构&…

java 系统属性和环境属性

Java系统属性和环境属性都是与Java应用程序相关的参数&#xff0c;但它们有以下区别&#xff1a; 系统属性是由Java虚拟机&#xff08;JVM&#xff09;设置的&#xff0c;而环境属性是由操作系统设置的。 系统属性是以“-D”开头的命令行参数传递给JVM的&#xff0c;而环境属性…

深入理解Spring AOP的工作流程

文章目录 引言什么是AOP&#xff1f;Spring AOP的工作原理1. JDK动态代理2. CGLIB代理 Spring AOP的注解方式Aspect注解EnableAspectJAutoProxy注解 Spring AOP的工作流程拓展应用1. 自定义注解2. 异常处理3. 切面优先级 结论 &#x1f389;深入理解Spring AOP的工作流程 ☆* o…

关于运行软件程序出现vcruntime140.dll丢失的修复教程-解决方案

vcruntime140.dll是Microsoft Visual C库文件的一部分&#xff0c;用于支持Windows操作系统上的应用程序。如果找不到或丢失了这个文件&#xff0c;可能会导致某些应用程序无法正常运行。下面是关于vcruntime140.dll丢失的5个修复方法&#xff0c;以及vcruntime140.dll文件属性…

Python基础教程之分支结构详解

文章目录 一、分支结构二、单分支结构三、双分支结构四、多分支结构五、嵌套分支结构六、三元表达式七、条件测试关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③P…

Elasticsearch基础优化

分片策略 分片和副本得设计为ES提供支付分布式和故障转移得特性&#xff0c;但不意味着分片和副本是可以无限分配&#xff0c; 而且索引得分片完成分配后由于索引得路由机制&#xff0c;不能重新修改分片数&#xff08;副本数可以动态修改&#xff09; 一个分片得底层为一个l…

python之pyqt专栏2-项目文件解析

项目结构 在上一篇文章python之pyqt专栏1-环境搭建&#xff0c;创建新的pyqt项目&#xff0c;下面我们来看一下这个项目下的文件。 从下面的文件结构图可以看到&#xff0c;该项目下有3个文件&#xff0c;untitled.ui,untitled.py 以及main.py。 QtDesigner可以UI界面的方式&am…

Feign接口请求返回异常 no suitable HttpMessageConvert found for response type

问题场景&#xff1a; 后端调用feign接口请求, 接口返回异常, no suitable HttpMessageConvert found for response type 问题描述 报错异常如下&#xff1a; //根据图片特征 去查询人员信息ResultVo<List> personVos ipbdFaceLibPersonApi.queryFacePersonByFeatur…

华为云之SFS弹性文件服务使用体验

华为云之SFS弹性文件服务使用体验 一、本次实践介绍1.1 实践环境简介1.2 本次实践目的 二、SFS弹性文件服务介绍2.1 SFS弹性文件服务简介2.2 SFS弹性文件服务特点 三、购买ECS弹性云服务器3.1 购买ECS弹性云服务器3.2 查看ECS弹性云服务器状态3.3 远程连接ECS3.4 检查操作系统版…

package.json 中的版本号,符号 ~ 与 ^ 的区别及其他符号的含义

"element-ui": "^2.15.1", 版本号&#xff1a; 2.15.1 对应 x.y.z z &#xff1a;表示一些小的bugfix, 更改z的号&#xff1b;(修复补丁-z)&#xff08;~符号&#xff09; y &#xff1a;表示一些大的版本更改&#xff0c;比如一些API的变化&#xff1b;(…

迭代器模式 (Iterator Pattern)

定义 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于顺序访问集合对象的元素&#xff0c;而无需知道集合对象的底层表示。迭代器模式将遍历集合的责任从集合对象转移到迭代器对象上&#xff0c;这简化了集合接口和实现&#xff0c;…

计算机应用基础_错题集_基础知识---网络教育统考工作笔记006

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、基础知识部分错题集总结前言 计算机应用基础统考,错题集总结 一、基础知识部分 基础知识部分 2、微处理器芯片的位数即指______。 A.速度 B.字长 C.

Unity Android FireBase bugly报错查询

报错如下图&#xff0c;注意&#xff0c;标红的三处 使用的il2cpp和架构是arm64-v8a 那我们就可以根据这些去找对应的符号表&#xff0c;在unity安装目录下 Unity2020.3.33f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Symbols\arm64-v8a 找到l…

Tomcat注册为服务后,如何配置Tomcat内存大小

前提条件&#xff1a;tomcat已经注册为服务。 1.winR,输入regedit打开注册表 2.找到Tomcat注册表路径&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat80603.找到jvm内存配置路径&#xff1a; HKEY_LOCAL_MACHINE\SOFTW…

PTA-6-312 使用多态实现图书馆计算罚金功能

题目&#xff1a; 图书馆提供给读者借阅服务&#xff0c;包括借阅书籍及音像制品。如果借阅超时需要缴纳罚金。对于不同类型的书籍和音像制品罚款规则不同。 成人书籍:允许借阅的时间是21天&#xff0c;每超时1天&#xff0c;需要缴纳罚金2元;如果超时3天以上&#xff0c;超出的…

vue中 mixin用法

在Vue.js中&#xff0c;mixin是一种可以在多个组件之间共享Vue组件选项的灵活方式。mixin对象可以包含任何组件选项。当组件使用mixin时&#xff0c;所有mixin对象的选项将被“混合”到该组件的选项中。 使用mixin的一个主要优点是可以在多个组件之间重用和共享代码。这可以帮…