bpf_printk() 的输出

Output from bpf_printk()

虽然 运行 来自 samples/bpf 的一些例子,但我注意到 bpf_printk 输出前面有一些额外的信息,例如:

telnet-470   [001] .N.. 419421.045894: 0x00000001: BPF command: 2

BPF command: 2 是 bpf 程序中传递给 bpf_printk 的实际字符串,但其余部分是什么?我假设这来自内核的 JIT ?

我在哪里可以更仔细地了解这些位的含义? 谢谢。

在你的例子中:

telnet-470   [001] .N.. 419421.045894: 0x00000001: BPF command: 2
  • telnet 是您当前的任务名称。
  • 470 是您当前任务的 PID。
  • 001 是 CPU 号,任务是 运行。
  • .N..中,每个字符分别指代一组选项(是否启用irq,调度选项,hard/softirqs是否为运行,preempt_disabled的级别分别). N表示设置了TIF_NEED_RESCHEDPREEMPT_NEED_RESCHED
  • 419421.045894 是时间戳。
  • 0x00000001 是一个 fake value used by BPF for the ip register.
  • BPF command: 2 是您的留言。

来源

bpf_trace_printk 助手 calls trace_printk, whose format is detailed in the documentation for ftrace (Output format section). The fake ip value is commented in the original commit for the bpf_trace_printk helper

正如 Qeole 在下面提到的,这种格式与 JIT 编译器(或与此相关的 eBPF 基础设施)无关,并且 eBPF 助手不需要进行 JIT 编译,因为它们已经作为内核的源代码。