32位的cpu,最大定址範圍為2^32 - 1也就是4g的線性位址空間。linux簡化了分段機制,使得虛擬位址與線性位址總是一致的。linux一般把這個4g的位址空間劃分為兩個部分:其中0~3g為使用者程式位址空間,虛位址0x00000000到0xbfffffff,供各個程序使用;3g~4g為核心的位址空間,虛擬位址0xc0000000到0xffffffff, 供核心使用。(注意,arm架構不是3g/1g劃分的,而是2g/2g劃分。這裡以3g/1g劃分作講解)。如下圖所示:
可以看出,每個程序都有自己的私有使用者空間(0-3gb),這個空間對系統中的其他程序是不可見的。最高的1gb核心空間則由則由所有程序以及核心共享。可見,核心最多定址1g的虛擬位址空間。
linux 核心採用了最簡單的對映方式來對映物理記憶體,即把實體地址+page_offset按照線性關係直接對映到核心空間。page_offset大小為0xc000000.但是linux核心並沒有把整個1g空間用於線性對映,而只映**最多896m物理記憶體,預留了最高端的128m虛擬位址空間給io裝置和其他用途。
所以,當系統物理記憶體較大時,超過896m的記憶體區域,核心就無法直接通過線性對映直接訪問了。這部分記憶體被稱作high memory。相應的可以對映的低端物理記憶體稱為low memory.
而對於2g/2g劃分的arm機器,這個線性對映空間就可能達到1g以上,能夠直接對映到這個線性空間的實體地址是dma zone和normal zone,在這個範圍之外的物理記憶體則劃歸high memory zone。
結論:1)high memory針對的是物理記憶體,不是虛擬記憶體。
2)high memory也是被核心管理的(有對應的page結構),只是沒有對映到核心虛擬位址空間。當核心需要分配high memory時,通過kmap等從預留的位址空間中動態分配乙個位址,然後對映到high memory,從而訪問這個物理頁。high memory對映到核心位址空間一般是暫時性的對映,不是永久對映。
3)high memory和low memory一樣,都是參與核心的物理記憶體分配,都可以被對映到核心位址空間,也都可以被對映到使用者位址空間。
4)物理記憶體<896m時,沒有high memory,因為所有的記憶體都被kernel直接映**。
5)64位系統下不會有high memory,因為64位虛擬位址空間非常大(分給kernel的也很大),完全能夠直接對映全部物理記憶體
Linux 記憶體管理之highmem簡介
一 linux核心位址空間 一般來說linux 核心按照 3 1 的比率來劃分虛擬記憶體 x86等 3 gb 的虛擬記憶體用於使用者空間,1gb 的記憶體用於核心空間。當然有些體系結構如mips使用2 2 的比率來劃分虛擬記憶體 2 gb 的虛擬記憶體用於使用者空間,2 gb 的記憶體用於核心空間,...
linux核心測試 Linux核心測試的生命週期
linux核心測試 在針對linux核心的持續整合測試中 我寫了關於 持續核心整合 cki 專案及其更改核心開發人員和維護人員工作方式的使命。本文深入 了該項目的更多技術方面以及所有部分如何組合在一起。核心中每一項令人興奮的功能,改進和錯誤都始於開發人員提出的更改。這些更改將出現在不同核心儲存庫的大...
Linux核心 了解Linux核心搶占
目錄 無強制搶占 可搶占核心 自願核心搶占 完全實時搶占 在配置linux核心時,我們可以設定一些影響系統行為的引數。您可以使用不同的優先順序,排程類和搶占模型。了解並選擇正確的引數非常重要。在這篇文章中,我將介紹不同的搶占模型,以及每種模型如何影響使用者和核心行為 如果配置核心 使用make me...