lsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/mm/vmalloced-kernel-stacksmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/zh_TW/mm/vmalloced-kernel-stacksmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/it_IT/mm/vmalloced-kernel-stacksmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ja_JP/mm/vmalloced-kernel-stacksmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ko_KR/mm/vmalloced-kernel-stacksmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/sp_SP/mm/vmalloced-kernel-stacksmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh[/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/mm/vmalloced-kernel-stacks.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h-Documentation/mm/vmalloced-kernel-stacks.rst h]h)}(h,Documentation/mm/vmalloced-kernel-stacks.rsth]h,Documentation/mm/vmalloced-kernel-stacks.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h-司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hj hhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h校译h]h校译}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]uh1hhjPubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h支持虚拟映射的内核栈h]h支持虚拟映射的内核栈}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j{hjxhhhhhKubh)}(hhh]h)}(hhh](h)}(h作者h]h作者}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhKubh)}(h'Shuah Khan h]h)}(h&Shuah Khan h](h Shuah Khan <}(hjhhhNhNubj))}(hskhan@linuxfoundation.orgh]hskhan@linuxfoundation.org}(hjhhhNhNubah}(h]h ]h"]h$]h&]refuri mailto:skhan@linuxfoundation.orguh1j(hjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubah}(h]h ]h"]h$]h&]uh1hhjxhhhhhKubhtopic)}(hhh]h bullet_list)}(hhh](h list_item)}(hhh]h)}(hhh]j))}(hhh]h概览}(hjhhhNhNubah}(h]id7ah ]h"]h$]h&]refidid2uh1j(hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j))}(hhh]h简介}(hj hhhNhNubah}(h]id8ah ]h"]h$]h&]refidid3uh1j(hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j))}(hhh]hHAVE_ARCH_VMAP_STACK}(hj-hhhNhNubah}(h]id9ah ]h"]h$]h&]refidhave-arch-vmap-stackuh1j(hj*ubah}(h]h ]h"]h$]h&]uh1hhj'ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j))}(hhh]h VMAP_STACK}(hjOhhhNhNubah}(h]id10ah ]h"]h$]h&]refid vmap-stackuh1j(hjLubah}(h]h ]h"]h$]h&]uh1hhjIubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j))}(hhh]h 分配方法}(hjqhhhNhNubah}(h]id11ah ]h"]h$]h&]refidid4uh1j(hjnubah}(h]h ]h"]h$]h&]uh1hhjkubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j))}(hhh]h堆栈溢出处理}(hjhhhNhNubah}(h]id12ah ]h"]h$]h&]refidid5uh1j(hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j))}(hhh]h用守护页测试VMAP分配}(hjhhhNhNubah}(h]id13ah ]h"]h$]h&]refidvmapuh1j(hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hhh]h)}(hhh]j))}(hhh]h结论}(hjhhhNhNubah}(h]id14ah ]h"]h$]h&]refidid6uh1j(hjubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhhhNhNubah}(h]contentsah ](contentslocaleh"]contentsah$]h&]uh1jhhhKhjxhhubjw)}(hhh](j|)}(h概览h]h概览}(hjhhhNhNubah}(h]h ]h"]h$]h&]refidjuh1j{hjhhhhhKubh)}(h这是介绍 `虚拟映射内核栈功能 ` 的代码 和原始补丁系列的信息汇总。h](h 这是介绍 }(hjhhhNhNubhtitle_reference)}(h@`虚拟映射内核栈功能 `h]h>虚拟映射内核栈功能 }(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 的代码 和原始补丁系列的信息汇总。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]jah ]h"]概览ah$]h&]uh1jvhjxhhhhhKubjw)}(hhh](j|)}(h简介h]h简介}(hjAhhhNhNubah}(h]h ]h"]h$]h&]jjuh1j{hj>hhhhhKubh)}(h内核堆栈溢出通常难以调试,并使内核容易被(恶意)利用。问题可能在稍后的时间出现,使其难以 隔离和究其根本原因。h]h内核堆栈溢出通常难以调试,并使内核容易被(恶意)利用。问题可能在稍后的时间出现,使其难以 隔离和究其根本原因。}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj>hhubh)}(h带有保护页的虚拟映射内核堆栈如果溢出,会被立即捕获,而不会放任其导致难以诊断的损 坏。h]h带有保护页的虚拟映射内核堆栈如果溢出,会被立即捕获,而不会放任其导致难以诊断的损 坏。}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hj>hhubh)}(hHAVE_ARCH_VMAP_STACK和VMAP_STACK配置选项能够支持带有保护页的虚拟映射堆栈。 当堆栈溢出时,这个特性会引发可靠的异常。溢出后堆栈跟踪的可用性以及对溢出本身的 响应取决于架构。h]hHAVE_ARCH_VMAP_STACK和VMAP_STACK配置选项能够支持带有保护页的虚拟映射堆栈。 当堆栈溢出时,这个特性会引发可靠的异常。溢出后堆栈跟踪的可用性以及对溢出本身的 响应取决于架构。}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hj>hhubh)}(hU截至本文撰写时, arm64, powerpc, riscv, s390, um, 和 x86 支持VMAP_STACK。h]h)}(hj{h]hU截至本文撰写时, arm64, powerpc, riscv, s390, um, 和 x86 支持VMAP_STACK。}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hjyubah}(h]h ]h"]h$]h&]uh1hhj>hhhhhNubeh}(h]jah ]h"]简介ah$]h&]uh1jvhjxhhhhhKubjw)}(hhh](j|)}(hHAVE_ARCH_VMAP_STACKh]hHAVE_ARCH_VMAP_STACK}(hjhhhNhNubah}(h]h ]h"]h$]h&]jj6uh1j{hjhhhhhK+ubh)}(hY能够支持虚拟映射内核栈的架构应该启用这个bool配置选项。要求是:h]hY能够支持虚拟映射内核栈的架构应该启用这个bool配置选项。要求是:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjhhubj)}(hhh](j)}(h`vmalloc空间必须大到足以容纳许多内核堆栈。这可能排除了许多32位架构。h]h)}(hjh]h`vmalloc空间必须大到足以容纳许多内核堆栈。这可能排除了许多32位架构。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hXGvmalloc空间的堆栈需要可靠地工作。例如,如果vmap页表是按需创建的,当堆栈指向 具有未填充页表的虚拟地址时,这种机制需要工作,或者架构代码(switch_to()和 switch_mm(),很可能)需要确保堆栈的页表项在可能未填充的堆栈上运行之前已经填 充。h]h)}(hXGvmalloc空间的堆栈需要可靠地工作。例如,如果vmap页表是按需创建的,当堆栈指向 具有未填充页表的虚拟地址时,这种机制需要工作,或者架构代码(switch_to()和 switch_mm(),很可能)需要确保堆栈的页表项在可能未填充的堆栈上运行之前已经填 充。h]hXGvmalloc空间的堆栈需要可靠地工作。例如,如果vmap页表是按需创建的,当堆栈指向 具有未填充页表的虚拟地址时,这种机制需要工作,或者架构代码(switch_to()和 switch_mm(),很可能)需要确保堆栈的页表项在可能未填充的堆栈上运行之前已经填 充。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h如果堆栈溢出到一个保护页,就应该发生一些合理的事情。“合理”的定义是灵活的,但 在没有记录任何东西的情况下立即重启是不友好的。 h]h)}(h如果堆栈溢出到一个保护页,就应该发生一些合理的事情。“合理”的定义是灵活的,但 在没有记录任何东西的情况下立即重启是不友好的。h]h如果堆栈溢出到一个保护页,就应该发生一些合理的事情。“合理”的定义是灵活的,但 在没有记录任何东西的情况下立即重启是不友好的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhK/hjhhubeh}(h]j<ah ]h"]have_arch_vmap_stackah$]h&]uh1jvhjxhhhhhK+ubjw)}(hhh](j|)}(h VMAP_STACKh]h VMAP_STACK}(hjhhhNhNubah}(h]h ]h"]h$]h&]jjXuh1j{hjhhhhhK8ubh)}(huVMAP_STACK bool配置选项在启用时分配虚拟映射的任务栈。这个选项依赖于 HAVE_ARCH_VMAP_STACK。h]huVMAP_STACK bool配置选项在启用时分配虚拟映射的任务栈。这个选项依赖于 HAVE_ARCH_VMAP_STACK。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjhhubj)}(hhh]j)}(h如果你想使用带有保护页的虚拟映射的内核堆栈,请启用该选项。这将导致内核栈溢出 被立即捕获,而不是难以诊断的损坏。 h]h)}(h如果你想使用带有保护页的虚拟映射的内核堆栈,请启用该选项。这将导致内核栈溢出 被立即捕获,而不是难以诊断的损坏。h]h如果你想使用带有保护页的虚拟映射的内核堆栈,请启用该选项。这将导致内核栈溢出 被立即捕获,而不是难以诊断的损坏。}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hj1ubah}(h]h ]h"]h$]h&]uh1jhj.hhhhhNubah}(h]h ]h"]h$]h&]jjuh1jhhhK=hjhhubh)}(h使用KASAN的这个功能需要架构支持用真实的影子内存来支持虚拟映射,并且 必须启用KASAN_VMALLOC。h]h)}(h使用KASAN的这个功能需要架构支持用真实的影子内存来支持虚拟映射,并且 必须启用KASAN_VMALLOC。h]h使用KASAN的这个功能需要架构支持用真实的影子内存来支持虚拟映射,并且 必须启用KASAN_VMALLOC。}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjOubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(hC启用VMAP_STACK时,无法在堆栈分配的数据上运行DMA。h]h)}(hjih]hC启用VMAP_STACK时,无法在堆栈分配的数据上运行DMA。}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhjgubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(hI内核配置选项和依赖性不断变化。请参考最新的代码库:h]hI内核配置选项和依赖性不断变化。请参考最新的代码库:}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjhhubh)}(h``Kconfig `h]j)}(hjh]h^Kconfig }(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhhhKKhjhhubeh}(h]j^ah ]h"] vmap_stackah$]h&]uh1jvhjxhhhhhK8ubjw)}(hhh](j|)}(h 分配方法h]h 分配方法}(hjhhhNhNubah}(h]h ]h"]h$]h&]jjzuh1j{hjhhhhhKNubh)}(h当一个新的内核线程被创建时,线程堆栈是由页级分配器分配的虚拟连续的内存页组成。这 些页面被映射到有PAGE_KERNEL保护的连续的内核虚拟空间。h]h当一个新的内核线程被创建时,线程堆栈是由页级分配器分配的虚拟连续的内存页组成。这 些页面被映射到有PAGE_KERNEL保护的连续的内核虚拟空间。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjhhubh)}(h_alloc_thread_stack_node()调用__vmalloc_node_range()来分配带有PAGE_KERNEL 保护的栈。h]h_alloc_thread_stack_node()调用__vmalloc_node_range()来分配带有PAGE_KERNEL 保护的栈。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKShjhhubj)}(hhh](j)}(h分配的堆栈被缓存起来,以后会被新的线程重用,所以在分配/释放堆栈给任务时,要手动 进行memcg核算。因此,__vmalloc_node_range被调用时没有__GFP_ACCOUNT。h]h)}(h分配的堆栈被缓存起来,以后会被新的线程重用,所以在分配/释放堆栈给任务时,要手动 进行memcg核算。因此,__vmalloc_node_range被调用时没有__GFP_ACCOUNT。h]h分配的堆栈被缓存起来,以后会被新的线程重用,所以在分配/释放堆栈给任务时,要手动 进行memcg核算。因此,__vmalloc_node_range被调用时没有__GFP_ACCOUNT。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKVhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hvm_struct被缓存起来,以便能够找到在中断上下文中启动的空闲线程。 free_thread_stack() 可以在中断上下文中调用。h]h)}(hvm_struct被缓存起来,以便能够找到在中断上下文中启动的空闲线程。 free_thread_stack() 可以在中断上下文中调用。h]hvm_struct被缓存起来,以便能够找到在中断上下文中启动的空闲线程。 free_thread_stack() 可以在中断上下文中调用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h在arm64上,所有VMAP的堆栈都需要有相同的对齐方式,以确保VMAP的堆栈溢出检测正常 工作。架构特定的vmap堆栈分配器照顾到了这个细节。h]h)}(h在arm64上,所有VMAP的堆栈都需要有相同的对齐方式,以确保VMAP的堆栈溢出检测正常 工作。架构特定的vmap堆栈分配器照顾到了这个细节。h]h在arm64上,所有VMAP的堆栈都需要有相同的对齐方式,以确保VMAP的堆栈溢出检测正常 工作。架构特定的vmap堆栈分配器照顾到了这个细节。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKZhj ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(h0这并不涉及中断堆栈--参考原始补丁 h]h)}(h/这并不涉及中断堆栈--参考原始补丁h]h/这并不涉及中断堆栈--参考原始补丁}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK\hj"ubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jhhhKVhjhhubh)}(h线程栈分配是由clone()、fork()、vfork()、kernel_thread()通过kernel_clone() 启动的。留点提示在这,以便搜索代码库,了解线程栈何时以及如何分配。h]h线程栈分配是由clone()、fork()、vfork()、kernel_thread()通过kernel_clone() 启动的。留点提示在这,以便搜索代码库,了解线程栈何时以及如何分配。}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hjhhubh)}(h大量的代码是在: `kernel/fork.c `.h](h大量的代码是在: }(hjNhhhNhNubj)}(hg`kernel/fork.c `h]hekernel/fork.c }(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubh.}(hjNhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKahjhhubh)}(htask_struct中的stack_vm_area指针可以跟踪虚拟分配的堆栈,一个非空的stack_vm_area 指针可以表明虚拟映射的内核堆栈已经启用。h]htask_struct中的stack_vm_area指针可以跟踪虚拟分配的堆栈,一个非空的stack_vm_area 指针可以表明虚拟映射的内核堆栈已经启用。}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhjhhubh literal_block)}(h struct vm_struct *stack_vm_area;h]h struct vm_struct *stack_vm_area;}hj~sbah}(h]h ]h"]h$]h&]hhuh1j|hhhKihjhhubeh}(h]jah ]h"] 分配方法ah$]h&]uh1jvhjxhhhhhKNubjw)}(hhh](j|)}(h堆栈溢出处理h]h堆栈溢出处理}(hjhhhNhNubah}(h]h ]h"]h$]h&]jjuh1j{hjhhhhhKlubh)}(h前守护页和后守护页有助于检测堆栈溢出。当堆栈溢出到守护页时,处理程序必须小心不要再 次溢出堆栈。当处理程序被调用时,很可能只留下很少的堆栈空间。h]h前守护页和后守护页有助于检测堆栈溢出。当堆栈溢出到守护页时,处理程序必须小心不要再 次溢出堆栈。当处理程序被调用时,很可能只留下很少的堆栈空间。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnhjhhubh)}(hf在x86上,这是通过处理表明内核堆栈溢出的双异常堆栈的缺页异常来实现的。h]hf在x86上,这是通过处理表明内核堆栈溢出的双异常堆栈的缺页异常来实现的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhjhhubeh}(h]jah ]h"]堆栈溢出处理ah$]h&]uh1jvhjxhhhhhKlubjw)}(hhh](j|)}(h用守护页测试VMAP分配h]h用守护页测试VMAP分配}(hjhhhNhNubah}(h]h ]h"]h$]h&]jjuh1j{hjhhhhhKtubh)}(h我们如何确保VMAP_STACK在分配时确实有前守护页和后守护页的保护?下面的 lkdtm 测试 可以帮助检测任何回归。h]h我们如何确保VMAP_STACK在分配时确实有前守护页和后守护页的保护?下面的 lkdtm 测试 可以帮助检测任何回归。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKvhjhhubj})}(hLvoid lkdtm_STACK_GUARD_PAGE_LEADING() void lkdtm_STACK_GUARD_PAGE_TRAILING()h]hLvoid lkdtm_STACK_GUARD_PAGE_LEADING() void lkdtm_STACK_GUARD_PAGE_TRAILING()}hjsbah}(h]h ]h"]h$]h&]hhuh1j|hhhK{hjhhubeh}(h]jah ]h"]用守护页测试vmap分配ah$]h&]uh1jvhjxhhhhhKtubjw)}(hhh](j|)}(h结论h]h结论}(hjhhhNhNubah}(h]h ]h"]h$]h&]jjuh1j{hjhhhhhKubj)}(hhh](j)}(hlvmalloced堆栈的percpu缓存似乎比高阶堆栈分配要快一些,至少在缓存命中时是这样。h]h)}(hjh]hlvmalloced堆栈的percpu缓存似乎比高阶堆栈分配要快一些,至少在缓存命中时是这样。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubj)}(hTHREAD_INFO_IN_TASK完全摆脱了arch-specific thread_info,并简单地将 thread_info(仅包含标志)和'int cpu'嵌入task_struct中。h]h)}(hTHREAD_INFO_IN_TASK完全摆脱了arch-specific thread_info,并简单地将 thread_info(仅包含标志)和'int cpu'嵌入task_struct中。h]hTHREAD_INFO_IN_TASK完全摆脱了arch-specific thread_info,并简单地将 thread_info(仅包含标志)和’int cpu’嵌入task_struct中。}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj&ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubj)}(h一旦任务死亡,线程栈就可以被释放(无需等待RCU),然后,如果使用vmapped栈,就 可以将整个栈缓存起来,以便在同一cpu上重复使用。h]h)}(h一旦任务死亡,线程栈就可以被释放(无需等待RCU),然后,如果使用vmapped栈,就 可以将整个栈缓存起来,以便在同一cpu上重复使用。h]h一旦任务死亡,线程栈就可以被释放(无需等待RCU),然后,如果使用vmapped栈,就 可以将整个栈缓存起来,以便在同一cpu上重复使用。}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj>ubah}(h]h ]h"]h$]h&]uh1jhj hhhhhNubeh}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubeh}(h]jah ]h"]结论ah$]h&]uh1jvhjxhhhhhKubeh}(h]id1ah ]h"]支持虚拟映射的内核栈ah$]h&]uh1jvhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j{N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jhjejjj;jjjj j<jj^jjjjjjj`ju nametypes}(jhjj;jj jjjjj`uh}(jejxjjjjjj>j<jj^jjjjjjjjjjjjj j6j-jXjOjzjqjjjjjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages] transformerN include_log]?Documentation/translations/zh_CN/mm/vmalloced-kernel-stacks.rst(NNNNta decorationNhhub.