INT的核心筆記 Linux核心記憶體空間布局研究

2021-10-08 00:26:02 字數 1420 閱讀 9702

從上面的頁表設定可以看出:

很容易可以想到最簡單的解決方法:

在很早期的時候,確實就是這樣做的。

但是在32位時代,核心的虛擬空間只有1g,也就是說全部都進行線性對映的話,

核心只能使用1g物理記憶體,但是我們也知道就是32位時代,其實物理記憶體很多也不止4g了,

而且cpu後面也相應支援。

但是,虛擬位址空間還是只有4g,核心還是只有1g,如果還是進行直接線性對映的話,

核心根本沒辦法享受這個福利,原因很簡單:

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-gthtdy04-1594714031611)(c:\users\rayint\desktop\workplace\rayblog\linux學習\頁表研究\pic1.png)]

那該怎麼辦呢?也很簡單,抽出乙個部分核心虛擬空間,像使用者虛擬空間那樣進行非線性對映就行了:

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-fbwfyfe1-1594714031614)(c:\users\rayint\desktop\workplace\rayblog\linux學習\頁表研究\pic2.png)]

可以設想那樣的操作:

這樣就可以用很小的核心虛擬空間,操作大很多的物理空間;

有了上面的鋪墊,高低端記憶體是什麼就很容易說明了。

沒錯,高低端記憶體是核心虛擬空間中的劃分:

但請注意,

就如上一節所說那樣,這是因為在32位架構下,核心虛擬空間實在太小了,

所以抽出了一部分作為高階記憶體,以達到操作大於1g物理記憶體的效果。

在64位核心虛擬空間足足有512g,

高階記憶體這個概念,一般來說在64位核心中應該不存在。

但64位核心核心還是存在動態對映空間的。

引自linux記憶體描述之高階記憶體–linux記憶體管理(五)

在x86架構中,三種型別的區域(從3g開始計算)如下:

區域位置

zone_dma

記憶體開始的16mb

zone_normal

16mb~896mb

zone_highmem

896mb ~ 結束(1g)

ia32架構將高階記憶體劃分為3部分:

感覺說的有點亂,可能我的思路也還未足夠清晰,先就這樣吧。

其實我也思考了很久,總感覺核心很多地方是不要求物理記憶體連續的。

因為執行過程中,並不涉及pa和va的轉換,也沒有讀寫時候記憶體連續的需求。

經過一些調研後,暫時得出如下結論:

關於kmalloc()和vmalloc():

linux-2.6.12原始碼

233333 linux記憶體描述之高階記憶體–linux記憶體管理(五)

what is the difference between vmalloc and kmalloc?

linux 核心 筆記

1 在i2c驅動模組中定義實際呼叫的函式 void read i2cinfo from proc void 2 在i2c模組 如i2c演算法驅動模組 初始化時建立乙個proc entry create proc read entry readi2cinfo 0,0,read i2cinfo from...

Linux核心學習筆記 核心同步

linux核心中執行的程式,時刻都要防止併發引起的競態。這將會導致資料結構被破壞,嚴重的時候會引起核心崩潰。所以核心同步技術對核心開發的驅動程式來說非常重要。不懂核心同步技術的人,是寫不出安全健壯的核心驅動程式來的。在學習核心同步技術之前需要掌握一下幾個概念。1 並行,併發與競態 在smp執行的li...

linux學習筆記核心篇,核心移植

1.將核心從flash讀到記憶體 2.設定tag引數,3.啟動kernel,引數1r0 0,r1 機器id,r3 tag位址 1.讀取機器碼,呼叫相對應的初始化函式。2.解析tag引數,3.裝載驅動,網絡卡,flash等驅動 4.掛載根檔案系統,5.啟動應用程式。1.啟動核心函式檔案 cmd boo...