首页 > 其他分享 >虚拟映射的内核栈支持 【ChatGPT】

虚拟映射的内核栈支持 【ChatGPT】

时间:2023-12-12 22:58:53浏览次数:34  
标签:kernel 映射 VMAP 虚拟 内核 ChatGPT STACK

虚拟映射的内核栈支持

作者 Shuah Khan [email protected]

概述

这是从引入虚拟映射内核栈功能的代码和原始补丁系列中整理的信息https://lwn.net/Articles/694348/

介绍

内核栈溢出通常很难调试,并使内核容易受到攻击。问题可能在稍后的时间出现,使得难以隔离和确定根本原因。

带有守护页的虚拟映射内核栈可以立即捕获内核栈溢出,而不会导致难以诊断的破坏。

HAVE_ARCH_VMAP_STACK和VMAP_STACK配置选项启用了带有守护页的虚拟映射栈的支持。此功能在栈溢出时会引发可靠的故障。栈溢出后的堆栈跟踪的可用性以及对溢出本身的响应取决于体系结构。

注意
截至本文撰写时,arm64、powerpc、riscv、s390、um和x86支持VMAP_STACK。

HAVE_ARCH_VMAP_STACK

支持虚拟映射内核栈的体系结构应启用此布尔配置选项。要求如下:

  • vmalloc空间必须足够大,以容纳许多内核栈。这可能排除了许多32位体系结构。
  • vmalloc空间中的栈需要可靠地工作。例如,如果按需创建vmap页表,则此机制需要在栈指向具有未填充页表的虚拟地址时工作,或者体系结构代码(可能是switch_to()和switch_mm())需要确保在可能未填充的栈上运行之前,栈的页表条目已填充。
  • 如果栈溢出到守护页,应该发生一些合理的事情。对“合理”的定义是灵活的,但是立即重新启动而不记录任何内容将是不友好的。

VMAP_STACK

启用VMAP_STACK布尔配置选项时,将分配虚拟映射的任务栈。此选项依赖于HAVE_ARCH_VMAP_STACK。

  • 如果要使用带有守护页的虚拟映射内核栈,请启用此选项。这将导致内核栈溢出被立即捕获,而不会导致难以诊断的破坏。

注意
使用此功能与KASAN一起需要体系结构支持,以将虚拟映射与实际影子内存进行支持,并且必须启用KASAN_VMALLOC。

注意
启用VMAP_STACK后,无法在分配的数据上运行DMA。

内核配置选项和依赖关系会不断变化。请参考最新的代码库:

Kconfig https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/Kconfig

分配

创建新的内核线程时,线程栈从页面级分配器的虚拟连续内存页面中分配。这些页面被映射到具有PAGE_KERNEL保护的连续内核虚拟空间中。

alloc_thread_stack_node()调用__vmalloc_node_range()以使用PAGE_KERNEL保护分配栈。

  • 分配的栈会被缓存,并由新线程重用,因此在将栈分配/释放给任务时需要手动执行memcg账户。因此,__vmalloc_node_range在没有__GFP_ACCOUNT的情况下调用。
  • vm_struct被缓存以便在中断上下文中能够找到当线程释放时的虚拟分配栈。free_thread_stack()可以在中断上下文中调用。
  • 在arm64上,所有VMAP的栈需要具有相同的对齐方式,以确保VMAP的栈溢出检测正常工作。特定于体系结构的vmap栈分配器会处理此细节。
  • 这不涉及中断栈-根据原始补丁

线程栈分配是从clone()、fork()、vfork()、kernel_thread()通过kernel_clone()开始的。以下是在代码库中搜索以了解何时以及如何分配线程栈的一些提示。

大部分代码位于:kernel/fork.c https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/fork.c

task_struct中的stack_vm_area指针跟踪着虚拟分配的栈,非空的stack_vm_area指针表示虚拟映射内核栈已启用。

struct vm_struct *stack_vm_area;

栈溢出处理

前导和尾随守护页有助于检测栈溢出。当栈溢出到守护页时,处理程序必须小心,以免再次溢出栈。当调用处理程序时,栈空间可能已经很少。

在x86上,这是通过处理指示内核栈溢出的页故障来完成的,该页故障发生在双重故障栈上。

使用带有守护页的虚拟映射内核栈的测试

我们如何确保VMAP_STACK实际上分配了具有前导和尾随守护页的栈?以下的lkdtm测试可以帮助检测任何回归。

void lkdtm_STACK_GUARD_PAGE_LEADING()
void lkdtm_STACK_GUARD_PAGE_TRAILING()

结论

  • 每CPU的vmalloc堆栈缓存似乎比高阶堆栈分配要快一些,至少在缓存命中时是这样。
  • THREAD_INFO_IN_TASK完全消除了特定于体系结构的thread_info,并且简单地将thread_info(仅包含标志)和'int cpu'嵌入到task_struct中。
  • 任务死亡后,线程栈可以立即释放(无需等待RCU),然后,如果正在使用vmapped栈,则在同一CPU上缓存整个栈以便重用。

标签:kernel,映射,VMAP,虚拟,内核,ChatGPT,STACK
From: https://www.cnblogs.com/pengdonglin137/p/17898038.html

相关文章

  • 页面迁移 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/mm/page_migration.html#page-migration页面迁移页面迁移允许在NUMA系统中的节点之间移动页面的物理位置,同时进程正在运行。这意味着进程看到的虚拟地址不会改变。但是,系统重新排列这些页面的物理位置。另请参阅异构内存管理(HMM),用于......
  • Multi-Gen LRU 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/mm/multigen_lru.html多代LRU多代LRU是一种替代LRU实现,它优化页面回收并在内存压力下提高性能。页面回收决定了内核的缓存策略和内存过度分配的能力。它直接影响了kswapdCPU的使用率和RAM的效率。设计概述目标设计目标包括:良好的......
  • 空闲页面报告 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/mm/free_page_reporting.html空闲页面报告空闲页面报告是一种API,设备可以通过该API注册以接收当前系统未使用的页面列表。这在虚拟化的情况下非常有用,因为虚拟机可以利用这些数据通知hypervisor它不再使用内存中的某些页面。对于驱动程......
  • 文心一言 VS 讯飞星火 VS chatgpt (155)-- 算法导论12.3 2题
    二、用go语言,假设通过反复向一棵树中插人互不相同的关键字来构造一棵二叉搜索树。证明:在这棵树中查找关键字所检查过的结点数目等于先前插入这个关键字所检查的结点数目加1。文心一言:为了证明这个结论,我们可以使用二叉搜索树的性质:在二叉搜索树中,每个节点包含一个关键字以及指......
  • 异构内存管理(HMM) 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/mm/hmm.html异构内存管理(HMM)HMM提供基础设施和辅助工具,将非常规内存(例如设备内存,如GPU板载内存)整合到常规内核路径中,其核心是为此专门设计的用于此类内存的structpage(请参见本文档的第5至7节)。HMM还提供了用于SVM(共享虚拟内存)的可选辅......
  • DAMON: 数据访问监控 (翻译 by chatgpt)
    原文:https://www.kernel.org/doc/html/v6.6/admin-guide/mm/damon/index.htmlDAMON:数据访问监控DAMON允许进行轻量级的数据访问监控。使用DAMON,用户可以分析其系统的内存访问模式并进行优化。入门指南先决条件记录数据访问模式可视化记录的模式数据访问模式感知内存管理......
  • 空闲页面跟踪 (翻译 by chatgpt)
    原文:https://www.kernel.org/doc/html/latest/admin-guide/mm/idle_page_tracking.html空闲页面跟踪动机空闲页面跟踪功能允许跟踪工作负载访问的内存页面和空闲页面。这些信息对于估算工作负载的工作集大小很有用,进而可以在配置工作负载参数、设置内存cgroup限制或决定在计算......
  • SLUB简短用户指南 (翻译 by chatgpt)
    原文:https://www.kernel.org/doc/html/v6.6/mm/slub.htmlSLUB简短用户指南SLUB的基本理念与SLAB非常不同。SLAB需要重新构建内核以激活所有slab缓存的调试选项。SLUB始终包含完整的调试功能,但默认情况下处于关闭状态。SLUB可以仅针对选定的slab启用调试,以避免对整个系统性能产生......
  • 设备的能量模型【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/power/energy-model.html设备的能量模型1.概述能量模型(EM)框架充当了一个接口,连接了了解各种性能水平下设备功耗的驱动程序和愿意利用该信息做出节能决策的内核子系统。关于设备功耗的信息来源在不同平台上可能会有很大的差异。在某些......
  • System Suspend and Device Interrupts 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/power/suspend-and-interrupts.html系统挂起和设备中断版权©2014IntelCorp.作者:[email protected]挂起和恢复设备中断在系统挂起后(即在所有设备的->prepare、->suspend和->suspend_late回调已经执行......