解釋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.pswp.cn/news/167278.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167278.shtml
英文地址,請注明出處:http://en.pswp.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的一個主要優點是可以在多個組件之間重用和共享代碼。這可以幫…