1、基于eBPF和LLM样例推荐错误注入测试系统第三届 eBPF开发者大会w w w.e b p f t r a v e l.c o m中国西安西安邮电大学 大四 刘佳欢 赵嘉豪1.什么是错误注入硬件错误注入通过物理手段干扰硬件运行条件(如电压、时钟频率、电磁场等),强制芯片或电路进入异常状态。软件错误注入修改源代码或二进制代码,模拟错误发生。内核错误注入内核的异常处理代码路径往往难以通过常规测试触发。通过故障注入函数,可强制触发如磁盘 I/O 错误(should_fail_bio)、网络丢包(should_fail_skb)等场景,确保这些冷门但关键的代码路径被覆盖。第 三 届 e B P F
2、开 发 者 大 会2.内核原生错误注入框架内核原生错误注入框架是Linux内核机制,用于在运行时模拟硬件故障、软件异常等场景,验证系统的容错能力与错误处理逻辑。其核心目标是:提升内核代码的健壮性;加速异常场景的复现与调试主要技术分支:Fault-injection:内核原生支持的静态注入框架,覆盖内存分配失败、磁盘IO错误等场景。KPROBE_OVERRIDE:基于eBPF的动态注入机制,允许运行时覆盖函数返回值,灵活性更高第 三 届 e B P F 开 发 者 大 会2.1 技术分支-Fault-Injection框架支持的注入类型:内存错误:fail_page_alloc(页分配失败)、f
3、ailslab(slab分配失败);磁盘IO错误:fail_make_request(模拟块设备IO错误)、fail_io_timeout(IO超时).以及其他子系统手动实现的错误注入函数配置运行时通过debugfs动态调整触发概率、间隔等参数如:echo 10 /sys/kernel/debug/fail_page_alloc/probabilityecho 100 /sys/kernel/debug/fail_page_alloc/times上述命令会使内存分配有 10%的概率失败,最多触发100 次。第 三 届 e B P F 开 发 者 大 会第 三 届 e B P F 开 发 者 大
4、 会第 三 届 e B P F 开 发 者 大 会should_fail_alloc_pagein /mm/fail_page_alloc第 三 届 e B P F 开 发 者 大 会错误触发的属性具体结构第 三 届 e B P F 开 发 者 大 会2.2 技术分枝-(eBPF)动态错误注入基于eBPF的bpf_override_return()函数,劫持函数执行流并覆盖返回值流程 注册kprobe探测目标函数 通过eBPF程序调用bpf_override_return(),将程序计数器(PC)重定向至替代函数 跳过原函数执行,直接返回预设错误码配置内核编译时启用CONFIG_BPF_KPR
5、OBE_OVERRIDE选项;编写eBPF程序绑定目标函数,注入错误返回值(如-EIO)第 三 届 e B P F 开 发 者 大 会 (void*)58第 三 届 e B P F 开 发 者 大 会函数返回值覆盖第 三 届 e B P F 开 发 者 大 会原生限制与白名单机制 目标函数在内核源码 上 第 三 届 e B P F 开 发 者 大 会错误白名单注册#define ALLOW_ERROR_INJECTION(fname,_etype)static struct error_injection_entry _used _section(_error_injection_whitel
6、ist)_eil_addr_#fname=.addr=(unsigned long)fname,.etype=EI_ETYPE_#_etype,;error_injection_entry 结构体:表示一个错误注入白名单条目,包含两个字段:addr:函数地址,通过(unsigned long)fname 将函数名转换为地址。etype:错误类型,由 EI_ETYPE_#_etype 生成,例如 EI_ETYPE_NULL 表示空指 错误内核在启动时通过链接脚本(linker script)收集所有位于 _error_injection_whitelist