# Day 18 Physical Memory Model (三)

直接看下去!

文件

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 的记忆体物件大小
    • 记忆体热插拔指的是,可以动态的增加(插上)或减少(拔下) 实体记忆体
    • top-half 和中断相关的 top half 应该是相同意思,所以 arch_add_memory 应该是记忆体热插拔的上半部分
  • DAX 指的是 Direct Access for files,跟 DIO 应该有相同的意涵,都是让 user space 可以绕过 page cache 直接存取永久性记忆体上的资讯
  • HMM 指的是 Heterogeneous Memory Management,最常见的应该就属 GPU 吧
  • p2pdma 感觉是可以支援,例如:2 个 GPU 之间的资料互传,而不经由主机

後记

文件真的好难翻译的精确,尤其是很多文件中的描述,都是几乎不曾看过的行为,常常需要查阅一下程序码或是翻阅相关的文章来做定夺,希望大家有机会的话,也可以帮我看看是否翻译的恰当,或是有什麽需要修改的地方,也麻烦跟我说一声欧!

那今天就简单的纪录到这里,明天来做这篇文件的 summary 吧!感谢大家,明天见!


<<:  Day12 - 物理模拟篇 - 弹跳球世界III - 成为Canvas Ninja ~ 理解2D渲染的精髓

>>:  LeetCode解题 Day27

[前端暴龙机,Vue2.x 进化 Vue3 ] Day7. Vue资料的使用方式

Vue资料的使用方式 在前一篇中,我们已经会一些用来表示内容的方式了,但仅仅只是呈现~ 所以今天就会...

[Python 爬虫这样学,一定是大拇指拉!] DAY18 - Python:Requests 基本应用 (1)

实战演练开始前,稍微来讲解一下 Requests 的基本使用,当作是暖身。 用 Requests 送...

找LeetCode上简单的题目来撑过30天啦(DAY7)

昨天熬夜看小说,今天早上爬不起来就翘班(开玩笑的,是请假 今天赶快发一发文我要来去补眠 今天的题目↓...

23 搞半天终於在网页上启动游戏了

发牌员 我们的短期目标是,在网页上用纯文字的方式直接显示游戏状态 并会随着游戏更新的时候更新 原本想...

Day4 Javascript介绍

在前面的文章中,我们有浅谈到Javascript在网页中所扮演的角色,而Javascript到底是甚...