標籤:
測試環境: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空間