一樣先來個簡單的總結吧!
這份文件 Physical Memory Model
是在描述 Linux kernel 是怎麼樣管理實體記憶體的。
Linux kernel 中有兩種記憶體模型,這篇文件介紹了兩種記憶體模型是如何管理實體記憶體的,
並且簡單描述了這兩種模型應該使用和實作的 API:
FLATMEM model
:適用於非 NUMA 架構,且實體記憶體區段幾乎都是連續的記憶體架構上,Linux 最一開始所使用的記憶體模型。
SPARSEMEM model
:通用的記憶體模型,是想要取代 DISCONTIGMEM
這個記憶體模型
最後講述到了 ZONE_DEVICE
,一個搭建於 SPARSEMEM_VMEMMAP
的設施,
讓驅動程式所使用的實體記憶體區塊也能使用 mem_map 相關操作。
實體記憶體在 Linux 的管理下,是被分為一個一個 PAGE_SIZE 大小的區塊 (實際PAGE_SIZE值和架構有關),而這一塊 PAGE_SIZE 大小的區塊就被稱為 page frame
,是實體記憶體的最小管理單位,每一個 page frame 會由一個 struct page 的物件所紀錄(紀錄它的使用狀況);
page frame number 就是 page frame 的編號,PA 位址 addr 的 PFN 就是 addr >> PAGE_SIZE
。
這是指一種多處理器的記憶體架構,記憶體存取的速度是和記憶體與處理器的距離有關係的,處理器對不同位置的記憶體有不同的存取速度,所以稱為 "Non-Uniform"
這是一個實體記憶體管理模型的演進,最早出現的是 FLATMEM
,直覺式的實作方式,把實體記憶體用 struct page 物件陣列來做紀錄,struct page 和 pfn 之間的關係簡單,轉換也很容易;DISCONTIGMEM
則是為了更有效率的管理不連續的實體記憶體系統,以及較好的支援 NUMA 系統而被創造出來,引進了 memory node 的概念,來符合 NUMA 架構下,每個 node 有自己獨立的記憶體管理子系統;
最後 SPARSEMEM
則是因為 DISCONTIGMEM
對於 memory hotplug 和 memory hot remove 的支援性太差(NUME node 的 granularity 對於 hot plug 或是 hot remove 都太大了(coarse)),所以被實作出來,做為一個更通用並且支援 hot plug、hot remove 用來取代 DISCONTIGMEM
。DISCONTIGMEM
在 5.13 版的 kernel 都還看的到它的蹤跡,而在 5.14 之後看起來就被 SPARSEMEM
所徹底取代了。
今天簡單記錄到這,感謝各位觀看!
明天也許來研究一下,這些 memory model 在 RISC-V 下的實作,順便看看 kernel 是如何取的 dtb 中的 memory 資訊以及傳遞下來來做這些實體記憶體管理的;
我們明天見!