新闻详情

新闻详情

首页 / 资讯中心 / 详情

pgtable ___pmd_free_tlb

发布时间:2026/9/30 7:19:29来源:尧图网络
pgtable ___pmd_free_tlb
___pmd_free_tlb是 x86 架构中用于在 TLB 批量刷新mmu_gather过程中延迟释放一个 PMD 页表页的底层函数。它的核心特点是将页表页的释放推迟到 TLB 刷新之后并处理 PAE 模式下的特殊需求。核心作用延迟释放与 TLB 协调当内核拆除一段页表映射时对应的 PMD 页表页需要被释放。但直接释放是危险的如果 TLB 中还缓存着指向该 PMD 的条目释放后可能导致 CPU 访问已释放内存。因此内核使用mmu_gather机制收集将要释放的页表页记录到tlb-pages数组中。刷新 TLB在所有收集完成后执行 TLB 刷新。释放TLB 刷新后才真正释放这些页表页。___pmd_free_tlb负责第 1 步——将 PMD 页表页加入待释放列表。代码逐行解析void ___pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd) { paravirt_release_pmd(__pa(pmd) PAGE_SHIFT);半虚拟化通知paravirt_release_pmd是一个半虚拟化钩子。在 Xen 等虚拟化环境中客户机释放页表页时需要通知 Hypervisor因为 Hypervisor 需要维护自己的影子页表。__pa(pmd)获取 PMD 的物理地址 PAGE_SHIFT转换为页帧号。#ifdef CONFIG_X86_PAE tlb-need_flush_all 1; #endifPAE 特殊处理在启用 PAE物理地址扩展的 32 位系统上PMD 层级实际上对应的是页目录指针表PDPT。修改 PDPT 的顶层条目需要完整的 CR3 重载才能刷新 TLB因为INVLPG指令对 PDPT 条目的失效效果不可靠。因此设置need_flush_all 1强制后续执行全局 TLB 刷新。tlb_remove_ptdesc(tlb, virt_to_ptdesc(pmd)); }加入待释放列表virt_to_ptdesc(pmd)将 PMD 的虚拟地址转换为struct ptdesc指针这是内核将页表描述符从struct page中拆分出来的新机制。tlb_remove_ptdesc将其加入tlb-pages数组等待 TLB 刷新后统一释放。在页表释放链条中的位置这个函数通常由宏pmd_free_tlb调用而后者在free_pgd_range→free_pud_range→free_pmd_range的递归释放过程中被触发。它确保了 PMD 页表页的释放与 TLB 刷新的正确顺序避免了“释放后仍被 TLB 引用”的竞态条件。谁调用___pmd_free_tlb它由pmd_free_tlb()这个包装函数或宏调用。在 x86 架构下pmd_free_tlb()的典型实现是static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, unsigned long address) { if (mm_pmd_folded(tlb-mm)) return; ___pmd_free_tlb(tlb, pmd); }pmd_free_tlb()本身则是在free_pmd_range()中被调用的而free_pmd_range()又是free_pud_range()→free_pgd_range()→free_pgtables()这个递归释放链条的一部分。完整的调用链条free_pgtables() // 释放页表的总入口 └── free_pgd_range() └── free_pud_range() └── free_pmd_range() // ← 在这里调用 pmd_free_tlb └── pmd_free_tlb() └── ___pmd_free_tlb()这个链条的触发场景包括进程退出exit_mmap、munmap、以及mremap等需要拆除页表映射的操作。___pmd_free_tlb调用谁在函数内部它调用了两个关键函数paravirt_release_pmd()半虚拟化钩子通知 Hypervisor如 Xen释放对应的 PMD 页表页。tlb_remove_ptdesc()将 PMD 页表页加入mmu_gather的待释放列表延迟到 TLB 刷新后再真正释放。设计要点___pmd_free_tlb是一个架构相关的底层函数它的核心职责是协调页表页释放与 TLB 刷新。直接释放页表页是危险的因为 TLB 中可能还缓存着指向该页的条目。因此它通过tlb_remove_ptdesc将释放操作“挂起”等待tlb_finish_mmu()完成 TLB 刷新后再统一释放。在 PAE 模式下它还额外设置tlb-need_flush_all 1因为修改顶层 PDPT 条目需要完整的 CR3 重载才能确保 TLB 正确失效。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

Model-Optimizer:大模型GPU推理的工程共识与落地实践 2026/9/30 8:14:06

Model-Optimizer:大模型GPU推理的工程共识与落地实践

1. “Model-Optimizer”不是工具名,而是工程共识的具象化表达很多人第一次看到“Model-Optimizer”这个标题,下意识会以为它是一个开源项目、某个GitHub仓库,或者某家厂商推出的GUI软件——就像TensorRT GUI、vLLM WebUI那样带界面、点几下就…

阅读更多 →
@xstate/react 核心 API 演进指南:从 useMachine 到 useActor 与 ActorRef 的 React 状态机实践 2026/9/30 8:14:06

@xstate/react 核心 API 演进指南:从 useMachine 到 useActor 与 ActorRef 的 React 状态机实践

前端后端 【免费下载链接】xstate State machines, statecharts, and actors for complex logic 项目地址: https://gitcode.com/gh_mirrors/xs/xstate 点击查看 免费下载 xstate/react 是 XState 官方提供的 React 集成包,它把状态机(State…

阅读更多 →
Agent Memory 实战:基于 MCP 与 Docker 构建 hindsight 记忆系统 2026/9/30 8:14:06

Agent Memory 实战:基于 MCP 与 Docker 构建 hindsight 记忆系统

1. 从 "hindsight" 说起:为什么 Agent Memory 是 LLM 落地的最后一公里 第一次看到 "hindsight" 这个词,我脑子里蹦出来的不是词典释义,而是过去一年多在 Agent 项目里反复踩坑的画面。hindsight 直译是"后见之明&q…

阅读更多 →
函数式编程核心:不变性与组合性在实战中的落地 2026/9/30 8:14:06

函数式编程核心:不变性与组合性在实战中的落地

每次在技术社区聊到函数式编程,周围人的反应都挺有意思的——一边是刚接触的同事觉得“纯函数”“不可变数据”这些概念太绕,一边是老手把lambda、Monad挂在嘴边,可业务代码里还是清一色的命令式写法。我自己也经历过这个阶段:早期…

阅读更多 →
函数式编程核心:不变性与组合性在业务代码中的实战价值 2026/9/30 8:14:05

函数式编程核心:不变性与组合性在业务代码中的实战价值

项目标题叫“函数式编程思想:不变性与组合性”,说白了就是聊聊函数式编程里最核心的两个概念——不变性(Immutability)和组合性(Composition)。这两个词看着学术,其实跟日常写业务代码的关系非常…

阅读更多 →
5 分钟上手 wiliwili:跨平台 B 站客户端完整指南 2026/9/30 8:13:59

5 分钟上手 wiliwili:跨平台 B 站客户端完整指南

5 分钟上手 wiliwili:跨平台 B 站客户端完整指南 【免费下载链接】wiliwili 第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili 睡前窝在沙发上手柄…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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