windows驅動開發-PCI討論(一)

前面描述中斷的時候,我們曾經多次體積PCI,甚至提供了一些PCI的相關知識,但是整個PCI是一個很大的體系,專門記錄這個體系超出了這個系列的范疇,有興趣的可以到PCI官網了解詳細的情況。

但是還是會花費一些時間討論PCI技術,接下來我們從WDM的角度討論PCI協議。

先正式的介紹一下PCIe:
PCI Express (PCIe) 是一種 I/O 總線技術,旨在 PCI、PCI-X 和加速圖形端口 (AGP) 取代外圍組件互連。 通過提供高級功能和增加的帶寬,PCIe 解決了 PCI、PCI-X 和 AGP 的許多缺點。 PCIe 保留了與 PCI 本地總線規范 2.3 的完整軟件兼容性,并將 PCI 和 PCI-X 的并行多滴總線體系結構替換為串行的點到點連接總線體系結構。

兩個 PCIe 設備通過一個鏈路連接,每個鏈路由一個或多個通道組成。 每條車道由兩個低電壓、差分信號對組成,可向相反方向傳送 2.5 Gbps 的流量。 一對用于傳輸,另一對用于接收。 若要進一步增加鏈路的帶寬,可以在兩個 PCIe 設備之間) (x1、x2、x4、x8、x12、x16 或 x32 通道并行放置多個通道,以聚合每個通道的帶寬。

PCIe 硬件與 Microsoft Windows 2000 和 Microsoft Windows XP 操作系統上的 PCI 軟件向后兼容。 高級 PCIe 功能僅在 Windows Vista 和更高版本的 Windows 中受本機支持。

設備驅動程序和 PCI 電源管理

通常,設備驅動程序的責任如下:

總線驅動程序:總線驅動程序負責枚舉、配置和控制設備。 對于 PCI-PM,PCI 驅動程序負責讀取 PCI-PM 寄存器以確定硬件的功能。 當 POWER IRP 請求電源狀態更改時,PCI 驅動程序會寫入 PCI 電源管理寄存器,以將硬件設置為不同的 Dx 狀態。

當設備啟用喚醒時,PCI 驅動程序會寫入 PCI-PM 寄存器,使設備能夠觸發 PME 。 最后,當 ACPI 確定 PCI 總線正在喚醒系統時,PCI 驅動程序會掃描 PCI 配置空間,查找哪個設備正在斷言 PME,在該設備中禁用 PME,并通知驅動程序該設備。

設備驅動程序:設備的特定驅動程序負責保存和還原設備上下文,以及以設備策略所有者的身份請求電源狀態更改。 當設備驅動程序收到要求更改較低設備電源狀態的 POWER IRP 時,設備驅動程序負責保存以后打開設備所需的任何專有設備上下文。 在某些情況下,可能沒有任何可保存內容。

PCI-PM 寄存器嚴格是 PCI 驅動程序的域 -- IHV 的設備驅動程序不需要訪問這些寄存器中的任何一個,這樣做會導致系統無法可靠地工作, 設備驅動程序的責任是僅執行專有操作。

看上面的信息會感覺非常吃力,我們可以看看實際的配置,實際上,有兩個配置,分別是PMC和PMCSR寄存器:

當然上面的表述也確實沒有錯,PMC是一個只讀寄存器, PMCSR則是可以配置的

注意: 我們只需要關注這個寄存器三個設置項即可:


15-PME狀態
觸發函數獨立于PME_En位的狀態來斷言PME#信號的能力。注意:當輔助電源可用時,消耗輔助電源的設備功能必須保留此粘性寄存器的值。在這種功能中,此寄存器值不會被常規復位或FLR修改。
預定義值:
0b:沒有效果。
1b:該字段將被清除,功能將s8-PME啟用(RW)


8-觸發函數斷言PME:注意:當輔助電源可用時,消耗輔助電源的設備功能必須保留此粘性寄存器的值。在這種功能中,此寄存器值不會被常規復位或FLR修改。


預定義值:
0b:斷言已禁用
1b:斷言是在斷言PME#信號之前啟用的(如果啟用)。


0~1:電源狀態該2位字段既用于確定函數的當前功率狀態,也用于將函數設置為新的功率狀態。字段值的定義如下所示。如果軟件試圖將不受支持的可選狀態寫入該字段,則寫入操作必須在總線上正常完成;然而,數據被丟棄并且不發生狀態改變。


預定義值:
00b:D0
01b:D1
10b:D2
11b:D3hot

集成 ACPI 和 PCI PM

某些設備(尤其是便攜式中的主板視頻設備)可能需要 PCI 電源管理和 ACPI 源語言匯編程序 (ASL) 才能完全為設備供電。 PCI 電源管理寄存器將控制設備的內部狀態,例如內部時鐘和電源平面。 ASL 將控制外部狀態,如外部時鐘和電源平面,或者對于視頻控制器,ASL 將控制視頻背光。 請注意,ASL 和 PCI-PM 只能在主板設備上組合使用。

OnNow 體系結構是一種分層體系結構,可以自然地處理設備驅動程序、PCI 驅動程序和 ACPI 驅動程序 ( ASL) 集成。 以下方案顯示了調用驅動程序以處理這些設備的順序。

注意:?要使上述方案正常工作,WDM 驅動程序必須按照當前版本的 Microsoft Windows DDK 中所述正確轉發 POWER IRP。

方案 1:關閉設備

  • 設備驅動程序:保存專有設備狀態;
  • PCI 驅動程序:保存即插即用配置,禁用設備 (中斷和 BAR) ,并使用 PCI-PM 寄存器將設備置于 D3 中;
  • ACPI 驅動程序:運行 ASL 代碼 (_PS3 和 _OFF) 以便不再使用電源資源來控制芯片外部的狀態;

方案 2:PCI 電源管理和設備驅動程序

  • ACPI 驅動程序:運行 ASL 代碼 (_PS0 并_ON任何 OnNow 所需的電源資源) ,控制芯片外部的狀態;
  • PCI 驅動程序:使用 PCI-PM 寄存器將設備置于 D0 中,并還原即插即用配置 (中斷和 BAR) 這些可能與設備以前不同;
  • 設備驅動程序:還原設備中的專有上下文;

方案 3:啟用喚醒

  • 設備驅動程序:在芯片中設置專有寄存器以啟用喚醒。 例如,在模式匹配網絡喚醒中,這是將模式編程到適配器中的時間;
  • PCI 驅動程序:設置 PCI PM 寄存器中的喚醒啟用位,以允許設備斷言 PME;
  • ACPI 驅動程序:在與 PME 關聯的芯片集中啟用 GPE,如根 PCI 總線下列出的 _PRW 對象所述;

方案 4:喚醒

  • ACPI 驅動程序:喚醒并掃描 GPE 狀態位以查找喚醒事件,禁用設置 GPE 狀態位的 GPE,并運行與設置的 GPE 位關聯的任何_Lxx或_Exx方法。 為了響應 PCI 總線上的喚醒通知,ACPI 驅動程序將完成 PCI 驅動程序的WAIT_WAKE IRP,以通知 PCI 驅動程序正在喚醒系統;
  • PCI 驅動程序:掃描配置空間,查找具有設置 PME 狀態位的任何設備。 對于每個設備,它會禁用 PME 并完成該設備的WAIT_WAKE IRP,以通知驅動程序它正在斷言喚醒。 當 PCI 驅動程序通過所有 PCI 設備完成未找到任何斷言 PME 且 PME 停止斷言時,它將停止掃描喚醒設備;
  • 設備驅動程序:請求將設備放入 D0 (請參閱方案 2) 并在芯片中設置處理喚醒事件所需的任何專有寄存器;
訪問 PCI 設備配置空間

外圍組件互連PCI設備上的某些操作保留給設備的功能驅動程序。 例如,此類操作包括訪問總線的設備特定配置空間,以及DMA控制器對直接內存訪問進行編程。 Microsoft 通過兩種方法為訪問 PCI 設備的配置空間提供系統支持:

  • BUS_INTERFACE_STANDARD總線接口
  • 配置 I/O 請求數據包 (IRP) 、 IRP_MN_READ_CONFIG 和 IRP_MN_WRITE_CONFIG

從 Windows 10 版本 2004 開始,如果設備具有安全設備 (SDEV) ACPI 表且啟用了基于虛擬化的安全性,則會對不受支持的 PCI 設備配置空間訪問方法施加限制。 如果驅動程序或進程嘗試使用上面未列出的方法讀取或操作 PCI 設備配置空間,則訪問將被阻止,并導致系統 bug 檢查。

根據 PCI 本地總線 規范的定義,Windows XP 和 Windows Server 2003 及更高版本的操作系統對配置空間標頭以及功能鏈接列表中的所有功能具有獨占控制權。 驅動程序不得嘗試修改這些寄存器。

但是,驅動程序可以使用 IRP_MN_WRITE_CONFIG 請求或 BUS_INTERFACE_STANDARD 的 SetBusData 方法寫入不屬于供應商定義的標頭或功能列表的配置空間。 驅動程序還可以使用 BUS_INTERFACE_STANDARD 的 IRP_MN_READ_CONFIG 請求或 GetBusData 方法讀取設備的功能。 若要使用IRP_MN_READ_CONFIG或IRP_MN_WRITE_CONFIG,驅動程序必須在PASSIVE_LEVEL運行。?

驅動程序可以從擴展 PCI 設備配置空間讀取,即使用 IRP_MN_READ_CONFIG 請求或 getBusData BUS_INTERFACE_STANDARD 方法超過 256 字節的配置數據。 同樣,驅動程序可以使用 IRP_MN_WRITE_CONFIG 請求或 BUS_INTERFACE_STANDARD 的 SetBusData 方法寫入擴展的 PCI 設備配置空間。 如果設備沒有擴展配置空間,或者平臺未定義設備上擴展配置空間的路徑,則讀取請求將返回0xFFFF,寫入請求將不起作用。 若要確定操作是否成功,驅動程序可以檢查讀取或寫入的字節數。

PCI Express 和 PCI-X 模式 2 支持大于 256 字節的擴展 PCI 設備配置空間。 驅動程序可以讀取和寫入此配置空間,但只能使用適當的硬件和 BIOS 支持。 在 ACPI BIOS 中,根總線的 PNP ID 必須為 PNP0A08 或 PNP0A03。 對于 PNP ID 為 PNP0A03 的根總線,具有函數 4 的 _DSM 方法應指示當前模式為 PCI-X 模式 2。 所有網橋和設備都應為 PCI express 或在 PCI-X 模式 2 中運行。

此外,系統應支持內存映射配置空間訪問。 這是通過在系統 BIOS/固件中定義 MCFG 表。 Windows Vista 和 Windows Server 2008 及更高版本的操作系統自動支持內存映射配置空間訪問。

HalGetBusDataByOffset 和 HalSetBusDataByOffset 是為向后兼容而提供的,但僅當無法使用上述兩種方法時才應使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13169.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pytorch入門實戰 P10-使用pytorch實現車牌識別

目錄 前言 一、MyDataset文件 二、完整代碼: 三、結果展示: 四、添加accuracy值 🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 | 接輔導、項目定制 本周的學習內容是&#xff0…

SEO:搜索引擎蜘蛛名稱UA(user-agent)

最近網站在做統計功能,想著統計下蜘蛛爬行記錄,看看都有哪些搜索引擎蜘蛛經常關顧,故而好進行相應的對策改變。都知道搜索引擎對一個網站很重要,是很多網站重要的流量來源。熟悉各大搜索引擎的蜘蛛就顯得必要。 做SEO優化的通常會說蜘蛛爬得越…

國網698.45報文解析工具

本文分享一個698.45協議的報文解析工具,此報文解析工具功能強大,可以解析多種國網數據協議。 下載鏈接: https://pan.baidu.com/s/1ngbBG-yL8ucRWLDflqzEnQ 提取碼: y1de 主要界面如下: 本工具內置698.45數據協議, 即可調用word…

win編寫bat腳本啟動java服務

新建txt,編寫,前臺啟動,出現cmd黑窗口 echo off start java -jar zhoao1.jar start java -jar zhoao2.jar pause完成后,重命名.bat 1、后臺啟動,不出現cmd黑窗口,app是窗口名稱 echo off start "名…

美團小程序mtgsig1.2逆向

聲明 本文章中所有內容僅供學習交流使用,不用于其他任何目的,抓包內容、敏感網址、數據接口等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關!wx a15018601872 本文章未…

VMware虛擬機沒有網,無法設置網絡為橋接狀態

今天需要使用Ubuntu18但現有虛擬機是Ubuntu20,由于硬盤空間不夠大,所以刪除了原來的虛擬機并重新搭建Ubuntu18的環境,然后發現虛擬機沒有網絡,而我之前的虛擬機這一切都是正常的。 在網絡設置里勾選的是橋接模式但無法聯網&#x…

由讀寫arrow引發的對時間時區的思考

arrow是apache開發的一種高壓縮的數據結構,發現用來存儲K線還是很不錯的選擇。 測試用python讀寫很方便,關鍵是足夠小,A股1支票1分鐘的數據,1個月大約是140多K吧。 結果從數據庫取出來存入arrow中,再用C進行讀取&…

Cow Exhibition G的來龍去脈

[USACO03FALL] Cow Exhibition G - 洛谷 曲折經過 爆搜 一開始沒什么好的想法&#xff0c;就針對每頭奶牛去or不去進行了爆搜。 #include <cstdio> #include <algorithm> using namespace std;#define maxn 405 int iq[maxn], eq[maxn]; int ans; int n;void d…

留學資訊 | 2024英國學生簽證申請需要滿足哪些條件?

英國移民局于2020年9月10日發布了《移民規則變更聲明: HC 707》&#xff0c;對學生簽證制度進行了全面改革。該法案于2020年10月5日正式生效。根據此法案&#xff0c;新的學生簽證——The Student and Child Student Routes學生和兒童學生路線&#xff0c;將替代原先的Tier 4學…

短視頻賽道有哪些:成都鼎茂宏升文化傳媒公司

短視頻賽道有哪些&#xff1a;探索多元化的內容領域 隨著科技的飛速發展和人們生活節奏的加快&#xff0c;短視頻已成為現代人生活中不可或缺的一部分。它以其簡短、直觀、易于分享的特點&#xff0c;迅速占領了各個年齡層和社會群體的心智。然而&#xff0c;短視頻的賽道并非…

層次式體系結構概述

1.軟件體系結構 軟件體系結構可定義為&#xff1a;軟件體系結構為軟件系統提供了結構、行為和屬性的高級抽象&#xff0c;由構成系統的元素描述、這些元素的相互作用、指導元素集成的模式以及這些模式的約束組成。軟件體系結構不僅指定了系統的組織結構和拓撲結構&#xff0c;并…

小程序框架是智能融媒體平臺構建的最佳線路

過去5年&#xff0c;媒體行業一直都在進行著信息化建設向融媒體平臺建設的轉變。一些融媒體的建設演變總結如下&#xff1a; 新聞終端的端側內容矩陣建設&#xff0c;如App新聞端&#xff0c;社交平臺上的官方媒體等新聞本地生活雙旗艦客戶端&#xff0c;兼顧主流媒體核心宣傳…

TopOn 正式聚合Kwai 旗下程序化廣告平臺——Kwai Network

**我們非常高興的宣布&#xff0c;TopOn SDK 近日已正式聚合Kwai Network。**作為Kwai 旗下的程序化廣告平臺&#xff0c;Kwai Network 通過優質的變現能力及產品能力&#xff0c;為廣大開發者提供高效及時的服務。 TopOn 聚合平臺與Kwai Network 正式完成接入后&#xff0c;開…

實戰+代碼!Selenium + Phantom JS爬取天天基金數據

功能&#xff1a; 通過程序實現從基金列表頁&#xff0c;獲取指定頁數內所有基金的近一周收益率以及每支基金的詳情頁鏈接。再進入每支基金的詳情頁獲取其余的基金信息&#xff0c;將所有獲取到的基金詳細信息按近6月收益率倒序排列寫入一個Excel表格。 思路&#xff1a; 1.…

vm 虛擬機 Debian12 開啟 root、ssh 登錄功能

前言&#xff0c;安裝的時候語言就選中文就好了。選擇中文&#xff0c;在安裝的時候就可以選擇國內 163 的源。 開啟 ssh 功能 先提權&#xff0c;用 root 賬戶 su安裝 ssh 安裝 ssh-server apt install openssh-server啟動 ssh systemctl start ssh查看 ssh 狀態 systemctl st…

【Flutter 面試題】 如何讓圖片重復堆疊容器?

【Flutter 面試題】 如何讓圖片重復堆疊容器? 文章目錄 寫在前面口述回答補充說明寫在前面 ?? 關于我 ,小雨青年 ?? CSDN博客專家,GitChat專欄作者,阿里云社區專家博主,51CTO專家博主。2023博客之星TOP153。 ???? 正在學 Flutter 的同學,你好! ?? Flutter …

根據web訪問日志,封禁請求量異常的IP,如IP在半小 時后恢復正常則解除封禁

在網絡安全日益受到重視的今天&#xff0c;如何有效防范惡意流量和攻擊成為了每個網站管理員必須面對的問題。惡意流量不僅會影響網站的正常運行&#xff0c;還可能導致服務器崩潰&#xff0c;給網站帶來不可估量的損失。為了應對這一問題&#xff0c;我們特別推出了一款實用的…

u3d的ab文件注意事項

//----------------LoadAllAB.cs--------------------- using System.Collections;using UnityEngine;namespace System.IO{public class LoadAllAB : MonoBehaviour{ //讀取本地string path "Assets/Actors/lznh/ab/animation/t_bl/";// Use this for initiali…

SQL注入之數據庫基礎

數據庫基礎 創建數據庫 create 數據庫名稱;創建表 create table if not exists mobile(ID int(10) primary key auto_increment comment 手機編號 主鍵自增,Brand varchar(50) not null comment 手機品牌 非空約束,Model varchar(50) not null comment 手機型號 非空約束,Pr…

Keil手動安裝編譯器V5版本

V5編譯器下載&#xff1a;免積分下載 新版的keil不會自動幫你安裝V5版本的編譯器&#xff0c;但是很多教程很多比賽所用單片機都是V5的編譯器&#xff0c;所以用來開以前的或者開源的很多東西編譯直接一大堆報錯。 吐槽說完了接下來教你怎么解決 打開installer&#xff08;在…