bpf_printk() 的输出

Mar*_*ark 4 linux-kernel llvm-clang bpf ebpf

在运行一些示例时,samples/bpf我注意到bpf_printk输出带有一些额外的信息,例如:

telnet-470   [001] .N.. 419421.045894: 0x00000001: BPF command: 2
Run Code Online (Sandbox Code Playgroud)

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

我在哪里可以仔细查看这些位的含义?谢谢。

pch*_*gno 5

在你的例子中:

telnet-470   [001] .N.. 419421.045894: 0x00000001: BPF command: 2
Run Code Online (Sandbox Code Playgroud)
  • telnet 是您当前任务的名称。
  • 470 是您当前任务的 PID。
  • 001 是运行任务的 CPU 编号。
  • 在 中.N..,每个字符指的是一组选项(是否启用 irqs、调度选项、是否正在运行 hard/softirqs、级别preempt_disabled)。N意味着TIF_NEED_RESCHEDPREEMPT_NEED_RESCHED被设置。
  • 419421.045894 是一个时间戳。
  • 0x00000001BPF 用于 ip 寄存器假值
  • BPF command: 2 是你的消息。

来源

bpf_trace_printk助手电话trace_printk,其格式在详细的文档ftraceOutput format部分)。假 ip 值bpf_trace_printkhelper的原始提交中被注释。

正如 Qeole 在下面提到的,这种格式与 JIT 编译器(或 eBPF 基础架构)无关,而且 eBPF 助手不需要 JIT 编译,因为它们已经编译为内核源代码的一部分。

  • 很好的答案!关于这个问题,我只是澄清一下 JIT 在这里没有任何关系。`bpf_trace_printk()` 是一个帮助器,所以无论如何它都不是 JITted(而是作为内核的一部分编译,并从 eBPF 程序调用,无论它是解释的还是 JIT 的)。@pchaignon 您介意我重复使用您为我正在处理的助手提供的文档的详细信息吗? (2认同)