Linux下用memory方式訪問PCIE空間

來源:互聯網
上載者:User

標籤:

測試環境:Ubuntu 14.04LTS

在Windows下,我們 用RW everything很容易可以看到PCIE所有的config space,但是我們最近想在Linux下dump PCIE config space,首先我們嘗試用IO read的方式,

也就是通常我們會用CF8和CFC的方式,但是很遺憾這種方式只能讀出來256個位元組,那麼後面的0x100~0x1FF怎麼去讀,就是下面我們要解決的問題。

1,首先我們需要擷取PCIE在memory中的映射地址,我們看ACPI的手冊,會發現有一個MCFG的東西,官方解釋如下:

“MCFG” PCI Express memory mapped configuration space base address Description Table
PCI Firmware Specification, Revision 3.0
See the ACPI Link Document under the heading "PCI Sig".

也就是說MCFG裡面有儲存PCIE的基地址,這個的擷取方式,可以利用acpidump這個工具,如果沒有的話,需要先安裝

sudo apt-get install acpidump

成功之後,我們鍵入acpidump,會dump出來很多register的值,慢慢下拉我們會找到如下的


從PCI Firmware Specification Revision 3.0上面可以看到,MCFG的定義:


看到失眠的Configuration space base address allocation structure,位移地址是44,也就是0x2c,然後再參考Table4-3:


再回到acpidump讀出來的MCFG,PCIE的基地址就是F0000000,這個值不是固定的,在其他的機子上會有不同。

2,為了驗證上面的基地址就是PCIE的,我們需要寫一個簡單的程式,試試看。

[email protected]:/mnt/hgfs/LinuxTools/PCITools/pci_dump$ sudo ./pci_dump -m
The offset address value is 0xf0000000
The value at 0xf0000000 is 0x71908086

好的,我們讀出來memory address f0000000的低2個位元組是8086,所以基地址肯定沒有問題,之後就可以根據PCIE spec上的協議,組合PCIE 的Bus,Device,Function和Register的值來擷取對應地址的值了。

如果不放心上面的驗證,也可以通過lspci這個tool去讀下bus 0, device 0,funtion 0,register 0的值,進一步驗證下。






Linux下用memory方式訪問PCIE空間

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.