位址空間的歸納總結

2021-06-20 02:47:25 字數 2659 閱讀 1583

url:

下圖是程序位址空間、核心位址空間以及實體地址空間之間的聯絡,下面對幾大位址空間的聯絡進行闡述。

程序位址空間大家比較熟悉,很多人都知道通過虛擬記憶體機制,在32位平台上每個程序都可以獲得4gb大小的位址空間。在32位linux系統中,高1gb空間是每個程序共享的核心位址空間,0~3gb的空間是每個程序獨享的位址空間。程序位址空間通過頁表與實體地址空間建立聯絡,為了減少這種對映帶來的開銷損失,x86處理器硬體提供了tlb頁表cache。由於訪存具有很高的時空區域性性,因此tlb cache的命中率很高,為虛擬記憶體機制的工程應用奠定了基礎。從硬體上講,程序虛擬位址對映最重要的模組是mmu,只有擁有mmu的處理器才可以支援虛擬位址機制。從軟體上來講,虛擬位址最重要的是頁表管理。作業系統需要為虛擬記憶體建立頁表,當tlb cache miss的時候,處理器會產生中斷,然後進行頁表對映,並且載入頁表。在程序的使用者空間,很多時候也希望直接對pci的裝置記憶體空間直接進行操作,例如很多應用程式想直接操作顯示卡記憶體,獲得效能上的優勢。為了達到這種目的,需要將處理器域pci裝置記憶體位址對映至程序位址空間。在linux中提供了mmap函式實現io位址與虛擬位址之間的對映。這種對映本質上與物理記憶體的對映是一樣的,同樣需要建立頁表。

os核心位址空間佔據了3~4gb,共1gb大小的位址空間。其中,絕大部分位址(3g~vmalloc_end)都是通過線性對映的方式進行對映,起始的一段物理記憶體空間被直接對映至核心空間。因此,核心空間的這種線性對映的位址也稱為邏輯位址,這種位址無需頁表進行對映,實體地址和邏輯位址之間的轉換可以通過簡單的偏移運算即可完成。核心空間中也存在虛擬位址,這段位址空間為vmalloc_end~4gb。核心空間通過vmalloc函式為這段虛擬位址空間建立頁表,與物理記憶體建立聯絡。另外,在實際的系統中,除了物理記憶體之外,pci裝置同樣佔據處理器實體地址空間,核心空間想要訪問pci裝置記憶體時,需要通過ioremap函式將處理器域pci裝置記憶體位址對映到核心空間。這種對映與vmalloc的方式一樣,同樣需要建立頁表。我們可以看到,實際上,在32位linux中,虛擬位址空間不是很大,預設情況下只有幾百兆的空間。那麼,如果使用者想對映一塊非常大的pci裝置記憶體空間至核心,怎麼辦呢?我想如果使用者有這方面的需求,那麼只能通過調整vmalloc_end引數將虛擬位址空間擴大。另外,在arm嵌入式系統中,由於系統的記憶體資源有限,32位linux預留的核心空間位址足夠,而且物理記憶體通常會小於1gb,因此,pci實體地址空間往往會落在1gb以內。在這種情況下,pci裝置記憶體的對映可以採用核心空間邏輯位址對映的方式,直接通過偏移操作進行實體地址和io虛擬位址的轉換,而無需呼叫ioremap進行頁表操作(arm嵌入式系統中會定義_reg巨集實現虛實位址轉換)。

cpu實體地址空間理解上比較容易,就是處理器訪問記憶體的位址空間。但是,值得注意的是,處理器記憶體位址空間並非全部用於物理記憶體的訪問(dimm),其中有一部分用於訪問pci裝置位址空間。因此,如果處理器位址匯流排寬度為32位,擁有4gb位址空間,那麼,其中只有一部分位址是用於訪問物理記憶體的。因此,32位的位址匯流排無法支援4gb大記憶體。為了解決這個問題,intel和amd處理器在推出64位處理器之前採用了pae技術,即intel處理器將位址匯流排擴充套件到36位;amd處理器擴充套件到40位。在軟體的處理上,對頁表也進行了修改,實現32位虛擬位址與36/40位實體地址的對映。從上圖我們可以看出,當系統中安裝的物理記憶體比較少時,例如只安裝了1gb記憶體,那麼實體地址空間還會存在空閒位址,4gb的頂端位址空間會分配給pci裝置,並且pci裝置位址空間與物理記憶體空間沒有交叉。前幾年這樣的系統大量存在。但是,伴隨著物理記憶體的日益廉價,大記憶體的系統大量出現,例如很多系統都配備大於4gb的記憶體。這樣的系統會存在乙個問題:pci裝置位址和物理記憶體存在位址交叉,處理器無法訪問被pci位址空間覆蓋的物理記憶體。這也就在物理記憶體空間形成了乙個位址空洞,這個空洞通常被稱為pci hole。為了解決這個問題,晶元組提供了一組暫存器將被pci裝置位址覆蓋的那部分物理記憶體重新對映到其它位址空間,從而實現將這部分遺失的記憶體**。這種對映是通過硬體實現的。目前,在64位處理器上依然存在pci hole的問題,主要考慮到相容性的問題。未來如果把pci裝置位址空間直接放到64位位址空間的頂端,pci hole這個問題也就不存在了。

很多人在開發pci裝置的時候很疑惑,什麼是pci位址空間?pci位址和處理器位址是一回事嗎?其實在x86系統中,pci位址和處理器位址在數值方面是相同的,但是這兩個位址仍然屬於兩個不同的位址域。上面討論的實體地址所指的就是處理器域的實體地址,是站在處理器的角度來看待訪問位址的。pci位址不是站在處理器角度的位址,而是pci匯流排域的位址,是站在pci橋、pci裝置看到的位址。如上圖所示,pci匯流排域位址和處理器域位址是通過pci主橋(host或者complex)進行對映轉換的。位於處理器的軟體如果想訪問pci裝置,那麼直接採用處理器域的pci裝置位址,當然位於核心的驅動程式需要採用ioremap之後的虛擬位址進行訪問。位於裝置端的dma控制器需要進行資料傳輸時,需要採用pci匯流排域的位址。有趣的是,x86處理器對這兩個空間的位址進行等值對映,所以看到的值是相同的,但是powerpc則進行了線性對映,兩個值是不相同的。

這裡對計算機系統中的幾個位址進行了說明,希望對大家有所幫助,如有不對的地方請指正,在此謝過。

系統位址空間,PCI位址空間

1 系統位址空間與 pci 位址空間 1.1 pci 位址空間 pci 匯流排具有 32 位資料 位址復用匯流排,所以其儲存位址空間為 2的32次方 4gb 也就是 pci 上的所有裝置共同對映到這 4gb 上,每個 pci 裝置占用唯一的一段 pci 位址,以便於 pci 匯流排統一定址。每個 p...

c 的總結歸納

1.關於如何訪問類裡面的私有變數?答 可以通過類的public 成員函式類間接訪問。2.關於如何訪問類裡面的保護變數?答 方法和私有的一樣,區別在於保護的變數可以被派生類任何函式訪問。例 include using namespace std class box class smallbox box...

位址空間 位址生成

位址空間定義 邏輯位址生成 1 生成過程 1 編譯 高階語言 組合語言 2 彙編 組合語言 機器語言 5 例,乙個 c 程式中的函式位置 變數名是一種邏輯位址,將 c 語言編譯成組合語言,組合語言中依然使用變數和函式名等來進行編寫,將組合語言進行彙編形成 o 程式,o 程式的起始位址都是從 0 開始...