每天理解一點Linux核心之高階位址對映

2021-08-18 13:35:06 字數 1010 閱讀 4815

zone_dma 記憶體開始的16mb

zone_normal 16mb~896mb

zone_highmem 896mb ~ 結束

動態對映

通過 vmalloc(),vmalloc是乙個介面函式,核心**用它來分配在虛擬記憶體中連續但在物理記憶體中不一定連續的記憶體。

void *vmalloc(unsigned longsize);

該函式只需要乙個引數,用於指定所需記憶體的長度,單位為位元組。但是要注意,vmalloc是以頁大小為單位分配記憶體的。底層還是通過夥伴演算法分配頁。

持久對映

類同vmalloc需要建立物理頁到虛擬位址的對映關係,持久對映顯然要簡單的多

圖中vitual address space裡面的每乙個格仔的空間大小為4kb,及乙個頁的大小,該空間及虛擬空間。pkmap_count所指代的陣列的每個單位大小是4b,及int型別,該陣列主要是為了對vitual address space 中的虛擬位址被對映多少次的計數

臨時對映

核心在 fixaddr_start 到 fixaddr_top 之間保留了一些線性空間用於特殊需求。這個空間稱為」固定對映空間」在這個空間中,有一部分用於高階記憶體的臨時對映。

這塊空間具有如下特點:

(1)每個 cpu 占用一塊空間

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

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

每天一點win核心筆記

今天開始學習核心,參考了很多書籍,但是水平有限,請多指教 1 第一章 大核心結構 所有的作業系統的服務都在同乙個記憶體空間中 核心元件之間通過函式呼叫進行通訊 系統元件和裝置的驅動程式執行在同乙個記憶體空間中 一旦發生錯誤 整個系統崩潰 大核心元件之間相互的依賴性容易導致難以維護 為了解決問題 出現...

每天學一點linux命令

netstat ap grep 27017 檢視某個埠的具體情況,是否監聽,建立連線,只能localhost訪問還是0.0.0.0所有都能訪問 列出當前目錄下的檔案個數 ls l grep wc l 按照時間排序,公升序或者降序 ll t tac ll t 檔案大小排序 由大到小 ls sl 小到大...

每天積累一點

最近有一種寫日誌的衝動,其實這種感覺由來已久,只是現在愈加強烈而已。我想每天都留下點東西,只是不想讓自己的記憶淡忘或是消逝 有時想把自己每天的情感都記錄下來,卻想回來卻也是一種極難堅持的事,我有那麼多的感嘆嗎?我除了感想還能做點什麼別的?於是我想到作為即將的it職業人,對技術又比較痴迷,有時也可以談...