linux 核心學習 1 記憶體管理

2021-09-01 09:33:57 字數 1354 閱讀 2110

1 分頁機制

早期計算機直接使用實體地址進行記憶體的使用和管理,但是硬體資源有限,而且不同的程式需要使用不同的實體地址,這樣給程式的管理和執行造成了很大的難度,而且極易造成乙個程式覆蓋其他程式的問題,使正常執行的程式出現錯誤。

針對以上問題提出了使用虛擬位址與物理位址對映的管理方式,這樣每個程式都可以使用相同的位址,但是由於每個程序使用不同的葉表,所以使用不同的物理頁,這樣就可以解決以上的問題。

下圖為linux下分頁機制的實現原理,虛擬位址經過頁面目錄和頁表的查詢,找到頁實體地址,最後將偏移量合成為實體地址。

2 分段機制

其實分頁機制已經能夠滿足虛擬記憶體管理和保護模式的要求,現在的一些構架的處理器完全不使用分段機制。段機制是x86遺留的歷史問題。

下圖為分段機制原理圖,其實現核心是乙個全域性的描述符表gdt,這個表作用很大,比如每個程序都有乙個tss段,但是當前程序如果切換到另乙個程序,一定要使用到另乙個程序的tss段,由於使用不同的葉表,肯定無法相互訪問各自的位址空間,這個時候全域性描述符表解決了這一問題,他就像是乙個共享的位址空間,這樣就能很好的相互訪問了。

3  兩個機制的結合

有了新方法,但是也不能摒棄舊的,需要新舊結合,所以需要將兩個機制相互結合。

下圖為完整的位址轉換過程圖:

4 位址空間分配

虛擬位址空間由位址匯流排位數決定,現在的計算機大多是32位的。

32位也就是4g大小,linux中將0-3g的線性位址由使用者態程式使用,3g-4g的線性位址留給核心態使用。

雖然核心態只是用1g空間,但是它管理著整個實體地址空間,linux核心將實體地址分成3個區,zone_dma(0-16m),zone-normal(16-896m),zone_hightmem(896m - ~)。

zone_dma區用於dma裝置的對映,dma裝置可以不通過cpu將資料傳送的記憶體,這樣cpu可以處理其他事務,從而提高系統的效率。

zone_normal區為核心使用的區域,這個區主要被核心所使用,當然在使用者態出現缺頁時,也會在此區中分配物理頁。

zone_hightmen區,其實是乙個讓我開始很困惑的去,書上說他是高階記憶體,核心使用不到它,那豈不是1g以上的記憶體條也沒用,因為核心都夠不到,怎麼將它分配給程序使用,後來才明白什麼意思。核心使用不到zone_hightmen區意思是其實體地址不能被核心所使用,但是能夠被核心所操控,控制它對映給使用者態程式。使用者態程式在缺頁時首先在zone_htightmen區尋找頁,如果找不到就需要到zone_normal去尋找了,而核心在缺頁時只能在zone_normal裡尋找。

linux核心學習 記憶體管理

核心把物理頁作為記憶體管理的基本單位。32位系統 4k 頁 64位系統 8k 頁 由於硬體限制,核心不能對所有頁一視同仁。linux必須處理如下硬體存在的缺陷而引起的記憶體定址問題 linux主要使用了四種區 zone dma 這個區包含的頁只能用來執行dma操作 zone dma32 和zone ...

Linux 核心學習 4 記憶體管理

注 以下 有的是linux 5.10,有的是linux 2.6.30.4 1 arch x86 boot memory.c static void detect memory e820 void desc buf count while ireg.ebx count array size boot ...

linux核心學習筆記之記憶體管理

linux核心把物理頁作為記憶體管理的基本單位。每一頁的大小根據系統架構不同有所區別,32位系統下為4kb,64位系統下為8kb。記憶體管理單元 mmu 以頁為單位來管理系統中的頁表,負責虛擬位址到實體地址的轉換,使用者所使用的記憶體位址一般都是虛擬位址。核心中頁的結構體中比較重要的成員為 stru...