新闻详情

新闻详情

首页 / 资讯中心 / 详情

init vmemmap_flush_unused_pmd

发布时间:2026/9/29 15:04:13来源:尧图网络
init vmemmap_flush_unused_pmd
vmemmap_flush_unused_pmd是 x86-64 架构中用于清理 vmemmap 区域内未使用的 PMD 条目所占用的空间的辅助函数。核心作用回收“占位”空间在 SPARSEMEM 内存模型下vmemmap是一个巨大的虚拟地址区域用于映射所有struct page描述符。这个区域理论上需要覆盖整个物理地址空间包括可能热插拔的内存因此它的虚拟地址范围通常远大于当前实际存在的物理内存。内核会为vmemmap区域预分配页表但为了节省内存对于那些尚未被实际物理内存使用的 PMD 条目内核会将其“占位”在一个特殊页面上填充PAGE_UNUSED而不是分配真正的 PTE 页表。vmemmap_flush_unused_pmd的任务就是当 vmemmap 的映射范围需要扩展时将之前用PAGE_UNUSED占位的、未使用的 PMD 条目清理掉为真正的映射腾出空间。代码逻辑解析static void __meminit vmemmap_flush_unused_pmd(void) { if (!unused_pmd_start) return; /* * Clears (unused_pmd_start, PMD_END] */ memset((void *)unused_pmd_start, PAGE_UNUSED, ALIGN(unused_pmd_start, PMD_SIZE) - unused_pmd_start); unused_pmd_start 0; }快速退出如果unused_pmd_start为 0说明没有需要清理的占位区域直接返回。计算清理范围ALIGN(unused_pmd_start, PMD_SIZE) - unused_pmd_start计算从unused_pmd_start到下一个 2MB 边界之间的字节数。这正好覆盖了当前这个不完整的 PMD 条目剩余的部分。写入占位值memset将这块区域填充为PAGE_UNUSED。PAGE_UNUSED是一个特殊常量表示该 PMD 条目未被使用。重置标记将unused_pmd_start设为 0表示清理已完成。在 vmemmap 初始化中的角色这个函数通常在vmemmap_populate()或vmemmap_populate_hugepages()被调用时于映射新范围之前执行。它的工作模式是当内核需要为新的物理内存区域建立 vmemmap 映射时会从unused_pmd_start开始填充。如果新映射的结束地址没有对齐到 PMD 边界剩余的“半截” PMD 条目会被记录在unused_pmd_start中并用PAGE_UNUSED占位。下一次扩展映射时先调用vmemmap_flush_unused_pmd()清理上次的占位然后从干净的边界重新开始。这种“延迟清理”的设计避免了每次扩展时都进行昂贵的页表操作只在必要时才回收空间。调用关系vmemmap_flush_unused_pmd的调用关系很清晰它只被两个函数调用这两个函数都位于arch/x86/mm/init_64.c中围绕 vmemmap 区域的populate填充和depopulate回收操作展开。直接调用者vmemmap_use_sub_pmd()—— 当一个新的 vmemmap 范围“紧接着”之前未使用的范围时被调用。如果新范围不满足“直接衔接”的优化条件就会调用vmemmap_flush_unused_pmd()来清理之前用PAGE_UNUSED占位的空间为真正的映射腾出位置。vmemmap_use_new_sub_pmd()—— 当 vmemmap 的映射范围发生“跳跃”或不对齐时被调用。它总是先调用vmemmap_flush_unused_pmd()确保从干净的状态开始填充新的映射范围。在 vmemmap 操作链中的位置这两个调用者本身又被更上层的 vmemmap 填充逻辑调用vmemmap_use_sub_pmd()在vmemmap_populate_hugepages()中当发现一个PMD 大页映射已存在pmd_large(*pmd)时被调用。这意味着该区域之前已经通过大页填充只需要标记“使用”状态即可。vmemmap_use_new_sub_pmd()同样在vmemmap_populate_hugepages()中当新填充的 PMD 大页范围不是 PMD 对齐时被调用。这种情况发生在struct page大小不是 2MB 整数倍时导致 section 无法跨越完整的 PMD。设计意图vmemmap_flush_unused_pmd的核心作用是配合unused_pmd_start这个全局状态变量实现 vmemmap 空间的“懒标记”。内核不会每次填充时都立即标记未使用部分而是先记录unused_pmd_start等到真正需要填充新范围时才通过这个函数一次性清理。这种设计避免了在连续填充时频繁调用memset提升了 vmemmap 初始化的效率。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

STM32F103嵌入式入门:从裸机启动到USB虚拟串口实战 2026/9/29 16:10:57

STM32F103嵌入式入门:从裸机启动到USB虚拟串口实战

1. 这块STM32F103开发板,不是玩具,是嵌入式工程师的“第一把刻刀”你拆开快递盒,看到那块蓝绿色PCB板上印着“STM32F103C8T6”几个字,旁边插着个小小的ST-Link V2调试器——恭喜,你正式踏入了真实嵌入式世界的门槛。这…

阅读更多 →
小程序开发提效:开发者工具插件推荐与 TaoToken 统一 Key 配置 2026/9/29 16:10:57

小程序开发提效:开发者工具插件推荐与 TaoToken 统一 Key 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
注塑机数据采集全指南:从协议选型到系统落地与排障 2026/9/29 16:10:57

注塑机数据采集全指南:从协议选型到系统落地与排障

1. 注塑机数据采集这件事,到底在解决什么问题先聊点实际的。做了这么多年注塑车间信息化,接过的工厂没有一百也有八十家,几乎每个老板上来都会问同一句话:我的机器到底在干什么?停机了多久?产能到底多少&am…

阅读更多 →
DeepSeek+Mermaid:自然语言生成流程图与架构图实战 2026/9/29 16:10:57

DeepSeek+Mermaid:自然语言生成流程图与架构图实战

简介:这份文档面向具备一定编程基础的研发人员、项目经理与数据分析师,聚焦如何借助DeepSeek大语言模型将自然语言指令转化为Mermaid代码,再由Mermaid渲染为流程图、序列图、甘特图等可视化图表,从而提升需求分析、系统设计、编码…

阅读更多 →
用 lark-cli 一个月后,我把飞书 AI 操作接进了 TaoToken 统一通道 2026/9/29 16:10:56

用 lark-cli 一个月后,我把飞书 AI 操作接进了 TaoToken 统一通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
IDEA插件开发实战:为Claude Code和Codex打造GUI集成 2026/9/29 16:10:48

IDEA插件开发实战:为Claude Code和Codex打造GUI集成

开局先交代背景:Claude Code 和 Codex 这两个 AI 编码助手,最近几乎是开发者圈子里绕不开的话题。一个是 Anthropic 家的,一个是 OpenAI 家的,能力各有侧重,但真有一个共同槽点——它们默认都是命令行工具。你想在 IDE…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉