ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

tlb use_temporary_mm

tlb use_temporary_mm use_temporary_mm是 x86 架构中一个用于临时切换到一个专用地址空间MM执行敏感操作的函数。它主要服务于内核的文本补丁text patching机制在修改内核代码时提供一层额外的内存保护。核心目的安全地执行敏感内存写入当内核需要修改自己的代码例如应用 alternatives 或修改指令时这些写入操作需要绕过常规的 W^X写异或执行保护。use_temporary_mm允许内核临时切换到一个专用的、临时的地址空间如text_poke_mm在这个空间里建立一个仅对当前 CPU 可见的临时映射从而安全地完成写入而不会将敏感的临时页表映射暴露给其他 CPU 或用户空间。函数逻辑解析这个函数的典型实现如下基于较新内核的清理版本struct mm_struct *use_temporary_mm(struct mm_struct *temp_mm) { struct mm_struct *prev_mm; lockdep_assert_irqs_disabled(); /* * 确保不处于 TLB 惰性模式否则恢复时会陷入不一致状态 */ if (this_cpu_read(cpu_tlbstate_shared.is_lazy)) leave_mm(); prev_mm this_cpu_read(cpu_tlbstate.loaded_mm); switch_mm_irqs_off(NULL, temp_mm, current); /* * 如果硬件断点处于活动状态则禁用它们。 * 用户空间可能在临时 MM 使用的地址上设置了监视点 * 这会导致发送错误的信号或崩溃。 */ if (hw_breakpoint_active()) hw_breakpoint_disable(); return prev_mm; }关键步骤中断必须禁用lockdep_assert_irqs_disabled()确保调用时中断已关闭。这是为了硬性安全如果中断处理程序在临时 MM 激活期间运行它可能会覆盖内核的内存保护。退出 TLB 惰性模式如果当前处于惰性模式必须先调用leave_mm()退出否则恢复时状态会不一致。保存并切换保存当前加载的mmprev_mm然后通过switch_mm_irqs_off切换到临时 MM。禁用硬件断点这是为了防止用户空间设置的监视点干扰临时 MM 中的操作。设计意图与调用关系use_temporary_mm最初是arch/x86/kernel/alternative.c内部的静态函数后来被移到arch/x86/mm/tlb.c并导出以便 EFI 等子系统复用。它的典型调用场景是__text_poke()在修改内核代码前调用它切换环境操作完成后再通过unuse_temporary_mm(prev_mm)恢复原来的地址空间。这种“借用-恢复”的模式使得内核能够在保证安全的前提下执行那些需要绕过常规保护机制的底层操作。
返回列表