iT邦幫忙

2021 iThome 鐵人賽

DAY 19
1
Software Development

閱讀 Linux Kernel 文件系列 第 19

# Day 19 Physical Memory Model (Summary)

  • 分享至 

  • xImage
  •  

一樣先來個簡單的總結吧!
這份文件 Physical Memory Model 是在描述 Linux kernel 是怎麼樣管理實體記憶體的。
Linux kernel 中有兩種記憶體模型,這篇文件介紹了兩種記憶體模型是如何管理實體記憶體的,
並且簡單描述了這兩種模型應該使用和實作的 API:

  • FLATMEM model:適用於非 NUMA 架構,且實體記憶體區段幾乎都是連續的記憶體架構上,Linux 最一開始所使用的記憶體模型。
    • 優點:直覺、pfn (page frame number) 和 struct page 之間的轉換簡單
    • 缺點:若實體記憶體上有"孔洞",那麼將會浪費很多記憶體(struct page 物件)來儲存這些孔洞
  • SPARSEMEM model:通用的記憶體模型,是想要取代 DISCONTIGMEM 這個記憶體模型
    • 優點:能夠支援記憶體的熱插拔、熱移除(hot remove),且能有效減少紀錄記憶體"孔洞"所使用的記憶體
    • 缺點:pfn 轉換到 struct page 較為複雜,所以後來有引入了一些優化的機制

最後講述到了 ZONE_DEVICE,一個搭建於 SPARSEMEM_VMEMMAP 的設施,
讓驅動程式所使用的實體記憶體區塊也能使用 mem_map 相關操作。

PF (Page Frame) & PFN (Page Frame Number)

實體記憶體在 Linux 的管理下,是被分為一個一個 PAGE_SIZE 大小的區塊 (實際PAGE_SIZE值和架構有關),而這一塊 PAGE_SIZE 大小的區塊就被稱為 page frame,是實體記憶體的最小管理單位,每一個 page frame 會由一個 struct page 的物件所紀錄(紀錄它的使用狀況);
page frame number 就是 page frame 的編號,PA 位址 addr 的 PFN 就是 addr >> PAGE_SIZE

NUMA (Non-Uniform Memory Access)

這是指一種多處理器的記憶體架構,記憶體存取的速度是和記憶體與處理器的距離有關係的,處理器對不同位置的記憶體有不同的存取速度,所以稱為 "Non-Uniform"

FLATMEM -> DISCONTIGMEM -> SPARSEMEM

這是一個實體記憶體管理模型的演進,最早出現的是 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 資訊以及傳遞下來來做這些實體記憶體管理的;
我們明天見!

參考資料

延伸閱讀


上一篇
# Day 18 Physical Memory Model (三)
下一篇
# Day 20 High Memory Handling
系列文
閱讀 Linux Kernel 文件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言