pci设备身份识别码介绍说明
什么是“PCI ID”?
根據PCI 規范,Windows 9x/NT/XP系統,通過VID、DID、SID、SVID、RID及CC等6個識別代碼對某一個PCI設備進行最終身份識別,并通過這些代碼引導操作系統檢測設備狀態、發現新設備,安裝設備不同版本的驅動等工作,并最終確保設備在系統平臺內正常安全運行。這6個由十六進制代碼編寫的識別ID,就組成了PCI IDs(“s”表示復數)。
●VID:全稱Vendor Identification,又稱Vendor ID,是代表發明設備的專利所有者(技術廠商)的識別碼,即常說的廠商ID,這個ID是PCI-SGI組織統一編制命名的,是唯一的廠商標識,不允許重名。例如:ATI的VID是0x1002,而NVIDIA的VID則是0x10DE。
●DID:全稱Device Identification,又稱Device ID,是針對設備本身標識的代碼,即常說的設備ID。這個ID標識主要區別同類設備的不同型號,一般由技術發明廠商按PCI規范命名,不同廠商的設備可以有重名(由于不同廠商都有唯一的VID,因此并不會混淆身份)。例如:同樣研發代號為R350的ATI 9800和ATI 9800XT,設備ID卻不同,分別為:0x4E48和0x4E4A。
●SID:全稱 Subsystem-Identification,又稱Sub-ID子(次要)系統(設備)識別碼,是授權被制造的設備的二次編碼。和DID的區別是這個代碼不是原技術廠商設備的代碼,而是二級制造廠商代工設備的代碼。有時候,如果是由技術廠商自己組織制造設備,這個編碼也可以和DID同名。
●SVID:全稱 Subsystem-Vendor Identification,又稱Sub-Vendor ID子(次要)系統廠商識別碼,是由PCI-SGI組織認證的二級制造廠商的識別碼,同樣是唯一的廠商標識,不允許重名,但同一家技術廠商的VID和SVID可以重名。SID和SVID代碼通常放在一起,作為設備二次認證的IDs。例如:8139網卡的Subsystem IDs組合是0x813910EC,前面的8139是SID,后面的10EC是SVID。
●RID:全稱Revision ID,又稱Rev ID。即通常所說的版本號:REV.X.
●CC:全稱Class-Code,類型代碼,是區別不同類或者同類不同規格設備類型的編碼。對于每一種設備如顯示、聲卡、SCSI、USB設備等等都有各自的標準分類。例如:Class-Code:000c0300,代表UHCI類型的USB設備;而Class-Code: 000c0310,則代表OHCI類型的USB設備。
上述的ID信息,我們可以通過BIOS自檢畫面或者WCPUID之類的系統信息檢測軟件看到。
從圖1中,我們可看到整個系統內設備的基本信息,按照從左到右的順序,分別是總線號、設備號、功能號、VID、DID、RID、SID/SVID、中斷號和設備名稱。
這里需要注意的是:由于SID和SVID屬于次要系統的ID識別,在技術廠商自己進行制造產品并符合行業規范的前提下,一個PCI設備只要具備VID、DID、RID和CC就足夠了。因此,SID和SVID只是PCI設備的附加識別IDs,并不是必須的,例如圖中的PCI-PCI Bridge,其Subsystem ID為“0000000h”,表示無SID和SVID。這在后文的驅動IDs對比分析中,我們會進一步詳述。
系統怎樣檢測到設備?
PnP(Plug and Play)即插即用技術,目前廣泛運用于Windows系統平臺。該技術能使系統自動偵測周邊設備和板卡并自動安裝設備驅動程序,做到插上就能用,無須人工干預。而PnP-PCI連接正是實現這一技術的關鍵。按照PCI規范,每個PCI設備都由一個總線號、一個設備號和一個功能號來確定。PCI設備可以訪問三類地址空間:PCI的I/O空間、PCI的存儲空間和PCI的配置空間。前兩者可由PCI總線上的所有設備共享,后者則是唯一的。PCI的配置空間由256個字節構成,其布局是標準化的,它的前64個字節是必須的,記錄了PCI設備的基本信息(圖3),PnP就是通過這個配置空間實現與PCI設備的連接,進而實現其即插即用的功能。
你知道嗎?
關于PCI-SIG組織
PCI-SIG的全稱為Peripheral Component Interconnect Special Interest Group,它是一個以技術為主導的非盈利性組織。成立于1992年,專門制定和管理PCI標準。該組織目前擁有850多個會員,理事會成員共有9名,由會員推舉選出,負責該組織的正常運作。目前該組織理事會主席由Microsoft公司代表擔任,總經理為IBM公司代表,其它各理事會員是AMD、HP、Intel、LSI Logic、Phoenix、Sever Works、TI與VTM等。PCI-SIG所承擔的責任包括:維持所有PCI修正版和追加版本的兼容性;協助PCI成為業界標準并延續PCI架構在市場上的壽命;確保PCI規格的單純性、簡易性和穩定性以確保更大程度地支持該規格普及的原設計理念;促進PCI標準的推進和改革。通過互通性測試和技術支持,編制和認證標準的廠商和設備IDs,促進其成員能夠生產高質量高規格的產品,取得相對主動的市場競爭力。PCI第一個技術規范1.0版本在1992年6月22日面世,2.0修改版于1993年4月發布,2.1修改版于1995年一季度發布, 2.2修改版于1998年12月完成,2002年11月PCI-SIG組織公布新一代PCI規范PCI Express的最終草案,2003年7月PCI-SIG制定并發表了用于由PCI Express向PCI和PCI-X進行總線連接的標準規格“PCI Express to PCI/PCI-X Bridge Specification Revision 1.0”,2003年8月PCI-X 2.0規格出臺。
從配置圖中可以看到:Vendor ID、Device ID、Revision ID、Class Code域處于最前端(其中VID和DID獨占最前端的16個字節),它們是讀取和確認設備身份的關鍵,這些信息必須存在。SID和SVID域則處于配置空間的后面,屬于對設備追加確認的部分,這兩個信息可定義為“00000000h”(即無Subsystem ID)。其它比較重要的還有:Command和Status域—分別給出了對PCI設備的控制命令和當前狀態、Base Address Register域—指示此PCI設備按I/O方式還是內存方式進行讀寫以及需要的地址空間大小、Interrupt Line和Interrupt Pin域—分別指明了設備使用的中斷號和中斷引腳。
從配置空間中前64個字節的分布情況來看,我們不難發現Windows系統對這6個ID識別代碼是連續并按順序來讀取的,即讀取的順序是VID→DID→RID→CC→SVID→SID。PnP-PCI連接檢測設備的基本過程如下:
1.系統BIOS自檢載入PCI驅動程序到內存,掃描主板PCI Bus(總線)及設備。其實這個PCI驅動是操作系統調用的一個PCI的初始化代碼(initial code),并非真正的設備驅動程序,以下我們統一稱為:PCI初始化代碼。
2.PCI初始化代碼,從PCI總線0開始通過讀取PCI槽位上所有PCI設備(包括PCI-PCI Bridge橋接設備)的Vendor ID和Device ID代碼,通過CC(Class Code)驗證設備是否存在(“000000h”表示Device不存在,即該插槽處于空閑狀態),并通過PCI BIOS代碼確認每個設備所占的槽位。最后,通過建立一個PCI_DEV數據結構,并把它鏈接到已知PCI設備的列表中。這就是對PCI設備身份確認的初始過程,稱之為Great IDS:創建身份。
3.PCI初始化代碼通過發現新硬件,進一步確認PCI設備的RID版本,是否存在SID/SVID,開始尋找匹配該設備的驅動程序INF安裝文件。
4.PCI初始化代碼通過設備驅動INF里的IDs代碼進行PCI設備的驅動安裝,并完成驅動在系統內的裝載。
5.PCI設備自身的驅動程序,在安裝過程中,根據驅動設定,進行特征設置。
6.PCI初始化代碼通知PCI設備進行安裝驅動后的初始值相關設定,操作系統根據設定提示重啟后對PCI設備狀態進行最終確認。
從上述PCI設備IDs身份確認的過程,我們可以看到位于最前端的VID和DID是最重要的兩個代碼,沒有這兩個代碼,或者和硬件驅動INF文件里的IDs代碼不符合,Windows系統將拒絕認證該設備并將該設備作為不可識別的設備或者拒絕安裝不符合IDs標識的驅動程序。這也是我們改造硬件的同時需要修改設備固件以及驅動程序中這兩個代碼的主要原因。
驅動程序中的IDs標示規則
為便于理解,下面我們統一將VID和DID分別稱為技術廠商ID和技術設備ID;將SVID和SID分別稱為制造廠商ID和制造設備ID。根據Windows系統技術規范,PCI設備驅動INF里的IDs命名標準為:“PCI\VEN_VID&DEV_DID&SUBSYS_SIDSVID”,即技術廠商IDs必須在前,制造廠商IDs在后,這是跟上述PnP-PCI連接檢測設備IDs的順序是一致的。其中,VID和DID用十六進制“0xAAAA”編碼,SIDSVID用十六進制的“0xAAAABBBB”編碼(表1)。
圖3和圖4分別是D_Link和聯想兩家公司生產的網卡驅動INF文件截圖。其中,由于D_LINK屬于技術廠家并且也是制造廠家,因此其驅動INF里的IDs標識中技術廠商IDs和SVID是一致的,只有SID有所區別;而在聯想網卡驅動的INF文件里,標識的技術廠商IDs和Subsystem ID均不是聯想公司,而是其他的2家公司,即表示聯想的這款網卡是被技術廠商授權的第三方廠商OEM制造的產品。
//P8A-1-6.jpg 圖6 DCN_550GT網卡DID、VID和SVID的查詢結果:授權技術廠商DID為“0x0022”,授權技術廠商VID為“0x1008”,制造廠商SVID為“0x1113”。///
從查詢結果來看,D_Link公司的網卡,VID和DID均為技術廠商D_Link system Inc公司所有;而聯想的網卡授權技術廠商DID和VID為National Semiconductor(美國國家半導體公司)所有,而制造廠商(OEM)的SVID(0x1113)為Accton Technology (下轉104頁)(上接97頁)Corporation(臺灣智邦科技公司)。從DID的查詢來看,不同廠商的設備(例如0x0022)可以同名,但通過唯一的VID則可以很容易區分各自的身份。這樣我們進一步證實了VID是唯一的廠商代碼,DID則跟隨VID進行確認。這也符合Windows對驅動進行選擇安裝的規范,即優先認證跟隨VID的DID/SID/SVID設備驅動。通過PCI IDs查詢,我們還能夠通過參照PCI設備的檢測信息,找到技術和制造廠家,從而安裝設備匹配的驅動程序。
通過上述分析和了解,我們再回頭看硬件DIY,就基本上能找到一個明確的思路。下面我們以ATI R3xx顯卡硬改為例,進一步闡述這個思路。目前硬改顯卡的一般思路就是連接硬件標識電阻,修改BIOS代碼,安裝原裝驅動,實現顯卡硬升級。
硬件標識電阻的修改,根據以往經驗,我們知道修改的是ASIC DID,即硬件ID。這個硬件ID必須要和BIOS中的Device ID同步改變才能實現改造目的。從圖7中可以看到,需要修改的關鍵值是Device ID,即設備ID,代碼為“4X4X”。例如我們可以將9800SE的代碼“4148”修改為9800的代碼“4E48”或者9800XT的代碼“4E4A”;與渲染管線相關的代碼,我們可以將其看做是DID代碼的附屬代碼,因為“4E48”或“4E4A”這個設備代碼中的“E”規定了8條渲染管線的存在,而“8”和“A”才是設備型號識別的代碼;而作為同一廠家的設備,其Vendor ID我們完全沒有必要修改。通過硬件ID和BIOS中DID代碼的成功修改,我們能實現顯卡設備ID的變更,使BIOS順利檢測VID和DID后,調用相應的RID和Class-Code進行進一步的設備身份確認。最后,進入系統調用具有同樣IDs識別代碼的INF文件,使之順利安裝設備驅動;如果硬件ID連接失敗或BIOS代碼修改錯誤,我們從BIOS刷新畫面中可以看到:ASIC DID和BIOS DID不相符合時,則只能調用設備原有或已知的RID和Class-Code確認。如果出現“414A”之類的非法DID,則由于ATI公司無此設備代碼,而被windows系統視作未知設備,并導致驅動無法安裝。
DIY中的IDs原理
寫在最后
在PC系統里將硬件IDs作為身份識別代碼,是符合標準化、簡易化,減少設備沖突和誤操作的一個必要途徑。只有認識這些身份代碼,我們才能讓各個PCI設備及周邊設備相安無事。通過對PCI IDs的認識,我們也能掌握硬件破解改造的關鍵,從而更科學、更安全地進行DIY嘗試
總結
以上是生活随笔為你收集整理的pci设备身份识别码介绍说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中的Character和char
- 下一篇: 【图神经网络】GNN从入门到精通