PCI BAR設定過程

2021-08-21 17:58:24 字數 1454 閱讀 7318

最近因為工作需要用到pci裝置的bar內容,之前看了沒深刻印象,這裡整理一下。

pci裝置有很好的可配置型和易操作性,這很大方面要歸功於其位址空間的可動態分配的特性。而動態分配位址空間就是依賴於bar(base address register)實現的。

bar是pci配置空間中從0x10 到 0x24的6個register,用來定義pci需要的配置空間大小以及配置pci裝置占用的位址空間。

每個pci裝置在bar中描述自己需要占用多少位址空間,bios通過所有裝置的這些資訊構建一張address map,描述系統中資源的分配情況,然後在合理的將位址空間配置給每個pci裝置。這裡主要分為幾個部分描述:

這個是根據pci裝置的需求而不同的,這個對映空間不同於配置空間,一般想網絡卡等裝置占用較大的位址空間,而一些串列埠等裝置占用較少的位址空間,而我們知道x86中位址空間又mem和io兩類,因此pci 的bar在bit0來表示該裝置是對映到memory還是io,bar的bit0是readonly的,也就是說,裝置暫存器是對映到memory還是io是由裝置製造商決定的,其他人無法修改。

下圖是bar暫存器的結構:

bit0:表示裝置暫存器是對映到memory(0)還是io(1)空間。

bit1:  reserved 0

bit2: 在base adress register for memory 中0表示32位位址空間,1表示64位位址空間。

bit3:在memory bar中用來表示該裝置是否允許prefetch,1表示可以預取,0表示不可以預區。

其餘的bit用來表示裝置需要占用的位址空間大小。

bar通過將某些位設定為唯讀,且0來表示需要的位址空間大小,比如乙個pci裝置需要占用1mb的位址空間,那麼這個bar就需要實現高12bit是可讀寫的,而20-4bit是唯讀且位0。位址空間大小的計算方法如下:

a.向bar暫存器寫全1

b.讀回暫存器裡面的值,然後clear 上圖中特殊編碼的值,(io 中bit0,bit1, memory中bit0-3)。

c.對讀回來的值去反,加一就得到了該裝置需要占用的位址記憶體空間。

bios將系統中所有的pci裝置需要的位址空間大小讀出來,然後計算得到一張address map。

bios可以為裝置預留大於bar要求的位址空間,而pci規範中建議為需要的位址空間少於4kb的裝置分配4kb的位址空間。

對映到io空間的裝置每個bar不能占用大於256byte,在x86系統中io編址是16位的,此時bar中的高16bit需要hardware to zero。

2. memory address map構造完成以後需要為裝置分配位址空間,此時就是把分配給裝置的起始位址寫入bar暫存器即可。

比如上面位乙個裝置分配1mb的空間,在0xff000000(4gb-16mb)的位置,那麼就把0xff000000寫入bar即可。

我們發現pci這種位址自然地要求位裝置分配的位址空間要跟bar定義的大小對齊,因此pci裝置的對映空間始終是跟bar的大小對齊的。

PCI BAR設定解析

pci裝置有很好的可配置型和易操作性,這很大方面要歸功於其位址空間的可動態分配的特性。而動態分配位址空間就是依賴於bar base address register 實現的。bar是pci配置空間中從0x10 到 0x24的6個register,用來定義pci需要的配置空間大小以及配置pci裝置占用...

AWS設定過程記錄

rpm相關命令 rpm qa 查詢所有軟體包 rpm q 包名稱 查詢指定名稱軟體包是否安裝 rpm qi 包名稱 查詢指定名稱軟體包的詳細資訊 rpm ql 包名稱 查詢指定名稱軟體包包中所包括的檔案列表 rpm qf 包名稱 查詢指定檔案所屬的軟體包 rpm qpi 包名稱 查詢指定rpm包檔案...

SAMBA設定全過程

設定 etc samba b.conf netbios your host name workgroup workgroup security user username map yes 1 新增系統帳號 useradd hypoz useradd redhat 2 新增samba使用者和密碼 bp...