~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/mm/vmalloced-kernel-stacks.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/translations/zh_CN/mm/vmalloced-kernel-stacks.rst (Architecture i386) and /Documentation/translations/zh_CN/mm/vmalloced-kernel-stacks.rst (Architecture sparc)


  1 .. SPDX-License-Identifier: GPL-2.0                 1 .. SPDX-License-Identifier: GPL-2.0
  2 .. include:: ../disclaimer-zh_CN.rst                2 .. include:: ../disclaimer-zh_CN.rst
  3                                                     3 
  4 :Original: Documentation/mm/vmalloced-kernel-s      4 :Original: Documentation/mm/vmalloced-kernel-stacks.rst
  5                                                     5 
  6 :翻译:                                            6 :翻译:
  7                                                     7 
  8  司延腾 Yanteng Si <siyanteng@loongson.cn>        8  司延腾 Yanteng Si <siyanteng@loongson.cn>
  9                                                     9 
 10 :校译:                                           10 :校译:
 11                                                    11 
 12 ====================                               12 ====================
 13 支持虚拟映射的内核栈                     13 支持虚拟映射的内核栈
 14 ====================                               14 ====================
 15                                                    15 
 16 :作者: Shuah Khan <skhan@linuxfoundation.org>     16 :作者: Shuah Khan <skhan@linuxfoundation.org>
 17                                                    17 
 18 .. contents:: :local:                              18 .. contents:: :local:
 19                                                    19 
 20 概览                                             20 概览
 21 ----                                               21 ----
 22                                                    22 
 23 这是介绍 `虚拟映射内核栈功能 <htt     23 这是介绍 `虚拟映射内核栈功能 <https://lwn.net/Articles/694348/>` 的代码
 24 和原始补丁系列的信息汇总。            24 和原始补丁系列的信息汇总。
 25                                                    25 
 26 简介                                             26 简介
 27 ----                                               27 ----
 28                                                    28 
 29 内核堆栈溢出通常难以调试,并使     29 内核堆栈溢出通常难以调试,并使内核容易被(恶意)利用。问题可能在稍后的时间出现,使其难以
 30 隔离和究其根本原因。                     30 隔离和究其根本原因。
 31                                                    31 
 32 带有保护页的虚拟映射内核堆栈如     32 带有保护页的虚拟映射内核堆栈如果溢出,会被立即捕获,而不会放任其导致难以诊断的损
 33 坏。                                             33 坏。
 34                                                    34 
 35 HAVE_ARCH_VMAP_STACK和VMAP_STACK配置选项     35 HAVE_ARCH_VMAP_STACK和VMAP_STACK配置选项能够支持带有保护页的虚拟映射堆栈。
 36 当堆栈溢出时,这个特性会引发可     36 当堆栈溢出时,这个特性会引发可靠的异常。溢出后堆栈跟踪的可用性以及对溢出本身的
 37 响应取决于架构。                           37 响应取决于架构。
 38                                                    38 
 39 .. note::                                          39 .. note::
 40         截至本文撰写时, arm64, powerp     40         截至本文撰写时, arm64, powerpc, riscv, s390, um, 和 x86 支持VMAP_STACK。
 41                                                    41 
 42 HAVE_ARCH_VMAP_STACK                               42 HAVE_ARCH_VMAP_STACK
 43 --------------------                               43 --------------------
 44                                                    44 
 45 能够支持虚拟映射内核栈的架构应     45 能够支持虚拟映射内核栈的架构应该启用这个bool配置选项。要求是:
 46                                                    46 
 47 - vmalloc空间必须大到足以容纳许多     47 - vmalloc空间必须大到足以容纳许多内核堆栈。这可能排除了许多32位架构。
 48 - vmalloc空间的堆栈需要可靠地工作     48 - vmalloc空间的堆栈需要可靠地工作。例如,如果vmap页表是按需创建的,当堆栈指向
 49   具有未填充页表的虚拟地址时,     49   具有未填充页表的虚拟地址时,这种机制需要工作,或者架构代码(switch_to()和
 50   switch_mm(),很可能)需要确保堆栈     50   switch_mm(),很可能)需要确保堆栈的页表项在可能未填充的堆栈上运行之前已经填
 51   充。                                           51   充。
 52 - 如果堆栈溢出到一个保护页,就     52 - 如果堆栈溢出到一个保护页,就应该发生一些合理的事情。“合理”的定义是灵活的,但
 53   在没有记录任何东西的情况下立     53   在没有记录任何东西的情况下立即重启是不友好的。
 54                                                    54 
 55 VMAP_STACK                                         55 VMAP_STACK
 56 ----------                                         56 ----------
 57                                                    57 
 58 VMAP_STACK bool配置选项在启用时分配     58 VMAP_STACK bool配置选项在启用时分配虚拟映射的任务栈。这个选项依赖于
 59 HAVE_ARCH_VMAP_STACK。                            59 HAVE_ARCH_VMAP_STACK。
 60                                                    60 
 61 - 如果你想使用带有保护页的虚拟     61 - 如果你想使用带有保护页的虚拟映射的内核堆栈,请启用该选项。这将导致内核栈溢出
 62   被立即捕获,而不是难以诊断的     62   被立即捕获,而不是难以诊断的损坏。
 63                                                    63 
 64 .. note::                                          64 .. note::
 65                                                    65 
 66         使用KASAN的这个功能需要架构     66         使用KASAN的这个功能需要架构支持用真实的影子内存来支持虚拟映射,并且
 67         必须启用KASAN_VMALLOC。               67         必须启用KASAN_VMALLOC。
 68                                                    68 
 69 .. note::                                          69 .. note::
 70                                                    70 
 71         启用VMAP_STACK时,无法在堆栈     71         启用VMAP_STACK时,无法在堆栈分配的数据上运行DMA。
 72                                                    72 
 73 内核配置选项和依赖性不断变化。     73 内核配置选项和依赖性不断变化。请参考最新的代码库:
 74                                                    74 
 75 `Kconfig <https://git.kernel.org/pub/scm/linux     75 `Kconfig <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/Kconfig>`
 76                                                    76 
 77 分配方法                                       77 分配方法
 78 --------                                           78 --------
 79                                                    79 
 80 当一个新的内核线程被创建时,线     80 当一个新的内核线程被创建时,线程堆栈是由页级分配器分配的虚拟连续的内存页组成。这
 81 些页面被映射到有PAGE_KERNEL保护的     81 些页面被映射到有PAGE_KERNEL保护的连续的内核虚拟空间。
 82                                                    82 
 83 alloc_thread_stack_node()调用__vmalloc_node_     83 alloc_thread_stack_node()调用__vmalloc_node_range()来分配带有PAGE_KERNEL
 84 保护的栈。                                    84 保护的栈。
 85                                                    85 
 86 - 分配的堆栈被缓存起来,以后会     86 - 分配的堆栈被缓存起来,以后会被新的线程重用,所以在分配/释放堆栈给任务时,要手动
 87   进行memcg核算。因此,__vmalloc_node_     87   进行memcg核算。因此,__vmalloc_node_range被调用时没有__GFP_ACCOUNT。
 88 - vm_struct被缓存起来,以便能够找     88 - vm_struct被缓存起来,以便能够找到在中断上下文中启动的空闲线程。 free_thread_stack()
 89   可以在中断上下文中调用。             89   可以在中断上下文中调用。
 90 - 在arm64上,所有VMAP的堆栈都需要     90 - 在arm64上,所有VMAP的堆栈都需要有相同的对齐方式,以确保VMAP的堆栈溢出检测正常
 91   工作。架构特定的vmap堆栈分配器     91   工作。架构特定的vmap堆栈分配器照顾到了这个细节。
 92 - 这并不涉及中断堆栈--参考原始补     92 - 这并不涉及中断堆栈--参考原始补丁
 93                                                    93 
 94 线程栈分配是由clone()、fork()、vfork(     94 线程栈分配是由clone()、fork()、vfork()、kernel_thread()通过kernel_clone()
 95 启动的。留点提示在这,以便搜索     95 启动的。留点提示在这,以便搜索代码库,了解线程栈何时以及如何分配。
 96                                                    96 
 97 大量的代码是在:                             97 大量的代码是在:
 98 `kernel/fork.c <https://git.kernel.org/pub/scm     98 `kernel/fork.c <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/fork.c>`.
 99                                                    99 
100 task_struct中的stack_vm_area指针可以跟    100 task_struct中的stack_vm_area指针可以跟踪虚拟分配的堆栈,一个非空的stack_vm_area
101 指针可以表明虚拟映射的内核堆栈    101 指针可以表明虚拟映射的内核堆栈已经启用。
102                                                   102 
103 ::                                                103 ::
104                                                   104 
105         struct vm_struct *stack_vm_area;          105         struct vm_struct *stack_vm_area;
106                                                   106 
107 堆栈溢出处理                                107 堆栈溢出处理
108 ------------                                      108 ------------
109                                                   109 
110 前守护页和后守护页有助于检测堆    110 前守护页和后守护页有助于检测堆栈溢出。当堆栈溢出到守护页时,处理程序必须小心不要再
111 次溢出堆栈。当处理程序被调用时    111 次溢出堆栈。当处理程序被调用时,很可能只留下很少的堆栈空间。
112                                                   112 
113 在x86上,这是通过处理表明内核堆    113 在x86上,这是通过处理表明内核堆栈溢出的双异常堆栈的缺页异常来实现的。
114                                                   114 
115 用守护页测试VMAP分配                      115 用守护页测试VMAP分配
116 --------------------                              116 --------------------
117                                                   117 
118 我们如何确保VMAP_STACK在分配时确实    118 我们如何确保VMAP_STACK在分配时确实有前守护页和后守护页的保护?下面的 lkdtm 测试
119 可以帮助检测任何回归。                 119 可以帮助检测任何回归。
120                                                   120 
121 ::                                                121 ::
122                                                   122 
123         void lkdtm_STACK_GUARD_PAGE_LEADING()     123         void lkdtm_STACK_GUARD_PAGE_LEADING()
124         void lkdtm_STACK_GUARD_PAGE_TRAILING()    124         void lkdtm_STACK_GUARD_PAGE_TRAILING()
125                                                   125 
126 结论                                            126 结论
127 ----                                              127 ----
128                                                   128 
129 - vmalloced堆栈的percpu缓存似乎比高    129 - vmalloced堆栈的percpu缓存似乎比高阶堆栈分配要快一些,至少在缓存命中时是这样。
130 - THREAD_INFO_IN_TASK完全摆脱了arch-speci    130 - THREAD_INFO_IN_TASK完全摆脱了arch-specific thread_info,并简单地将
131   thread_info(仅包含标志)和'int cpu'    131   thread_info(仅包含标志)和'int cpu'嵌入task_struct中。
132 - 一旦任务死亡,线程栈就可以被    132 - 一旦任务死亡,线程栈就可以被释放(无需等待RCU),然后,如果使用vmapped栈,就
133   可以将整个栈缓存起来,以便在    133   可以将整个栈缓存起来,以便在同一cpu上重复使用。
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php