Linux核心高階記憶體管理

2021-08-31 18:45:40 字數 1842 閱讀 8300

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

highmem

刺蝟@

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

80386的線性定址空間是4g,核心空間從3g開始,如果全部採用"線性對映"(實體地址和邏輯位址只差乙個常量 page_offset ),最多管理1g物理記憶體,也就是1g的物理記憶體挨著挨著對應的是虛擬位址的3g到4g的位置。你想想如果多於1g的記憶體,我們用什麼線性位址來裝下這些多出的位址呢?我朋友的機器有2g,據說玩遊戲巨爽(amd64300+).顯然如果線性對映我的朋友就會浪費1g記憶體.為了使核心能夠訪問這些"高階記憶體",核心使用highmem.做法是不將核心1g的虛擬位址空間全部對映成物理記憶體,而是預留一部分給高階記憶體做臨時對映使用.

其實核心不僅僅預留了highmem的位址空間,還給fixmap,vmalloc預留了虛存空間.實際上,系統初始化的時候預留128m虛存,896m用於"直接"對映物理記憶體。下面我們先貼上一幅圖,摘自《understand linux kernel 》

高階記憶體對映有三種方式:

1、對映到「核心動態對映空間」

這種方式很簡單,因為通過 vmalloc() ,在"核心動態對映空間"(上圖的vmalloc_start到vmalloc_end)申請記憶體的時候,就可能從高階記憶體獲得頁面(參看 vmalloc 的實現),因此說高階記憶體有可能對映到"核心動態對映空間" 中。

2、永久核心對映

如果是通過 alloc_page() 獲得了高階記憶體對應的 page,如何給它找個線性空間?

核心專門為此留出一塊線性空間,從 pkmap_base 到

fixaddr_start (上圖的倒數第二塊區域),用於對映高階記憶體。在 2.4 核心上,這個位址範圍是 4g-8m 到 4g-4m 之間。這個空間起叫「核心永久對映空間」或者「永久核心對映空間」。

由於這個空間是 4m 大小,最多能同時對映 1024 個 page。因此,對於不使用的的 page,及應該時從這個空間釋放掉(也就是解除對映關係),通過 kunmap() ,可以把乙個 page 對應的線性位址從這個空間釋放出來。

3、臨時對映

核心在 fixaddr_start 到 fixaddr_top 之間保留了一些線性空間用於特殊需求。這個空間稱為「固定對映空間」

在這個空間中,有一部分用於高階記憶體的臨時對映。

<?xml:namespace prefix = o />

這塊空間具有如下特點:

1、每個 cpu 占用一塊空間

2、在每個 cpu 占用的那塊空間中,又分為多個小空間,每個小空間大小是 1個 page,每個小空間用於乙個目的,這些目的定義在 kmap_types.h 中的 km_type 中。

當要進行一次臨時對映的時候,需要指定對映的目的,根據對映目的,可以找到對應的小空間,然後把這個空間的位址作為對映位址。這意味著一次臨時對映會導致以前的對映被覆蓋。

通過 kmap_atomic() 可實現臨時對映。

給我老師的人工智慧教程打call!

Linux記憶體管理 核心高階記憶體

linux核心位址對映模型 x86 cpu採用了段頁式位址對映模型。程序 中的位址為邏輯位址,經過段頁式位址對映後,才真正訪問物理記憶體。段頁式機制如下圖 linux核心位址空間劃分 通常32位linux核心位址空間劃分0 3g為使用者空間,3 4g為核心空間。注意這裡是32位核心位址空間劃分,64...

Linux核心高階記憶體

sep11 2011 10 comments written bychen linux核心位址對映模型 x86 cpu採用了段頁式位址對映模型。程序 中的位址為邏輯位址,經過段頁式位址對映後,才真正訪問物理記憶體。段頁式機制如下圖。linux核心位址空間劃分 通常32位linux核心位址空間劃分0 ...

Linux核心高階記憶體

linux核心位址對映模型 x86 cpu採用了段頁式位址對映模型。程序 中的位址為邏輯位址,經過段頁式位址對映後,才真正訪問物理記憶體。段頁式機制如下圖。linux核心位址空間劃分 通常32位linux核心位址空間劃分0 3g為使用者空間,3 4g為核心空間。注意這裡是32位核心位址空間劃分,64...