Intel CPU 地址空間總結

一、地址空間映射

       這裏要說的是Intel構架下的CPU地址空間佈局,注意這裏沒有說是內存地址空間佈局。

       我們說的內存通常是指DRAM,DRAM相對於CPU也可以算是外部設備,CPU地址空間是CPU訪問外部設備過程中的一個概念,CPU除了訪問DRAM外還會訪問許多其他的設備。可以粗略的認爲CPU地址空間包含DRAM地址空間,但兩者卻是不同的概念。而且DRAM地址空間是由內存控制器直接訪問的,由CPU間接訪問的


       過去很長一段時間Intel CPU是32位的,也就是可以訪問到4GB的地址空間,但是當時的DRAM通常也就是512MB到2GB之間,現在假設DRAM是1GB,那麼就是3GB的地址空間是空的。在計算機裏面,地址也是資源。這空的地址空間就用來訪問外部設備IO所用,這部分被稱爲MMIO(Memory Mapped I/O)。MMIO的空間是很大的,它包含了PCI的配置空間(256MB或者更大),內置集成顯存(256MB,或者更大),還有其他很多東西 。所以這部分的大小是不容忽視的。


       現在的Intel CPU一般都是36位的,也就是可以訪問到64GB。而DRAM也是越來越大,以至於DRAM加上MMIO的空間超出了4GB,而MMIO的空間是不能隨意變更的。所以現在的做法就是將DRAM的一部分重映射到4GB以上的空間,下面就以DRAM有5GB爲情況,做一個例子。請看下圖
                                  

     上圖中左邊是地址空間,右邊是DRAM空間,其中紅色的字體表示寄存器,可以在spec中找到該寄存器的說明,這幾個寄存器決定了整個地址空間的大的格局。這裏就簡要說明一下。

      TOLUD,指向32位地址,也就是4GB以內。它是一個分界線,在0-TOLUD之間爲DRAM,TOLUD-4GB之間爲MMIO空間。該值由BIOS指定。爲了方便說明,假設TOLUD被指定爲2GB。

      TOM,目前還不明確,我猜想應該是指實際物理內存的大小,“the total amount of populated physical
memory”,比如上圖TOM爲5GB。可在本機的BDFR(0,0,0,A0)驗證。

      REMAPBASEREMAPLIMIT,也是36位,分別表示基址和上限地址。用於重映射DRAM中被MMIO遮住的一部分空間,有2GB。該圖中將DRAM中遮住的部分重映射到TOM的上方,所以REMAPBASE爲5GB,REMAPLIMIT爲7GB-1。

      TOUUD,36位地址,大小爲REMAPLIMIT+1的位置,比如上圖TOUUD應該在7GB的位置,可以和TOLUD做對比理解,TOLUD是4GB以內DRAM與MMIO的分界線,TOUUD可以理解爲4GB-64GB之間DRAM與MMIO的分界線。


      以上是假設DRAM超出4GB的情況,假如DRAM只有3GB,而TOLUD指定爲2GB呢?也就是2GB-3GB的DRAM被遮住。這時也是通過REMAPBASE和REMAPLIMIT將之重定向到4GB的上方。再假設DRAM只有2GB,TOLUD爲2GB呢?這時就不存在重映射。 REMAPLIMIT小於REMAPBASE時(通常REMAPLIMIT爲0),表示不使用重映射。


      關於4GB以上的空間是如何訪問的,請查看該網頁說明:

      http://en.wikipedia.org/wiki/Physical_Address_Extension

 

二、地址空間佈局


     這裏着重說明4GB以下的地址空間的佈局情況。下面是我用visio畫的佈局圖,其實也就是將spec裏說明的佈局情況全部綜合到一張圖上,這也是前段時間總結出來的核心部分。

                            

       同樣的圖中紅色字體部分爲寄存器,這些寄存器與地址空間佈局有着密切的關係。這些寄存器的詳細說明可以參考spec。比如說“Egress Port Registers”這個4KB的窗口,會根據EPBAR的設置被放置到MMIO的任意一個DMI Interface的位置,但讓該窗口不能與其他任何窗口重疊。

 

       另外我也將我所瞭解的情況說明一下。


      1.先看TOLUD-4GB的位置,可以看到有幾處都是DMI Interface(Subtractive Decode)。DMI是南橋與北橋的接口,訪問DMI,也就是訪問南橋。

      另外要解釋的是Substactive decode,在計算機中地址譯碼有三種形式,當主設備通過指定地址訪問總線上的從設備,一個是Positive decode,有從設備解碼後發現是訪問自己的,於是它就會響應,否則就沒有從設備響應;一個是Negative decode,從設備收到該地址經解碼後發現不屬於自己的地址範圍,從設備就轉發出去;一個是Subtractive decode,在4個時鐘週期內沒有從設備響應,該地址就會發送到擴展的總線上面解碼。

                          

                          引自:http://www.microsoft.com/whdc/system/bus/pci/default.mspx

       DMI Interface(Subtractive Decode)的意思就是CPU發送一地址先到北橋上解碼,如果該地址沒有北橋上的設備佔用,那麼就用該地址就會被傳送到南橋上解碼,,也就是訪問南橋上的設備。可以假想爲一開始4GB空間都是DMI Interface(Subtractive Decode),然後0-TOLUD被DRAM聲明佔用,TOLUD-4GB也紛紛被各種設備佔用,於是就剩下了支離破碎的幾個DMI Interface。(目前看上去這樣理解是通順的,但我希望它也是正確的)。

 

     2.再來說明一下High BIOS。BIOS固件地址分三段,這裏的High BIOS,後面的System BIOS,還有後面的Extended System BIOS。spec中已經說明,計算機啓動後一開始執行的指令就在High BIOS中。然而High BIOS在4GB的位置,計算機reset後進入的是實模式。Intel構架下一開始段地址隱藏的高位部分全部爲1,所以儘管第一條指令的邏輯地址是F000:FFF0,但訪問的物理地址是FFFF_FFF0,這個地址比4G少16字節,因此,BIOS一般在此處只放置一條跳轉指令,遠跳轉或近跳轉,在EFI BIOS中,正是通過一條近跳轉讓BIOS不用進入實模式,直接建立描述符表,最終進入Flat Mode(屬於保護模式)。關鍵的地方在於地址空間中640KB-1MB(PAM0-PAM6)之間是可編程的,可以指定爲只讀、只寫、讀寫、禁用,這些都是針對DRAM的。開機之後這段空間是被禁用的,而DRAM是北橋的設備,禁用DRAM,那麼這段地址空間就是發送到南橋去解碼(對照上面關於DMI Interface的說明來解釋),結果就解碼到了High BIOS對應的固件上面。所以終究還是在High BIOS中執行指令。

     可以用RW驗證將PAM0(PCI 0/0/0 90H)的bit[5:4]設置爲00,那麼就發現, 0F0000-0FFFFF之間的數據與FFFF_0000-FFFF_FFFF之間的數據竟然是一樣的。也證明在DRAM禁用的情況下,兩部分地址是被解碼到同一個地方的。

     假如PAM0被設爲只讀或者讀寫,則讀取的是DRAM上的信息,數據內容是System Bios。爲什麼System Bios明明在固件中卻跑到DRAM中來呢?shadow的時候,只是北橋在負責地址decode,把這段地址指向了rom而不是把rom裏面的數據copy到了DRAM裏面。這是概念上的問題。實際上,BIOS在做的時候一般都是先把rom裏面的數據copy到低端內存,(0~640K)中的某一個或者兩個段裏面,然後再解壓縮出來的數據分別放到對應的segment裏面去。比如E000,F000等。然後再把整個map關掉。讓地址decode的時候對應的是實際的DRAM而不是ROM了。

 

      3.接着說一下PCI配置空間。可以看到它的基址是由PCIEXBAR決定的,用RW軟件驗證PCI數據可以用Memory的方式看到。各個PCI的地址空間可以用這個式子計算:PCI Express Base Address + Bus Number x 1 MB +Device Number x 32 kB + Function Number x4 kB。打一個比方,我的電腦的PCIEXBAR中看到基址爲F400_0000,當我要訪問bus(0)device(1F)function(3)時,通過計算可以得到地址爲F40F_B000,於是從PCI 0/1F/3中看到的數據與從Memory的F40F_B000位置看到的數據是一樣的。注意查看的時候要將PCIEXBAR的bit0置1。

PCIEXBAR—PCI Express Register Range Base Address
B/D/F/Type: 0/0/0/PCI
Address Offset: 60-67h
Default Value: 00000000E0000000h
Access: RO, R/W/L, R/W/L/K
Size: 64 bits

 

     4.要說明的大概就這些,其他的各種地址窗口的作用、地址空間的位置,都可以在spec中很輕易地找到。而且圖中也標註了各個區間有關的寄存器。

 

原文鏈接:

http://www.biosren.com/viewthread.php?tid=3200&extra=&ordertype=1&page=1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章