我想使用ebpf来监控Linux内核函数。现在,我使用bcc编写代码,如下所示:
#!/usr/bin/python3
# coding=utf-8
from bcc import BPF
from time import sleep
# define BPF program
bpf_program = """
int test_func(void *ctx) {
bpf_trace_printk("hello");
return 0;
}
"""
# load BPF
b = BPF(text=bpf_program)
b.attach_kprobe(event="__x64_sys_getpid", fn_name="test_func")
while 1:
sleep(100)
b.trace_print()
这可以正常工作,我知道它是基于kprobe实现的。
但是我想知道我是否只能使用kprobe来监视ebpf中的任何内核函数?
1条答案
按热度按时间xlpyo6sf1#
大多数情况下。Kprobes可以连接到几乎任何函数,除了黑名单上的函数。
Kprobes可以探测内核中除自身之外的大部分内容。这意味着有些函数是kprobes无法探测的。探测(trapping)这类函数会导致递归陷阱(例如双重错误),或者嵌套的探测器处理程序可能永远不会被调用。Kprobes将这些函数作为黑名单来管理。如果您想将某个函数添加到黑名单中,您只需要(1)包含linux/kprobes. h和(2)使用NOKPROBE_SYMBOL()宏来指定一个黑名单函数。Kprobes会根据黑名单检查给定的探头地址,如果给定的地址在黑名单中,则拒绝注册它。