BAR基礎介紹請參考 【博文連載】PCIe基礎篇——BAR(Base Address Register)詳解
本節講解BAR的填充過程。
執行個體一:
請求一個4KB,non-prefetchable memory address space(NP-MMIO)過程一般需要系統軟體(BIOS/OS)操作下圖1的三步。
表1 Results of Reading the BAR after Writing All Is To It
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9UleOdXTU5UeNRVT3V1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3IDOzIDMwcTM3ADOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
圖1 32-Bit Non-Prefetchable Memory BAR Set Up
步驟1:如圖中(1)所示,未初始化的BAR的低比特(11~4)都是0,高比特(31~12)都是不确定的值。所謂初始化,就是系統軟體(BIOS/OS)向整個BAR都寫1,來确定BAR的可操作的最低位是哪一位。目前可操作的最低位為12,是以目前BAR可申請的(最小)位址空間大小為4KB(2^12)。如果可操作的最低位為20,則該BAR可申請的(最小)位址空間大小為1MB(2^20)。
步驟2:如圖中(2)所示,完成初始化(寫1操作)之後,系統軟體(BIOS/OS)便開始讀取BAR的值,來确定每一個BAR對應的位址空間大小和類型。其中操作的類型一般由最低四位所決定,具體如上圖右側部分所示。
步驟3:如圖中(3)所示,系統軟體(BIOS/OS)向BAR的高比特寫入位址空間的起始位址(Start Address)。如圖中所示,為0xF9000000。
執行個體二:
請求一個64MB,prefetchable memory address space(P-MMIO)過程同樣需要系統軟體(BIOS/OS)操作下圖1的三步。
表2 Results of Reading the BAR after Writing All Is To It
圖2 64-Bit Prefetchable Memory BAR Set Up
步驟仍然是上面的三步,不再贅述。
執行個體三:
請求一個IO位址空間的例子
圖3 IO BAR Set Up
表3 Results of Reading the BAR after Writing All Is To It
注1:需要特别注意的是,系統軟體(BIOS/OS)對BAR的檢測與操作(Evaluating)必須是順序執行的,即先BAR0,然後BAR1,……,直到BAR5。當軟體檢測到那些被硬體設定為全0的BAR,則認為這個BAR沒有被使用。
注2:無論是PCI還是PCIe,都沒有明确規定,第一個使用的BAR必須是BAR0。事實上,隻要設計者原意,完全可以将BAR4作為第一個BAR,并将BAR0~BAR3都設定為不使用