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暫存器的結構:
pci 中的base address register*** - 信念和態度 - 奔向理想
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。
memory address map構造完成以後需要為裝置分配位址空間,此時就是把分配給裝置的起始位址寫入bar暫存器即可。
比如上面位乙個裝置分配1mb的空間,在0xff000000(4gb-16mb)的位置,那麼就把0xff000000寫入bar即可。
我們發現pci這種位址自然地要求位裝置分配的位址空間要跟bar定義的大小對齊,因此pci裝置的對映空間始終是跟bar的大小對齊的。
PCI BAR設定過程
最近因為工作需要用到pci裝置的bar內容,之前看了沒深刻印象,這裡整理一下。pci裝置有很好的可配置型和易操作性,這很大方面要歸功於其位址空間的可動態分配的特性。而動態分配位址空間就是依賴於bar base address register 實現的。bar是pci配置空間中從0x10 到 0x24...
設定網域名稱解析
網域名稱解析 網域名稱註冊後,您只是擁有了網域名稱的使用權,但無法通過網域名稱直接訪問您的 或作為電子郵箱字尾進行郵件收發。網域名稱解析是使用網域名稱訪問您的 或郵箱的必備環節。前提條件設定網域名稱解析 參照以下步驟,在雲解析dns控制台新增網域名稱並設定網域名稱解析 登入到 雲解析dns控制台 如...
網域名稱泛解析設定
接前一篇 mvc實現動態二級網域名稱 前面我們說道mvc如何實現動態二級網域名稱,其中也涉及到dns伺服器,也要做相應的泛網域名稱解析設定。所以我在這裡,就來說道說道泛網域名稱解析是怎麼回事。1 什麼是泛網域名稱解析 泛網域名稱解析是指將 網域名稱解析到同一ip。在網域名稱前新增任何子網域名稱,均可...