背景
ANOLISA 的 agentsight 组件用 execve tracepoint 构建 AI agent 进程树——追踪进程创建事件,识别哪些进程是 AI agent(通过 /proc 扫描 + execve tracepoint 双通道)。这是 agentsight "AI Agent Auto-Discovery" 的核心依赖之一。
agentsight 的 eBPF 程序 bpf/proctrace.bpf.c 和 bpf/procmon.bpf.c 依赖 Linux 的 sched_process_exec tracepoint 构建 process tree。
DragonOS 现状
DragonOS 的 tracepoint 框架成熟且全链路已通,但当前注册的 tracepoint 很少,且无 sched 类。
已有基础设施(可直接复用):
| 组件 |
文件 |
状态 |
| tracepoint 定义宏 |
kernel/src/tracepoint/basic_macro.rs |
define_event_trace! 宏完整——声明 tracepoint、生成 trace_<name>() 调用函数、生成 register_trace/unregister_trace、生成 .tracepoint section 元数据 |
| 自动注册 |
kernel/src/tracepoint/mod.rs |
global_init_events() 启动时扫描 .tracepoint linker section,分配 ID,建 TracePointMap(BTreeMap<u32, &TracePoint>)和 subsystem/event 层级树 |
| static key 优化 |
kernel/src/tracepoint/point.rs |
TracePoint 用 StaticFalseKey——未启用时零开销快速路径 |
| eBPF attach |
kernel/src/perf/tracepoint.rs |
perf_event_open_tracepoint() 按 tp_id 查找 tracepoint,set_bpf_prog() JIT 编译后注册为 raw_callback |
| ring buffer 输出 |
kernel/src/perf/bpf.rs、kernel/src/bpf/helper/mod.rs |
bpf_perf_event_output() helper → PerfEventArrayMap → BpfPerfEvent::write_event() 写 mmap ring buffer |
已注册的 tracepoint(共 10 个,无 sched 类):
- fuse 子系统 8 个(
kernel/src/filesystem/fuse/trace.rs)
- vfs 子系统 1 个:
do_mkdir_at(kernel/src/filesystem/vfs/vcore.rs)
- syscalls 子系统 1 个:
sys_enter_openat(kernel/src/filesystem/vfs/syscall/open_utils.rs)
execve 无 tracepoint:kernel/src/process/execve.rs 中 do_execve_internal() 包含完整 ELF 加载、shebang 递归、地址空间切换、fd_table unshare 流程,但零 trace_ 调用。
要做的事
步骤 1:声明 sched_process_exec tracepoint
新建 kernel/src/tracepoint/events/sched.rs(或在现有 sched trace 文件中添加):
define_event_trace!(
sched_process_exec,
TP_system("sched"),
fields: {
comm: [u8; 16], // 进程名(16 字节)
pid: i32, // 当前 PID
old_pid: i32, // execve 前的 PID(线程组 leader 的 tgid)
}
);
字段参考 Linux include/trace/events/sched.h 的 sched_process_exec 定义。agentsight 至少需要 comm 和 pid。
步骤 2:在 execve 中插入 trace 调用
在 kernel/src/process/execve.rs 的 do_execve_internal() 中,ELF 加载完成、新进程名已设置之后(返回成功之前),插入:
trace_sched_process_exec(&comm, pid, old_pid);
插入点选择:应在进程名已更新为新 ELF 的 comm、但控制权尚未返回用户态之前。这样 tracepoint 回调(eBPF 程序)能看到完整的进程信息。
步骤 3:注册到 debugfs 导出
确认 kernel/src/debug/tracing/events.rs 的 events 目录初始化会自动为新 subsystem sched 创建子目录、为新 event 创建 enable/format/id 文件。现有逻辑应自动处理,无需额外代码。
验证标准
cat /sys/kernel/debug/tracing/events/sched/sched_process_exec/format 能看到事件格式
- 编写简单 eBPF 程序 attach 到该 tracepoint,执行一个
execve(如 ls),ring buffer 收到事件,comm 和 pid 正确
- agentsight 的
proctrace.bpf.c 在 DragonOS 上 attach 成功,能构建进程树
复杂度评估
小。约 50-100 行。
理由:宏、注册、eBPF attach、ring buffer 输出全链路已存在。唯一要写的是宏声明 + 一行 trace 调用。fuse 子系统的 8 个 tracepoint 已证明这套机制可用。
依赖关系
- 无前置依赖——tracepoint 框架已就绪
- 后续依赖:uprobe/uretprobe issue 的验证(agentsight 闭环)会用到进程树,但两者可并行开发
背景
ANOLISA 的 agentsight 组件用
execvetracepoint 构建 AI agent 进程树——追踪进程创建事件,识别哪些进程是 AI agent(通过/proc扫描 +execvetracepoint 双通道)。这是 agentsight "AI Agent Auto-Discovery" 的核心依赖之一。agentsight 的 eBPF 程序
bpf/proctrace.bpf.c和bpf/procmon.bpf.c依赖 Linux 的sched_process_exectracepoint 构建 process tree。DragonOS 现状
DragonOS 的 tracepoint 框架成熟且全链路已通,但当前注册的 tracepoint 很少,且无 sched 类。
已有基础设施(可直接复用):
kernel/src/tracepoint/basic_macro.rsdefine_event_trace!宏完整——声明 tracepoint、生成trace_<name>()调用函数、生成register_trace/unregister_trace、生成.tracepointsection 元数据kernel/src/tracepoint/mod.rsglobal_init_events()启动时扫描.tracepointlinker section,分配 ID,建TracePointMap(BTreeMap<u32, &TracePoint>)和 subsystem/event 层级树kernel/src/tracepoint/point.rsTracePoint用StaticFalseKey——未启用时零开销快速路径kernel/src/perf/tracepoint.rsperf_event_open_tracepoint()按 tp_id 查找 tracepoint,set_bpf_prog()JIT 编译后注册为raw_callbackkernel/src/perf/bpf.rs、kernel/src/bpf/helper/mod.rsbpf_perf_event_output()helper →PerfEventArrayMap→BpfPerfEvent::write_event()写 mmap ring buffer已注册的 tracepoint(共 10 个,无 sched 类):
kernel/src/filesystem/fuse/trace.rs)do_mkdir_at(kernel/src/filesystem/vfs/vcore.rs)sys_enter_openat(kernel/src/filesystem/vfs/syscall/open_utils.rs)execve 无 tracepoint:
kernel/src/process/execve.rs中do_execve_internal()包含完整 ELF 加载、shebang 递归、地址空间切换、fd_table unshare 流程,但零trace_调用。要做的事
步骤 1:声明 sched_process_exec tracepoint
新建
kernel/src/tracepoint/events/sched.rs(或在现有 sched trace 文件中添加):步骤 2:在 execve 中插入 trace 调用
在
kernel/src/process/execve.rs的do_execve_internal()中,ELF 加载完成、新进程名已设置之后(返回成功之前),插入:插入点选择:应在进程名已更新为新 ELF 的
comm、但控制权尚未返回用户态之前。这样 tracepoint 回调(eBPF 程序)能看到完整的进程信息。步骤 3:注册到 debugfs 导出
确认
kernel/src/debug/tracing/events.rs的 events 目录初始化会自动为新 subsystemsched创建子目录、为新 event 创建enable/format/id文件。现有逻辑应自动处理,无需额外代码。验证标准
cat /sys/kernel/debug/tracing/events/sched/sched_process_exec/format能看到事件格式execve(如ls),ring buffer 收到事件,comm和pid正确proctrace.bpf.c在 DragonOS 上 attach 成功,能构建进程树复杂度评估
小。约 50-100 行。
理由:宏、注册、eBPF attach、ring buffer 输出全链路已存在。唯一要写的是宏声明 + 一行 trace 调用。fuse 子系统的 8 个 tracepoint 已证明这套机制可用。
依赖关系