尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux 内核 KFENCE:低开销采样式堆内存安全检测工具的原理、配置与实战

Linux 内核 KFENCE:低开销采样式堆内存安全检测工具的原理、配置与实战 Linux 内核 KFENCE低开销采样式堆内存安全检测工具的原理、配置与实战【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linuxKFENCEKernel Electric-Fence是 Linux 内核中一个基于采样的低开销堆内存安全错误检测器能够发现堆越界访问OOB、释放后使用UAF以及非法释放如 double-free三类错误且设计上允许直接部署到生产内核。本文以仓库中的 KFENCE 官方文档 为主体结合 mm/kfence 目录下的核心实现core.c、report.c、Kconfig 定义 与 公共接口完整讲解其启用方式、运行时调优参数、内存池布局与页面保护机制、错误报告解读以及调试接口帮助读者在生产环境中低成本地启用并排查内核堆内存安全漏洞。一、设计目标为什么生产环境需要 KFENCE根据 官方文档 的表述KFENCE 的设计初衷可以归纳为三点近零性能开销KFENCE 面向生产内核production kernels设计采用采样而非全量插桩因此相比 KASAN依赖编译器插桩开销极低用精度换覆盖时长KFENCE 对单个分配事件的检测概率低于 KASAN但只要有足够的总运行时间它就能命中非生产测试负载难以覆盖到的代码路径规模化部署快速累积总运行时间的手段之一是把该工具部署到大规模机器集群fleet中。这一取舍在 lib/Kconfig.kfence 的 help 文本中同样被强调“KFENCE is not a substitute for explicit testing with tools such as KASAN”KFENCE 不能替代 KASAN 之类的显式测试工具。Kconfig 的推荐策略是测试环境用得起 KASAN 就继续用 KASAN面向生产、因开销无法开启 KASAN 的内核考虑启用 KFENCE。文档同时指出其用户态思想来源GWP-ASan采样 保护页KFENCE 直接受其影响堪称其“内核兄弟”以及 Electric Fence malloc 调试器同名来源非采样方式。二、编译配置从 Kconfig 到运行时开关2.1 基础启用启用 KFENCE 只需在 defconfig 或交互式配置中打开CONFIG_KFENCEy若要“编译进内核但默认关闭”需要时可动态开启则配置为CONFIG_KFENCEy CONFIG_KFENCE_SAMPLE_INTERVAL0此时只有把启动参数kfence.sample_interval设为非零值才会真正激活 KFENCE。2.2 完整配置项清单来自 lib/Kconfig.kfencelib/Kconfig.kfence 定义了以下选项默认值与取值范围均可从源码直接确认配置项类型/默认值作用CONFIG_KFENCEbool依赖HAVE_ARCH_KFENCE自动 selectSTACKTRACE和IRQ_WORK主开关。依赖HAVE_ARCH_KFENCE是因为各架构需提供页面保护原语CONFIG_KFENCE_SAMPLE_INTERVALint默认 100毫秒默认采样间隔设为 0 则默认关闭仅可通过启动参数kfence.sample_interval打开CONFIG_KFENCE_NUM_OBJECTSintrange 1–65535默认 255受保护对象数量上限每个对象需要 2 个页1 个对象页 两侧保护页CONFIG_KFENCE_DEFERRABLEbool默认 N使用可延迟定时器触发采样避免系统空闲时强制唤醒 CPU开启会导致 KUnit 测试大概率失败采样间隔不可预测CONFIG_KFENCE_STATIC_KEYSbool仅 EXPERT依赖JUMP_LABEL用 static keystatic branch门控分配路径适合超大采样间隔场景文档与 help 均提醒启用/禁用 static key 会触发 IPI 广播性能影响需实测评估CONFIG_KFENCE_STRESS_TEST_FAULTSint默认 0仅 EXPERT随机保护对象页、制造“虚假 UAF”用于压力测试 KFENCE 自身的并发报错逻辑非 KFENCE 开发者请保持 0CONFIG_KFENCE_KUNIT_TESTtristate默认跟随KUNIT_ALL_TESTS依赖TRACEPOINTS与KUNITKUnit 集成测试套件见 mm/kfence/kfence_test.cY 表示编入内核并在启动时运行M 表示做成模块2.3 运行时动态开启/关闭从 core.c 的参数解析代码param_set_sample_interval约 L66-L90可以看到一个文档未展开的细节kfence.sample_interval通过module_param_cb注册为模块参数前缀kfence.因此不仅可以在启动参数中设置也可以在运行时通过 sysfs 写入写入0若 KFENCE 当前已启用则打印 disabled 并关闭WRITE_ONCE(kfence_enabled, false)在启动后写入非零值会调用kfence_enable_late()此时内核已通过 memblock 之外的路径alloc_contig_pages或alloc_pages_exact见kfence_init_late()约 L998-L1065分配内存池再启用若系统启用了 KASAN 硬件标签kasan_hw_tags_enabled()即 MTEKFENCE 会主动拒绝启用并打印 disabled as KASAN HW tags are enabled——因为 KFENCE 尚不支持与 MTE 共存见kfence_alloc_pool_and_metadata()约 L917-L955。注意CONFIG_KFENCE_STRESS_TEST_FAULTS等 EXPERT 选项只应在 KFENCE 开发/测试场景使用普通部署保持默认即可。三、性能调优采样间隔、Burst 模式与定时器行为3.1kfence.sample_interval最核心的参数采样间隔毫秒决定堆分配被 KFENCE 保护的频率。默认值由CONFIG_KFENCE_SAMPLE_INTERVAL提供可被启动参数kfence.sample_interval覆盖设为 0 即禁用 KFENCE。其工作机制可从 core.c 的toggle_allocation_gate()约 L894-L913确认一个delayed_work定时任务在每个采样间隔到期时把原子门kfence_allocation_gate置为-burst放行一个或若干个分配进入 KFENCE 池随后重新排队msecs_to_jiffies(kfence_sample_interval)后的下一次触发。分配路径include/linux/kfence.h 中的内联kfence_alloc()先查 static branch再读kfence_allocation_gate只有窗口打开的分配才会被__kfence_alloc()接管。3.2kfence.deferrable空闲系统节能开关默认情况下为保证采样间隔可预测定时器会在系统完全空闲时也唤醒 CPU。在功耗受限系统上可用启动参数kfence.deferrable1切换为 deferrable timer代价是采样间隔变得不可预测。默认值由CONFIG_KFENCE_DEFERRABLE控制源码中对应kfence_deferrable变量core.c L115-L116。官方警告使用 deferrable timer 时 KUnit 测试套件很可能失败因为它依赖稳定的采样间隔。3.3kfence.burstBurst 模式默认每个采样间隔只采样1 个堆分配。设置kfence.burstN非零后每个采样间隔内会连续放行1 N个分配。源码中toggle_allocation_gate()将 gate 初始化为-kfence_burst__kfence_alloc()中atomic_inc_return(kfence_allocation_gate) 1即被拒绝core.c 约 L1175-L1177实现了“连续 N1 个”的窗口。3.4 内存池大小与CONFIG_KFENCE_NUM_OBJECTSKFENCE 内存池是固定大小的池耗尽后不再产生新的受保护分配。include/linux/kfence.h 第 27 行给出精确公式#define KFENCE_POOL_SIZE ((CONFIG_KFENCE_NUM_OBJECTS 1) * 2 * PAGE_SIZE)即文档中的( #objects 1 ) * 2 * PAGE_SIZE按默认 255 个对象、4 KiB 页大小计算池大小 256 × 2 × 4 KiB 2 MiB。文档还特别提醒在支持大页huge pages的架构上KFENCE 会强制池内使用PAGE_SIZE大小的页从而额外分配页表。以 x86 为例arch/x86/include/asm/kfence.h 的arch_kfence_init_pool()会遍历池内地址对非 4K 映射调用set_memory_4k()拆开大页。四、内存布局对象页、Guard Page 与 Pattern-based Redzone4.1 页面布局图文档给出的页布局示意如下O/B侧为对象/边界J/C/T/E为对象内存区间RED-ZONE为红区------------------------------------------------------------- | xxxxxxxxx | O : | xxxxxxxxx | : O | xxxxxxxxx | | xxxxxxxxx | B : | xxxxxxxxx | : B | xxxxxxxxx | | x GUARD x | J : RED- | x GUARD x | RED- : J | x GUARD x | | xxxxxxxxx | E : ZONE | xxxxxxxxx | ZONE : E | xxxxxxxxx | | xxxxxxxxx | C : | xxxxxxxxx | : C | xxxxxxxxx | | xxxxxxxxx | T : | xxxxxxxxx | : T | xxxxxxxxx | -------------------------------------------------------------含义拆解对象页每个 KFENCE 对象独占一页且被随机放置在页的左边界或右边界kfence_guarded_alloc()中random_right_allocate get_random_u32_below(2)core.c 约 L433-L484。这使相邻对象页天然形成保护边界Guard Page对象页左右两侧的页被设为受保护状态页表项置为 not-present任何访问都触发缺页异常由 KFENCE 拦截并上报越界访问Pattern-based Redzone对象页内对象本身之外的区域填充地址相关的 canary 模式mm/kfence/kfence.h 中KFENCE_CANARY_PATTERN_U8(addr) 0xaa ^ (addr 0x7)用于捕获写到对象页内部但未跨页的越界写。红区检查发生在释放时check_canary()core.c 约 L378-L423因此在无保护一侧的 OOB 写要等到 free 才能被发现。文档解释为何对象两侧都需要红区通常只有未受 guard 的一侧需要红区但由于 KFENCE 必须满足 slab cache 要求的对齐特殊对齐可能使对象两侧都出现未被覆盖的空隙这些空隙全部被标记为红区。4.2 保护页的实现以 x86 为例arch/x86/include/asm/kfence.h 的kfence_protect_page()L41-L89展示了保护原语直接翻转 PTE 的_PAGE_PRESENT位使页面 not-present并特意使用flip_protnone_guard()避免写出 L1TF 易受攻击的 PTE解除保护时不刷 TLBPRESENT 页的旧 TLB 项无害保护时只 best-effort 刷本 CPU TLBflush_tlb_one_kernel以避免 IPI——因为 KFENCE 的分配/缺页路径可能处于关中断上下文。这正是文档中“KFENCE 优雅处理缺页并标记页面为可访问让出错代码继续错误地执行”的底层机制。4.3 释放、复用与 UAF 检测从kfence_guarded_free()core.c 约 L525-L597可以确认文档描述的完整流程校验对象状态与地址若发现非法/重复释放直接生成KFENCE_ERROR_INVALID_FREE报告若此前发生过 OOBmeta-unprotected_page记录了被临时解封的页先清零并重新保护该页标记状态为KFENCE_OBJECT_FREED从 freelist 角度解绑覆盖计数检查 canary 红区check_canary(meta)发现被改写即上报 memory corruption若 cache 设置 init-on-free 则清零对象内存再把对象页重新保护此后任何访问触发 UAF 缺页把对象挂到 freelist尾部——源码注释明确说明这是为了让“最近被释放的对象最先被复用”从而提高捕获近期 UAF 的概率。对于SLAB_TYPESAFE_BY_RCUcache__kfence_free()core.c 约 L1238-L1260会将真正释放推迟到 RCU 宽限期call_rcu(meta-rcu_head, rcu_guarded_free)状态机中的KFENCE_OBJECT_RCU_FREEING即为此设计。4.4 采样门控静态键 vs 动态分支文档“Implementation Details”一节描述启用CONFIG_KFENCE_STATIC_KEYSy时分配路径通过 static branch 门控定时器切换 static key 以重定向分配。include/linux/kfence.h 的内联kfence_alloc()L118-L130直观体现了两种模式#if defined(CONFIG_KFENCE_STATIC_KEYS) || CONFIG_KFENCE_SAMPLE_INTERVAL 0 if (!static_branch_unlikely(kfence_allocation_key)) return NULL; #else if (!static_branch_likely(kfence_allocation_key)) return NULL; #endif即静态键模式下分支“几乎永远不走 KFENCE”而非静态键模式下分支“几乎永远不走慢路径”。core.c 中toggle_allocation_gate()的注释还提示static branch 切换会向所有 CPU 发 2 轮 IPI若未来采样间隔更激进可考虑无 IPI 的变体。文档同样建议“仔细做基准测试Careful benchmarking is recommended”后再选择该选项。五、错误报告五种错误类型与真实输出样例5.1kfence.fault报告后行为启动参数kfence.fault控制检出错误后的行为解析代码见 report.c 的early_kfence_fault()L37-L53kfence.faultreport打印报告并继续默认kfence.faultoops打印报告并触发 oops源码中为BUG()kfence.faultpanic打印报告并 panic。此外文档提到可将panic_on_warn设为 1使报告阶段的check_panic_on_warn(KFENCE)report.c L305直接 panic。每次报错还会执行add_taint(TAINT_BAD_PAGE, LOCKDEP_STILL_OK)给内核打污点标记。5.2 越界读out-of-bounds read BUG: KFENCE: out-of-bounds read in test_out_of_bounds_read0xa6/0x234 Out-of-bounds read at 0xffff8c3f2e291fff (1B left of kfence-#72): test_out_of_bounds_read0xa6/0x234 kunit_try_run_case0x61/0xa0 kunit_generic_run_threadfn_adapter0x16/0x30 kthread0x176/0x1b0 ret_from_fork0x22/0x30 kfence-#72: 0xffff8c3f2e292000-0xffff8c3f2e29201f, size32, cachekmalloc-32 allocated by task 484 on cpu 0 at 32.919330s: test_alloc0xfe/0x738 test_out_of_bounds_read0x9b/0x234 kunit_try_run_case0x61/0xa0 kunit_generic_run_threadfn_adapter0x16/0x30 kthread0x176/0x1b0 ret_from_fork0x22/0x30 CPU: 0 PID: 484 Comm: kunit_try_catch Not tainted 5.13.0-rc3 #7 Hardware name: QEMU Standard PC (i440FX PIIX, 1996), BIOS 1.14.0-2 04/01/2014 报告头给出涉事函数摘要随后是访问详情与来源。注意真实内核地址仅在启动参数带no_hash_pointers时才会显示否则经过指针哈希混淆。从 core.c 的kfence_handle_page_fault()约 L1262-L1337可以看到报告生成逻辑命中偶数索引页对象页报 UAF命中奇数索引页红区/保护页则向两侧各查一页的 metadata按距离对象越界位置较近的一方上报 OOB 及偏移量“1B left of kfence-#72” 即来源于此完全无法关联到对象时上报 invalid access。5.3 释放后使用use-after-free BUG: KFENCE: use-after-free read in test_use_after_free_read0xb3/0x143 Use-after-free read at 0xffff8c3f2e2a0000 (in kfence-#79): test_use_after_free_read0xb3/0x143 kunit_try_run_case0x61/0xa0 kunit_generic_run_threadfn_adapter0x16/0x30 kthread0x176/0x1b0 ret_from_fork0x22/0x30 kfence-#79: 0xffff8c3f2e2a0000-0xffff8c3f2e2a001f, size32, cachekmalloc-32 allocated by task 488 on cpu 2 at 33.871326s: test_alloc0xfe/0x738 test_use_after_free_read0x76/0x143 ...分配栈 freed by task 488 on cpu 2 at 33.871358s: test_use_after_free_read0xa8/0x143 ...释放栈 CPU: 2 PID: 488 Comm: kunit_try_catch Tainted: G B 5.13.0-rc3 #7 UAF 报告比 OOB 多一段 “freed by” 信息——这正是 metadata 中alloc_track/free_track双份栈记录mm/kfence/kfence.h 的struct kfence_track含 pid、cpu、时间戳和最多 64 层栈的作用。report.c 的kfence_print_stack()还会把时间戳换算为相对当前时刻的“N 秒前”方便判断 UAF 距释放发生多久。5.4 非法释放invalid free如 double-free BUG: KFENCE: invalid free in test_double_free0xdc/0x171 Invalid free of 0xffff8c3f2e2a4000 (in kfence-#81): test_double_free0xdc/0x171 ... kfence-#81: 0xffff8c3f2e2a4000-0xffff8c3f2e2a401f, size32, cachekmalloc-32 allocated by task 490 on cpu 1 at 34.175321s: ... freed by task 490 on cpu 1 at 34.175348s: ... CPU: 1 PID: 490 Comm: kunit_try_catch Tainted: G B 5.13.0-rc3 #7 该报告由kfence_guarded_free()在发现!kfence_obj_allocated(meta)时触发错误类型KFENCE_ERROR_INVALID_FREE。5.5 红区损坏memory corruption释放时检出 BUG: KFENCE: memory corruption in test_kmalloc_aligned_oob_write0xef/0x184 Corrupted memory at 0xffff8c3f2e33aff9 [ 0xac . . . . . . ] (in kfence-#156): test_kmalloc_aligned_oob_write0xef/0x184 ... kfence-#156: 0xffff8c3f2e33afb0-0xffff8c3f2e33aff8, size73, cachekmalloc-96 allocated by task 502 on cpu 7 at 42.159302s: ... CPU: 7 PID: 502 Comm: kunit_try_catch Tainted: G B 5.13.0-rc3 #7 方括号内是损坏字节可视化0xac表示偏移 0 处被写入的字节.表示未触及的字节。report.c 的print_diff_canary()L188-L208说明了打印规则内核未以no_hash_pointers启动时被改写字节显示为!而非真实值避免在非调试内核中泄露内存内容。5.6 无法定位对象的非法访问 BUG: KFENCE: invalid read in test_invalid_access0x26/0xe0 Invalid read at 0xffffffffb670b00a: test_invalid_access0x26/0xe0 ... CPU: 4 PID: 124 Comm: kunit_try_catch Tainted: G W 5.8.0-rc6 #7 当受保护页上发生访问、但无法确定关联对象时例如相邻对象页尚未分配只打印非法访问本身。源码中对应kfence_handle_page_fault()的goto out分支以meta NULL调用kfence_report_error(..., KFENCE_ERROR_INVALID)。六、池耗尽防护kfence.skip_covered_thresh与覆盖度统计文档指出当池占用率达到75%默认或更高时KFENCE 会限制“相同来源”的已覆盖分配继续占满池以在保证池不被长寿命对象如 pagecache永久占满的同时维持分配多样性。“来源”由部分分配栈轨迹判定。该阈值可通过启动参数kfence.skip_covered_thresh池占用百分比配置。core.c 中的实现细节补充了文档未展开的机制阈值判断函数should_skip_covered()L207-L212currently_allocated NUM_OBJECTS × thresh / 100时启用限制“来源”哈希取前 8 层栈UNIQUE_ALLOC_STACK_DEPTH 8经jhash并混入随机种子stack_hash_seed每次启动不同使不同机器上的碰撞模式不同化使用一个Counting Bloom filterALLOC_COVERED_HNUM 2个哈希表大小为1 (ilog2(NUM_OBJECTS) 2)记录当前被覆盖的分配来源分配时计数 1、释放时 −1在__kfence_alloc()的慢路径中gate 打开之后做检查若已在 Bloom filter 中且池接近满则跳过并计入skip_covered计数。源码注释明确说明该检查特意放在慢路径“即使可能使某个采样间隔内没有成功分配”也要换取池接近满时的合理覆盖率。七、DebugFS 接口启用 KFENCE 后且 debugfs 已挂载可在/sys/kernel/debug/kfence/下查看调试信息。从kfence_debugfs_init()core.c 约 L803-L816确认了两个文件/sys/kernel/debug/kfence/stats运行时统计。输出字段直接来自源码counter_names[]L193-L202enabled: 1 currently allocated: N # 池中当前已分配对象数 total allocations: N # 累计 KFENCE 分配总数 total frees: N # 累计释放总数 zombie allocations: N # shutdown_cache 产生的“僵尸”分配 total bugs: N # 累计检测到的错误数 skipped allocations (incompatible): N # 因大小页/非默认 zone/DMA cache 跳过 skipped allocations (capacity): N # 池耗尽跳过 skipped allocations (covered): N # 覆盖度限制跳过其中 incompatible 的跳过条件可在__kfence_alloc()L1140 起确认size PAGE_SIZE、带GFP_ZONEMASK含 DMA/DMA32、非默认 node 多节点系统以及 cache 带SLAB_SKIP_KFENCE标志的分配一律跳过。/sys/kernel/debug/kfence/objects列出所有通过 KFENCE 分配的对象包括已释放但仍在保护中的对象。每个对象的打印格式与错误报告中的kfence-#N段落一致kfence_print_object()report.c L159-L182包含地址范围、大小、所属 cache以及分配/释放两侧的 pid、CPU、时间戳与调用栈。八、分配器集成接口allocators 如何接入 KFENCE文档“Interface”一节列出的函数在 include/linux/kfence.h 中均有完整内核文档注释其职责与调用关系如下函数职责is_kfence_address()判断地址是否属于 KFENCE 池性能关键在分配器快路径中使用因此KFENCE_POOL_SIZE必须保持编译期常量kfence_alloc()插入到堆分配快路径以低概率透明返回 KFENCE 对象返回 NULL 表示照常走常规分配kfence_free()释放路径的“尝试性”钩子可传入任意对象非 KFENCE 对象返回 false分配器据此决定是否继续走常规释放__kfence_free()真正释放 KFENCE 对象要求is_kfence_address()成立对 RCU-typesafe cache 延迟到宽限期kfence_ksize()返回 KFENCE 对象分配时请求的字节数非 KFENCE 对象返回 0需改查__ksize()kfence_object_start()找到对象起始地址——普通 SLAB/SLUB 对象可以按对象大小反推KFENCE 对象因页内左/右随机放置而不能kfence_handle_page_fault()页故障处理入口地址不在池内返回 false在池内则生成报告、解封页面并返回 true 让访问继续kfence_shutdown_cache()cache 销毁前处理残留 KFENCE 对象以 SLUB 为例mm/slub.c 中的实际挂接点search_in_files确认的行号分配路径 L4978__slab_alloc快路径、L5319slow path、L7504kmem_cache_alloc_node系释放路径 L2686kfence_free(x)成功则直接返回与 L7227deferred free 队列。kfree路径同样会先尝试kfence_free。kfence_shutdown_cache()core.c L1078-L1138处理了一个容易被忽略的边界kmem_cache_destroy()遇到仍有对象的 cache 时只会报错并泄漏 cache 而不会死锁若残留的只是 KFENCE 对象KFENCE 会将其标记为“zombie allocations”——对象仍可被安全使用/释放但任何后续使用都会触发含三方栈轨迹使用者、原始分配点、shutdown_cache 调用者的 KFENCE 报告比静默泄漏更有诊断价值。debugfs 的zombie allocations计数即统计这些对象。九、测试验证KUnit 测试套件KFENCE 自带 KUnit 集成测试 mm/kfence/kfence_test.c对应CONFIG_KFENCE_KUNIT_TEST通过test_alloc、test_out_of_bounds_read、test_use_after_free_read、test_double_free、test_kmalloc_aligned_oob_write、test_invalid_access等用例覆盖上文的各类错误场景并验证报告正确输出到控制台——本文第五节的全部报告样例都出自该测试套件在 QEMUi440FX下的运行结果。使用建议与限制开启CONFIG_KFENCE_DEFERRABLE时因采样间隔不可预测KUnit 套件大概率失败Kconfig 与文档均有警告请勿在该配置下以测试通过与否判断功能报告中函数偏移、真实地址的可读性依赖no_hash_pointers启动参数生产排查时建议复现内核带上该参数它会同时暴露内核地址注意仅在可信环境使用若使用CONFIG_KFENCE_STATIC_KEYS切换 static key 伴随 IPI性能影响与采样间隔、负载、架构强相关务必按文档建议做针对性基准测试。十、KFENCE 与 KASAN 的分工文档“Related Tools”一节的结论值得直接引用KASAN 能检测 KFENCE 能检测的全部 bug 类别且更精确编译器插桩覆盖所有访问但性能代价高两者互补、面向不同环境已有测试用例或 reproducer 时KASAN 是更好的调试辅助——KFENCE 采样概率低用它调既有 bug 需要更多努力无法承受 KASAN 开销的大规模生产部署适合启用 KFENCE 去发现测试用例与 fuzzer 覆盖不到的代码路径中的 bug。小结KFENCE 用固定大小的内存池默认 255 对象、约 2 MiB、每采样间隔 1burst个受保护分配、guard page 缺页拦截与 pattern-based redzone 红区三重手段在内核中实现了近零开销的堆内存安全采样检测。掌握本文的关键操作路径即可上手CONFIG_KFENCEy启用 → 按需设置kfence.sample_interval/kfence.burst/kfence.fault→ 通过 debugfs 的 stats/objects 观察覆盖与报错 → 按报告中的分配/释放双侧栈轨迹定位缺陷来源。所有结论均可在仓库内对照验证实现主体在 mm/kfence配置项在 lib/Kconfig.kfence接口定义在 include/linux/kfence.h架构相关保护原语在各arch/*/include/asm/kfence.h。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表