1. 程式人生 > >PCI、PCIE配置空間的訪問(MCFG,Bus,Device,Funtion)

PCI、PCIE配置空間的訪問(MCFG,Bus,Device,Funtion)

一般來說,在x86平臺上,有兩大類方式可以訪問這一區間的暫存器,

1,配置機制1#或者配置機制2#

訪問時藉助in/out指令。請注意,這種方式有別於一般的in/out指令訪問PCI的IO空間,它引入了地址埠和資料埠。 配置機制2#只在某些特定的主機板上被使用。 新的設計應使用配置機制1#來產生配置空間的物理操作。這種機制使用了兩個特定的32位I/O空間,即CF8h和CFCh。這兩個空間對應於PCI橋路的兩個暫存器,當橋路看到CPU在區域性匯流排對這兩個I/O空間進行雙字操作時,就將該I/O操作轉變為PCI匯流排的配置操作。暫存器CF8h用於產生配置空間的地址(CONFIG-ADDRESS),暫存器CFCh用於儲存配置空間的讀寫資料(CONFIG-DATA)。 
將要訪問配置空間暫存器的匯流排號、裝置號、功能號和暫存器號以一個雙字的格式寫到配置地址埠 (CF8H-CFBH),接著執行配置資料埠 (CFCH)的讀和寫,向配置資料口寫資料即向配置空間寫資料,從配置資料口讀資料即從配置空間讀資料。

2, 記憶體對映

訪問時藉助mov指令,就如訪問常規的實體記憶體一樣。 PCI配置空間的暫存器被編址到系統的實體記憶體空間,在支援ACPI規範x86系統上,作業系統通過讀MCFG表獲得系統中所有裝置PCI配置空間的基地址。作業系統在引導時,列舉PCI裝置,從而知道每個PCI裝置的Bus, Device, Function號有了BDF這三個編號,加上從MCFG中得到的基地址,就可以計算出給定裝置的PCI配置空間在實體記憶體空間的地址。
那麼,x86上,這兩種訪問方式的用途和區別在哪裡呢?
  • 首先,配置機制#1只能訪問[0-255]偏移之間的暫存器,也就是標準的PCI配置空間的暫存器。對於擴充套件PCI配置空間的暫存器[256-4095],只能使用記憶體對映方式訪問。
  • 其次,配置機制#1一般用於作業系統引導時列舉PCI裝置階段,此時系統嘗試在BDF的編址空間內對每個可能的BDF來讀取PCI配置空間的暫存器,當能成功讀取,則認為裝置存在,當返回全1的錯誤碼,則認為改裝置不存在。顯然,記憶體對映方式是無法在此階段使用的,因為你可以用配置機制#1來訪問不對應實際物理裝置的BDF,因為這時最壞情況是得到全1的錯誤碼。但用記憶體對映方式這樣做時,訪問不存在的實體地址會產生一個異常。
  • 最後,某些legacy的PCI裝置或者橋片本身就不支援記憶體對映方式,所以此時配置機制#1是訪問PCI配置空間的唯一選擇。
通過RW軟體可以讀取MCFG的基地址:
圖1 同時我們也可以看到B0D2F0的暫存器的值:
圖2 然後,通過基地址F8000000和B0D2F0,按照PCIE cofigration space地址規範,可以得到地址為F8010000,我們可以通過Dumphys軟體讀出來改實體地址的值:

圖3 讀取的值為07 04 90 00,跟圖2中的資料可以對應上。

相關推薦

PCIPCIE配置空間訪問MCFGBusDeviceFuntion

一般來說,在x86平臺上,有兩大類方式可以訪問這一區間的暫存器, 1,配置機制1#或者配置機制2# 訪問時藉助in/out指令。請注意,這種方式有別於一般的in/out指令訪問PCI的IO空間,它引入了地址埠和資料埠。 配置機制2#只在某些特定的主機板上被使用

讀寫pcie配置空間安裝lib庫

readme.txt + pcie.c + in.txt +Makefile  可參考原始碼是: lspci readme.txt Please open the terminal in your linux system, then: 1.Please install

PCIe配置空間PCI裝置中的暫存器

1、訪問PCI配置空間,PCI基本配置空間的讀寫使用下列函式: 原型定義在<linux/pci.h> int pci_read_config_byte(struct pci_dev *pdev, intwhere, u8 *val); int pci_read

linux驅動---用I/O命令訪問PCI匯流排裝置配置空間

PCI匯流排推出以來,以其獨有的特性受到眾多廠商的青睞,已經成為計算機擴充套件匯流排的主流。目前,國內的許多技術人員已經具備開發PCI匯流排介面裝置的能 力。但是PCI匯流排的程式設計技術,也就是對PCI匯流排裝置的操作技術,一直是一件讓技術人員感到頭疼的事情。PCI匯流排程

通過httphttps域名訪問靜態網頁nginx配置負載均衡nginx配置

很多場景下需要可以通過瀏覽器訪問靜態網頁,不想把伺服器ip地址直接暴露出來,通過nginx可以解決這個問題。 實現http域名訪問靜態網頁 1.域名解析配置(本文都是以阿里云為例,其他平臺,操作步驟類似) 進入阿里雲的域名解析頁面,配置域名指向的伺服器地址(記錄型別選擇A,記錄值填寫伺服器ip,記得把伺服器的

arcsde 連線oracle ,配置空間資料庫附帶史上最全oracle安裝步驟

想好好的來一次排版,讓大家看的舒服我也寫的舒服,可是一到寫的時候,又不知道如何去下手。。。算了直接一步步來吧。                  加油!你是最土的~~ 首先我們要進行準備工作,那就是先裝

Linux PCI/PCI-E裝置配置空間讀取與修改

1 前言 PCI和PCI Express,是計算機常使用的一種高速匯流排。作業系統中的PCI/PCI-E裝置驅動以及作業系統核心,都需要訪問PCI及PCI-E配置空間。PCI/PCI-E裝置的正常執行,離不開PCI/PCI-E配置空間。通過讀寫PCI/PCI-E配置空間,可以更改裝置執行引數,優化裝置執行。本

OPENSTACK-210-5-配置SSH訪問Configure SSH access

1.配置浮動IP,先從public池分配一個ip地址,然後再將這個ip地址與內部web地址相關聯。注意這裡隨機分配的地址172.25.250.135。 2.在director機器上,測試172.25.250.135,可以使用金鑰對key1.pem進行SSH登

Android Studio eclipse配置模擬器AVD存放路徑預設在c盤解決c盤空間不夠問題

Android Studio 安裝之後,預設的會給我們建立一個 Nexus 的模擬器, 這個模擬器的映象檔案放在了 C:\Users\Administrator\.android  中 其中的a

13基因組的拼接原理轉載沈夢圓的博客

學習 jpg 知識 general arch fly 技術分享 重復 prot 最近學習了一下基因組的拼接原理,以下是我的學習筆記和一些思考。基因組的拼接原理是高通量測序技術的基礎知識吧,我個人認為即使不做基 因組拼接工作,也可以學習一下幾個主流拼接軟件的算法和原理。我主要

centos7 配置虛擬交換機物理交換機truck端口設置使用brctl

不同 yum 串口 company 網橋 any grep 接口 設備 轉自:http://blog.csdn.net/qq_21398167/article/details/46409503 虛擬交換機配置 inux VLAN配置(vconfig) 安裝

配置動態PATport address translation網絡地址轉換

generate nbsp stat ica asdm ado 驗證 ip add acl 思路與配置1.配置R1 2.配置雲 interface GigabitEthernet0 nam

mysql索引主鍵唯一索引聯合索引的區別索引的建立原則和注意事項

索引對資料庫效能的影響? 本質:縮小查詢範圍。大大減少需要掃描的資料量。大大提高查詢的速度,降低寫的速度,佔用磁碟。將隨機I/O變成順序I/O 特大的表怎麼解決查詢問題? 分割槽。 主鍵索引和唯一索引的區別? 一個表只能有一個主鍵索引,但可以有多個唯一索引, 主鍵索引是唯一索

returnbreakcontinue三者的區別轉載只為查閱方便若有侵權立刪

前言 一般剛開始遇到這三個關鍵字,都會有點亂,return還好,特別是break和continue,特別容易搞混,所以這裡記錄一下 正文  1、return :直接跳出當前的方法,返回到該呼叫的方法的語句處,繼續執行    2.  &nbs

setprecisionfixedshowpoint的用法總結經典!!超經典!!

首先要加標頭檔案:iomanip 一:setprecision   作用:控制輸出流顯示浮點數的數字個數,setprecision(n)就是輸出的n個數,會有四捨五入。 比如:double s=20.7843000, cout<<setprecisio

Jrebel外掛的啟用與熱部署配置詳細教程附最新可用Jrebel啟用碼地址

寫在前面的話 JRebel是一款JAVA虛擬機器外掛,它使得JAVA程式設計師能在不進行重部署的情況下,即時看到程式碼的改變對一個應用程式帶來的影響。 針對Eclipse,MyEclipse, STS等開發工具 1 Jreble的離線配置 1.1 Jreble配置項的

springboot不同環境不同配置的實現開發環境和生產環境的切換

首先,是我實現的最終效果圖可以看到這裡配置了3個application,其中第一個是總的配置,第二個是開發環境,第三個是生產環境。總的配置總是會生效的,而另外兩個配置生效的條件,則要看看我們在總的配置裡配置了什麼,比如這裡,我在application.yml裡配置了開發環境s

Ubuntu16.04下安裝Cmake-3.8.2併為其配置環境變數還介紹了其他三種方法

下載安裝包 這裡,我下載的是比較新的cmake-3.8.2-Linux-x86_64.tar.gz 解壓安裝包 將壓縮包的檔案提取到比較合適的位置後,就是配置環境變量了,這一點最關鍵,因為本身官方的二進位制包不需要我們手動去編譯安裝了,解壓即安裝。

nessus安裝msfconsole輔助模組使用網安全實訓第三天

本期內容:nessus安裝、msfconsole輔助模組使用、後滲透攻擊 1. nessus安裝 2.msfconsole輔助模組使用 3.後滲透攻擊 1. nessus安裝 (1)下載nessus 我下載的Nessus-7.1.0-x64

配置OpenCV環境win764位+opencv3.3+cmake3.9.1

1、準備工作   配置好VC++的編譯環境(在安裝時注意勾選C++的相關選項),通常我們使用VS系列的編譯軟體,總之不論使用哪個版本的VS,先安裝完成。          在http://opencv.org/下載OpenCV的安裝包(本次安裝的是OpenCV3.3的版