news 2026/11/3 10:46:55

memory __get_fault_gfp_mask

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
memory __get_fault_gfp_mask

__get_fault_gfp_mask是一个缺页异常处理路径中的辅助函数,用于为当前触发的缺页异常确定合适的内存分配标志(GFP flags)。它的核心逻辑是:如果 VMA 关联了文件,则使用该文件映射的 GFP 掩码;否则,为特殊映射(如 VDSO)返回一个默认的GFP_KERNEL。

核心实现

该函数的实现非常简洁:

static gfp_t __get_fault_gfp_mask(struct vm_area_struct *vma) { struct file *vm_file = vma->vm_file; if (vm_file) return mapping_gfp_mask(vm_file->f_mapping) | __GFP_FS | __GFP_IO; /* * Special mappings (e.g. VDSO) do not have any file so fake * a default GFP_KERNEL for them. */ return GFP_KERNEL; }

关键设计点

1. 文件映射:使用文件系统的 GFP 约束

当 VMA 关联了文件(vma->vm_file非空)时,函数返回mapping_gfp_mask(vm_file->f_mapping) | __GFP_FS | __GFP_IO。

  • mapping_gfp_mask()获取该文件address_space的 GFP 掩码,通常由文件系统在inode初始化时设置。

  • 追加__GFP_FS | __GFP_IO的原因:mapping_gfp_mask可能包含文件系统施加的约束(如~__GFP_FS用于避免递归调用),但在缺页异常处理路径中,内核通常已经处于一个安全上下文,可以安全地进行文件系统和 I/O 操作来回收内存。因此,函数显式地恢复这两个标志,确保缺页分配有足够的能力触发页面回收。

  • 这体现了内核在“尊重文件系统的内存分配约束”和“保证缺页分配有足够回收能力”之间的平衡。

2. 特殊映射:回退到GFP_KERNEL

当 VMA 没有关联文件时(如 VDSO、vsyscall 或某些匿名映射),函数返回GFP_KERNEL。注释明确指出这是为特殊映射“伪造”一个默认值。GFP_KERNEL是内核中最通用的分配标志,允许睡眠、触发 I/O 和文件系统操作,适合在进程上下文的缺页处理中使用。-16

在缺页处理中的角色

该函数在__handle_mm_fault中被调用,用于初始化vm_fault结构体的gfp_mask字段:

struct vm_fault vmf = { .vma = vma, .address = address, ... .gfp_mask = __get_fault_gfp_mask(vma), };

这个gfp_mask随后会被传递给缺页处理路径中的各个子函数(如do_anonymous_page、do_fault等),用于指导实际物理页面的分配。例如,在匿名页缺页中,虽然实际使用的是GFP_HIGHUSER_MOVABLE,但vmf->gfp_mask仍然作为基准掩码参与mem_cgroup_try_charge等操作。

设计意图总结

__get_fault_gfp_mask的核心意图是为缺页分配提供一个“上下文感知”的 GFP 掩码:

  • 有文件:继承文件系统的分配约束,但确保具备 FS/IO 回收能力。

  • 无文件:使用通用的GFP_KERNEL,因为特殊映射通常不涉及复杂的文件系统回收路径。

这种设计避免了在缺页处理路径中硬编码单一的 GFP 标志,而是根据 VMA 的类型动态调整,兼顾了正确性(尊重文件系统约束)和灵活性(确保足够的回收能力)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 10:46:24

热水茶壶工作状态检测设计

热水壶工作状态检测热水器工作报警器 使用继电器线圈来检测电流 AD\Test\2026\November\TeaPortMEGA8CheckCurrrent.PcbDoc* 热水器工作状态检测 一、电路设计 在之前,利用继电器线圈来感应热水壶工作电流,用于水开报警模块。  这个呢我们为了简化整…

作者头像 李华
网站建设 2026/11/3 10:46:20

阿里云部署

一、部署任务:使用阿里云组件完成若依项目部署:1. ECS:部署 Nginx、Spring Boot。机器密码:Qwer12342. RDS MySQL:存储业务数据。3. Redis:缓存数据。密码:redis123准备工作:1.安装网…

作者头像 李华
网站建设 2026/11/3 10:45:02

第 9 集:任务超时了,为什么还在运行?

资深 Java 面试到 Agent 开发工程师 第 9 集 我自己做了一个 Java 并发小游戏《并发突围》,无广告、免费玩。点这里试玩。 接口返回“查询超时”,后台却还占着线程。原因是:get(timeout) 只结束等待,不会自动取消任务。要让工作…

作者头像 李华
网站建设 2026/11/3 10:44:37

深入探索 Python 核心函数与模块:从 ord() 到 dis

在编程这样的环境当中, 了解语言里面的核心函数还有模块这些内容, 确实能够让咱们的编程工作变得更为高效, 同时也能让代码的质量有明显提高, 这篇文章会把重点放在几个比较重要的函数以及模块上面去讨论, 具体来说就包括了ord这个函数、id这个函数还有dis这个模块, 并且还会利…

作者头像 李华
网站建设 2026/11/3 10:44:35

FindStar星图计划:STM32从一颗 LED 开始

星图 C8T6 01|从一颗 LED 开始:验证整条链路星图计划 C8T6 卷第 1 颗星。FindStar 寻星工作室 STM32F103C8T6 65 个项目,从这颗灯开始。为什么第一课永远是点灯 每个学单片机的人都被同一句话送进门:先让灯闪起来。 这话听起来…

作者头像 李华
网站建设 2026/11/3 10:43:36

aws(SAA/SAP边学边练)w1d2(S3 基础 + 存储类)

文章目录 aws(SAA/SAP边学边练)w1d2(S3 基础 + 存储类) 1. 先把 6 类存储类"一句话定位"记住 1.1 核心速查表 1.2 两个必考补充点 1.3 选择标准 2.动手实操 2.1 动手实操 1:创建桶 + 上传 + 切换存储类(CLI) 2.1.1 创建桶(桶名全局唯一,注意区域要跟 CLI 默认一…

作者头像 李华