linux的高階記憶體分析

2021-05-28 10:03:21 字數 920 閱讀 9137

linux系統把896m以上的記憶體定義為高階記憶體。為什麼這麼做呢?

這是 因為linux系統的虛擬位址管理能力為4g,通常使用者空間虛擬位址為0~3g的空間,而核心空間虛擬位址為3g~4g的空間。 實際上計算機系統的物理記憶體通常要多於1g,而核心空間則負責對所有物理記憶體進行管理,對使用者程序來說則是看不到物理記憶體位址的。

假如計算機的物理記憶體為2g,這2g的實體地址將會被核心和不同的使用者程序所占用。對核心來說如何把3g~4g這1g的線性位址和0~2g的實體地址對應起來是個問題。

於是linux採用了乙個折中的辦法,把896m實體地址空間的記憶體線性對映到3g~3g+896m這樣的虛擬位址空間中,這樣在進行位址轉換時可以很快將實體地址和虛擬位址之間進行轉換。但實際上這0~896m的實體地址並不能由核心獨享,而是要和使用者程序共享的,當然另一方面,核心也確實不一定就能消耗這麼多的記憶體。這樣以來,就出現了一種情況,對核心來說雖然分配給它的虛擬位址為3g~4g+896m,但實際上核心實際用到的空間則是這3g~4g+896m中的乙個個片段。未用的片斷對應的實體地址可能空閒,

也可能分配給了使用者程序。

當核心需要動態分配記憶體時,它會呼叫函式alloc_pages在物理記憶體0~896m的空間中找出一段連續的記憶體,然後直接進行線性對映變化為虛擬位址交給核心。這樣的處理簡單而方便,但限制是只能提供0~896m實體地址空間的物理記憶體。如果這部分的記憶體都已經占用了,就只能使用896m~2g空間的高階記憶體位址,怎麼辦呢?

linux在虛擬位址3g+896m~4g這段虛擬位址空間中保留了128m的虛擬位址,可以進行動態的對映,它首先把這部分虛擬位址空間分成一塊一塊並用vm_struct結構鏈進行記錄,如果有段虛擬位址空間沒有使用,那麼在需要的時候就可以從高階記憶體中找出若干離散的物理頁面,對映到未用到的虛擬空間,供核心使用。也就是它將3g+896m~4g虛擬位址動態對映到了896m~2g的物理記憶體空間。這段虛擬位址空間的特點是實體地址頁面不連續。

Linux高階記憶體

原先一直都對linux高階記憶體的管理認識模模糊糊的,可能主要是初次接觸linux kernel 是0.11版吧,當初的記憶體設計是16m,linus對擁有32m的記憶體都是覬覦萬分,1g記憶體恐怕是天方夜譚了。16m記憶體 還顧得上高階記憶體,腦子就一直沒有這種概念。先我們還是來看看為什麼要有高階...

Linux高階記憶體的由來

抱著拿來主義,自己挑選了部分,以下內容摘自網路。linux核心位址空間劃分 通常32位linux核心位址空間劃分0 3g為使用者空間,3 4g為核心空間。注意這裡是32位核心位址空間劃分,64位核心位址空間劃分是不同的。linux核心高階記憶體的由來 當核心模組 或執行緒訪問記憶體時,中的記憶體位址...

Linux高階 linux記憶體釋放

細心的朋友會注意到,當你在linux下頻繁訪問檔案後,物理記憶體會很快被用光,當程式結束後,記憶體不會被正常釋放,而是一直作為caching.這個問題,貌似有不少人在問,不過都沒有看到有什麼很好解決的辦法.那麼我來談談這個問題.先來說說free命令 root server free m total ...