1. 程式人生 > >linux核心的high memory概念詳解

linux核心的high memory概念詳解

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大小為0xC0000000.但是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的也很大),完全能夠直接對映全部實體記憶體。