(轉)詳談高端內存和低端內存


一、高端內存和低端內存的划分

     Linux物理內存空間分為DMA內存區(DMA Zone)、低端內存區(Normal Zone)與高端內存區(Highmem Zone)三部分。DMA Zone通常很小,只有幾十M,低端內存區與高端內存區的划分來源於Linux內核空間大小的限制。

 

 

二、來源:

過去,CPU的地址總線只有32位, 32的地址總線無論是從邏輯上還是從物理上都只能描述4G的地址空間(232=4Gbit),在物理上理論上最多擁有4G內存(除了IO地址空間,實際內存容量小於4G),邏輯空間也只能描述4G線性地址空間。

為了合理的利用邏輯4G空間,Linux采用了31的策略,即內核占用1G的線性地址空間,用戶占用3G的線性地址空間。所以用戶進程的地址范圍從0~3G,內核地址范圍從3G~4G,也就是說,內核空間只有1G的邏輯線性地址空間。

如果Linux物理內存小於1G的空間,通常內核把物理內存與其地址空間做了線性映射,也就是一一映射,這樣可以提高訪問速度。但是,當Linux物理內存超過1G時,線性訪問機制就不夠用了,因為只能有1G的內存可以被映射,剩余的物理內存無法被內核管理,所以,為了解決這一問題,Linux把內核地址分為線性區和非線性區兩部分,線性區規定最大為896M,剩下的128M為非線性區。從而,線性區映射的物理內存成為低端內存,剩下的物理內存被成為高端內存。與線性區不同,非線性區不會提前進行內存映射,而是在使用時動態映射。

三、例子

假設物理內存為2G,則低段的896M為低端內存,通過線性映射給內核使用,其他的1128M物理內存為高端內存,可以被內核的非線性區使用。由於要使用128M非線性區來管理超過1G的高端內存,所以通常都不會映射,只有使用時才使kmap映射,使用完后要盡快用kunmap釋放。

對於物理內存為1G的內核,系統不會真的分配896M給線性空間,896M最大限制。下面是一個1.5G物理內存linux系統的真實分配情況,只有721M分配給了低端內存區,如果是1Glinxu系統,分配的就更少了。

MemTotal   1547MB

HighTotal     825MB

LowTotal     721MB

申請高端內存時,如果高端內存不夠了,linux也會去低端內存區申請,反之則不行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM