我正在阅读“理解 Linux 虚拟内存管理器”由戈尔曼.
在第 4 章关于进程地址空间,当引入VMA操作时,例如创建、锁定和解锁,文本中提到“修复区域”。 “修复”具体是什么意思?它是否以相同的方式适用于不同的 VMA 操作?
详细报价:
Linux 可以通过系统调用 mlock() 将某个地址范围内的页面锁定到内存中,该调用由 sys_mlock() 实现,其调用图如图 4.10 所示。从高层次来看,功能很简单;它为要锁定的地址范围创建一个 VMA,在其上设置 VM_LOCKED 标志,并使用 make_pages_present() 强制所有页面都存在。还提供了映射到 sys_mlockall() 的第二个系统调用 mlockall(),这是一个简单的扩展,可以执行与 sys_mlock() 相同的工作,但调用进程上的每个 VMA 除外。这两个函数都依赖于核心函数 do_mlock() 来执行查找受影响的 VMA 并决定需要什么函数的实际工作修复区域如下所述。
系统调用 munlock() 和 munlockall() 提供锁定函数的推论,并分别映射到 sys_munlock() 和 sys_munlockall()。这些函数比锁定函数简单得多,因为它们不需要进行大量检查。它们都依赖相同的 do_mmap() 函数来修复区域。
如果要进行映射的位置存在旧区域,修复它使其适合新的映射;
书中使用的内核版本是Linux 2.4.22。
答案1
在这种情况下,“修复”意味着适当合并或拆分 VMA,以便它们与正在操作的区域相匹配:
- 如果要锁定(或解锁)的区域小于包含它的VMA,则需要分割VMA;
- 如果连续的 VMA 可以合并,那么它们应该可以合并。
您正在阅读的文档很旧,但这仍然适用于当前的内核。修复由以下人员处理mlock_fixup
,这称为vma_merge
和split_vma
作为适当的。也可以看看描述不可驱逐的 LRU 基础设施的文档。