直接看下去!
ZONE_DEVICE
===========
`ZONE_DEVICE` 這個基礎設施建立在 `SPARSEMEM_VMEMMAP` 之上,
用以提供 `struct page` `mem_map` 給設備驅動程序所使用的實體記憶體區塊。
`ZONE_DEVICE` 的 “device” 指的是,標示這些實體記憶體區塊的 page 物件永遠不會被標記成"可使用",
並且對該區段分頁的存取必須是針對設備的,而非只是標記為固定記憶體(pinned memory)以供主動操作。
`ZONE_DEVICE`,通過 :c:func:`devm_memremap_pages` 執行記憶體熱插拔來啟用
:c:func:`pfn_to_page`、:c:func:`page_to_pfn`,和 :c:func:`get_user_pages` 這些 API,用於給定的 pfns 範圍。
由於分頁的引用計數(reference count)永遠不會低於 1 ,
這些分頁永遠不會被標為可使用的記憶體,
而分頁的 `struct list_head lru` 空間被重新利用於反向存取映射記憶體的主機設備 / 驅動程序。
`SPARSEMEM` 將記憶體表示為區段的集合,選擇性地收集到記憶體區塊中,
而 `ZONE_DEVICE` 使用者則有使用較小粒度(granularity) 來填充 `mem_map` 的需求。
鑑於 `ZONE_DEVICE` 記憶體永遠不會被標記為可使用,
它也就永遠不會受限於該記憶體範圍被透過 sysfs 作用在記憶體區塊邊界上的熱插拔 API 所"公開"(exposed)。
這樣的實作是由於沒有 user-api 的限制,才使得大小比區段還小的(sub-section sized)記憶體範圍,
能夠被記憶體熱插拔的上半部(top-half) :c:func:`arch_add_memory` 所標記。
支援小區段(sub-section) 使得 :c:func:`devm_memremap_pages` 能使用 2MB 大小,
作為跨架構(cross-arch) 的通用對齊粒度。
`ZONE_DEVICE` 的使用者有:
* pmem: 透過 DAX 映射平台的永久性記憶體作為 direct-I/O 的作用對象。
* hmm: 用 `->page_fault()` 和 `->page_free()` 這兩個回呼函式(callback function)
來擴展 `ZONE_DEVICE`,使得設備驅動程式能夠和裝置記憶體相關的記憶體管理事件協作,
通常是 GPU 的記憶體。見Documentation/vm/hmm.rst。
* p2pdma: 創建 `struct page` 物件使得在 PCI/-E 拓樸下的同儕裝置(peer devices)
能夠彼此協調 direct-DMA 操作,像是繞過主機記憶體。
ZONE_DEVICE
是構建於 SPARSEMEM
之上的 feature,用來標示 device 的記憶體,感覺上是包含 device 本身有的記憶體(GPU memory)、以及 device 所需要用到的 MMIO。
ZONE DEVICE
還提供比 SPARSEMEM
還更小 granularity 的記憶體物件大小arch_add_memory
應該是記憶體熱插拔的上半部分DAX
指的是 Direct Access for files
,跟 DIO 應該有相同的意涵,都是讓 user space 可以繞過 page cache 直接存取永久性記憶體上的資訊HMM
指的是 Heterogeneous Memory Management
,最常見的應該就屬 GPU 吧p2pdma
感覺是可以支援,例如:2 個 GPU 之間的資料互傳,而不經由主機文件真的好難翻譯的精確,尤其是很多文件中的描述,都是幾乎不曾看過的行為,常常需要查閱一下程式碼或是翻閱相關的文章來做定奪,希望大家有機會的話,也可以幫我看看是否翻譯的恰當,或是有什麼需要修改的地方,也麻煩跟我說一聲歐!
那今天就簡單的紀錄到這裡,明天來做這篇文件的 summary 吧!感謝大家,明天見!