เจธเจผเฉเจฐเฉ เจตเจฟเฉฑเจ เจเฉฑเจ เจคเจเจจเฉเจ เจธเฉ เจ
เจคเฉ เจเจธเจจเฉเฉฐ เจฌเฉ.เจชเฉ.เจเจซ. เจ
เจธเฉเจ เจเจธ เจตเฉฑเจฒ เจฆเฉเจเจฟเจ
เจฎเฉเจเฉ เจคเฉเจฐ 'เจคเฉ, BPF เจคเฉเจนเจพเจจเฉเฉฐ เจฒเฉเจจเจเจธ เจเจฐเจจเจฒ เจธเจชเฉเจธ เจตเจฟเฉฑเจ เจเจชเจนเฉเจฆเจฐเฉ เจเจชเจญเฉเจเจคเจพ เจฆเฉเจเจฐเจพ เจธเจชเจฒเจพเจ เจเฉเจคเฉ เจเฉเจก เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ, เจ เจคเฉ เจจเจตเจพเจ เจเจฐเจเฉเจเฉเจเจเจฐ เจเฉฐเจจเจพ เจธเจซเจฒ เจธเจพเจฌเจค เจนเฉเจเจ เจนเฉ เจเจฟ เจธเจพเจจเฉเฉฐ เจเจธ เจฆเฉเจเจ เจธเจพเจฐเฉเจเจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฆเจพ เจตเจฐเจฃเจจ เจเจฐเจจ เจฒเจ เจเฉฑเจ เจฆเจฐเจเจจ เจนเฉเจฐ เจฒเฉเจเจพเจ เจฆเฉ เจฒเฉเฉ เจชเจตเฉเจเฉเฅค (เจธเจฟเจฐเจซเจผ เจเฉฑเจ เจเฉเจเจผ เจเฉ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจจเฉ เจตเจงเฉเจ เจจเจนเฉเจ เจเฉเจคเฉ, เจเจฟเจตเฉเจ เจเจฟ เจคเฉเจธเฉเจ เจนเฉเจ เจพเจ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจเฉเจก เจตเจฟเฉฑเจ เจฆเฉเจ เจธเจเจฆเฉ เจนเฉ, เจเฉฑเจ เจตเจงเฉเจ เจฒเฉเจเฉ เจฌเจฃเจพเจเจฃเจพ เจธเฉเฅค)
เจเจน เจฒเฉเจ BPF เจตเจฐเจเฉเจ
เจฒ เจฎเจธเจผเฉเจจ เจฆเฉ เจฌเจฃเจคเจฐ เจฆเจพ เจตเจฐเจฃเจจ เจเจฐเจฆเจพ เจนเฉ, BPF เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจเจฐเจจเจฒ เจเฉฐเจเจฐเจซเฉเจธ, เจตเจฟเจเจพเจธ เจธเจพเจงเจจ, เจ
เจคเฉ เจจเจพเจฒ เจนเฉ เจฎเฉเจเฉเจฆเจพ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฆเจพ เจเฉฑเจ เจธเฉฐเจเฉเจช, เจฌเจนเฉเจค เจธเฉฐเจเฉเจช เจธเฉฐเจเฉเจช เจเจพเจฃเจเจพเจฐเฉ, เจเจฟเจตเฉเจ เจเจฟ. BPF เจฆเฉ เจตเจฟเจนเจพเจฐเจ เจเจพเจฐเจเจพเจ เจฆเฉ เจกเฉเฉฐเจเฉ เจ
เจงเจฟเจเจจ เจฒเจ เจธเจพเจจเฉเฉฐ เจญเจตเจฟเฉฑเจ เจตเจฟเฉฑเจ เจนเจฐ เจเฉเจเจผ เจฆเฉ เจฒเฉเฉ เจชเจตเฉเจเฉเฅค
เจฒเฉเจ เจฆเจพ เจธเฉฐเจเฉเจช
bpf(2)
.
ะะธัะตะผ ะฟัะพะณัะฐะผะผั BPF ั ะฟะพะผะพััั libbpf
.libbpf
. เจ
เจธเฉเจ เจเฉฑเจ เจฌเฉเจจเจฟเจเจฆเฉ BPF เจเจชเจฒเฉเจเฉเจธเจผเจจ เจชเจฟเฉฐเจเจฐ เจฌเจฃเจพเจตเจพเจเจเฉ เจเฉ เจ
เจธเฉเจ เจ
เจเจฒเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจตเจฟเฉฑเจ เจตเจฐเจคเจพเจเจเฉเฅค
เจฌเฉเจชเฉเจเจซ เจเจฐเจเฉเจเฉเจเจเจฐ เจฆเฉ เจเจพเจฃ-เจชเจเจพเจฃ
เจเจธ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจเจฟ เจ
เจธเฉเจ BPF เจเจฐเจเฉเจเฉเจเจเจฐ 'เจคเฉ เจตเจฟเจเจพเจฐ เจเจฐเจจเจพ เจธเจผเฉเจฐเฉ เจเจฐเฉเจ, เจ
เจธเฉเจ เจเฉฑเจ เจเจเจฐเฉ เจตเจพเจฐ (เจเจน) เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเฉเจตเจพเจเจเฉ
เจจเจตเจพเจ BPF 64-เจฌเจฟเฉฑเจ เจฎเจธเจผเฉเจจเจพเจ, เจเจฒเจพเจเจก เจธเฉเจตเจพเจตเจพเจ เจ เจคเฉ SDN (SDN) เจฌเจฃเจพเจเจฃ เจฒเจ เจธเจพเจงเจจเจพเจ เจฆเฉ เจตเจงเจฆเฉ เจฒเฉเฉ เจฆเฉ เจธเจฐเจตเจตเจฟเจเจชเจเจคเจพ เจฆเฉ เจเจตเจพเจฌ เจตเจเฉเจ เจตเจฟเจเจธเจค เจเฉเจคเจพ เจเจฟเจ เจธเฉเฅคSเจธเจพเจฎเจพเจจ-dเจชเฉเจฐเจญเจพเจธเจผเจฟเจค networking). เจเจฒเจพเจธเจฟเจ BPF เจฒเจ เจเฉฑเจ เจฌเจฟเจนเจคเจฐ เจฌเจฆเจฒ เจตเจเฉเจ เจเจฐเจจเจฒ เจจเฉเจเจตเจฐเจ เจเฉฐเจเฉเจจเฉเจ เจฐเจพเจ เจฆเฉเจเจฐเจพ เจตเจฟเจเจธเจค เจเฉเจคเจพ เจเจฟเจ, เจจเจตเฉเจ BPF เจจเฉ เจธเจผเจพเจฌเจฆเจฟเจ เจคเฉเจฐ 'เจคเฉ เจเฉ เจฎเจนเฉเจจเจฟเจเจ เจฌเจพเจ เจฆ เจฒเฉเจจเจเจธ เจชเฉเจฐเจฃเจพเจฒเฉเจเจ เจจเฉเฉฐ เจเจฐเฉเจธ เจเจฐเจจ เจฆเฉ เจฎเฉเจธเจผเจเจฒ เจเฉฐเจฎ เจตเจฟเฉฑเจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฒเฉฑเจญเฉเจเจ, เจ เจคเฉ เจนเฉเจฃ, เจเจธเจฆเฉ เจฆเจฟเฉฑเจ เจฆเฉ เจเฉ เจธเจพเจฒเจพเจ เจฌเจพเจ เจฆ, เจธเจพเจจเฉเฉฐ เจเฉฑเจ เจชเฉเจฐเฉ เจ เจเจฒเฉ เจฒเฉเจ เจฆเฉ เจเจผเจฐเฉเจฐเจค เจนเฉเจเจเฉ. เจตเฉฑเจ-เจตเฉฑเจ เจเจฟเจธเจฎเจพเจ เจฆเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฆเฉ เจธเฉเจเฉ เจฌเจฃเจพเจเฅค
เจฎเจเจผเจพเจเฉเจ เจคเจธเจตเฉเจฐเจพเจ
เจเจธเจฆเฉ เจฎเฉเจฒ เจฐเฉเจช เจตเจฟเฉฑเจ, BPF เจเฉฑเจ เจธเฉเจเจกเจฌเฉเจเจธ เจตเจฐเจเฉเจ เจฒ เจฎเจธเจผเฉเจจ เจนเฉ เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจธเฉเจฐเฉฑเจเจฟเจ เจจเจพเจฒ เจธเจฎเจเฉเจคเจพ เจเฉเจคเฉ เจฌเจฟเจจเจพเจ เจเจฐเจจเจฒ เจธเจชเฉเจธ เจตเจฟเฉฑเจ "เจเจฐเจฌเจฟเจเจฐเฉเจฐเฉ" เจเฉเจก เจเจฒเจพเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเฉ เจนเฉเฅค BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฏเฉเจเจผเจฐ เจธเจชเฉเจธ เจตเจฟเฉฑเจ เจฌเจฃเจพเจ เจเจพเจเจฆเฉ เจนเจจ, เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจนเฉเฉฐเจฆเฉ เจนเจจ, เจ เจคเฉ เจเฉเจ เจเจตเฉเจเจ เจธเจฐเฉเจค เจจเจพเจฒ เจเฉเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเจจเฅค เจเฉฑเจ เจเจตเฉเจเจ เจนเฉ เจธเจเจฆเจพ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉฑเจ เจจเฉเฉฑเจเจตเจฐเจ เจเฉฐเจเจฐเจซเฉเจธ เจฒเจ เจเฉฑเจ เจชเฉเจเฉเจ เจฆเฉ เจกเจฟเจฒเฉเจตเจฐเฉ, เจเฉเจ เจเจฐเจจเจฒ เจซเฉฐเจเจธเจผเจจ เจฆเฉ เจธเจผเฉเจฐเฉเจเจค, เจเจฆเจฟเฅค เจเฉฑเจ เจชเฉเจเฉเจ เจฆเฉ เจฎเจพเจฎเจฒเฉ เจตเจฟเฉฑเจ, BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเฉเจฒ เจชเฉเจเฉเจ เจฆเฉ เจกเฉเจเจพ เจ เจคเฉ เจฎเฉเจเจพเจกเฉเจเจพ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจนเฉเจตเฉเจเฉ (เจชเฉเฉเจนเจจ เจฒเจ เจ เจคเฉ, เจธเฉฐเจญเจต เจคเฉเจฐ 'เจคเฉ, เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจเจฟเจธเจฎ เจฆเฉ เจ เจงเจพเจฐ เจคเฉ, เจฒเจฟเจเจฃ เจฒเจ); เจเฉฑเจ เจเจฐเจจเจฒ เจซเฉฐเจเจธเจผเจจ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฆเฉ เจฎเจพเจฎเจฒเฉ เจตเจฟเฉฑเจ, เจเจฐเจเฉเจฎเฉเจเจเจธ เจซเฉฐเจเจธเจผเจจ, เจเจฐเจจเจฒ เจฎเฉเจฎเฉเจฐเฉ เจฒเจ เจชเฉเจเจเฉฐเจเจฐ เจธเจฎเฉเจค, เจเจฆเจฟเฅค
เจเจ เจเจธ เจชเฉเจฐเจเจฟเจฐเจฟเจ 'เจคเฉ เจกเฉเฉฐเจเจพเจ เจจเจพเจฒ เจตเจฟเจเจพเจฐ เจเจฐเฉเจ. เจธเจผเฉเจฐเฉ เจเจฐเจจ เจฒเจ, เจเจ เจเจฒเจพเจธเจฟเจ เจฌเฉเจชเฉเจเจซ เจคเฉเจ เจชเจนเจฟเจฒเฉ เจ เฉฐเจคเจฐ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเฉเจ, เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฟเจจเฉเจนเจพเจ เจฒเจ เจ เจธเฉเจเจฌเจฒเจฐ เจตเจฟเฉฑเจ เจฒเจฟเจเจฟเจ เจเจฟเจ เจธเฉ. เจจเจตเฉเจ เจธเฉฐเจธเจเจฐเจฃ เจตเจฟเฉฑเจ, เจเจฐเจเฉเจเฉเจเจเจฐ เจฆเจพ เจตเจฟเจธเจคเจพเจฐ เจเฉเจคเจพ เจเจฟเจ เจธเฉ เจคเจพเจ เจเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจเฉฑเจ-เจชเฉฑเจงเจฐเฉ เจญเจพเจธเจผเจพเจตเจพเจ เจตเจฟเฉฑเจ เจฒเจฟเจเจฟเจ เจเจพ เจธเจเฉ, เจฎเฉเฉฑเจ เจคเฉเจฐ 'เจคเฉ, เจฌเฉเจธเจผเจ, C เจตเจฟเฉฑเจ, เจเจธเจฆเฉ เจฒเจ, llvm เจฒเจ เจเฉฑเจ เจฌเฉเจเจเจเจก เจตเจฟเจเจธเจค เจเฉเจคเจพ เจเจฟเจ เจธเฉ, เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ BPF เจเจฐเจเฉเจเฉเจเจเจฐ เจฒเจ เจฌเจพเจเจเจเฉเจก เจฌเจฃเจพเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค
BPF เจเจฐเจเฉเจเฉเจเจเจฐ เจจเฉเฉฐ เจเจงเฉเจจเจฟเจ เจฎเจธเจผเฉเจจเจพเจ 'เจคเฉ เจเฉเจธเจผเจฒเจคเจพ เจจเจพเจฒ เจเจฒเจพเจเจฃ เจฒเจ, เจเฉเจ เจนเฉฑเจฆ เจคเฉฑเจ เจกเจฟเจเจผเจพเจเจจ เจเฉเจคเจพ เจเจฟเจ เจธเฉเฅค เจเจธ เจเฉฐเจฎ เจจเฉเฉฐ เจ
เจญเจฟเจเจธ เจตเจฟเฉฑเจ เจฌเจฃเจพเจเจฃ เจฒเจ, BPF เจฌเจพเจเจเจเฉเจก, เจเฉฑเจ เจตเจพเจฐ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจนเฉเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ, JIT เจเฉฐเจชเจพเจเจฒเจฐ (เจเฉเจเจเจเฉ เจเฉฐเจชเจพเจเจฒเจฐ) เจจเจพเจฎเจ เจเฉฑเจ เจนเจฟเฉฑเจธเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจฎเฉเจฒ เจเฉเจก เจตเจฟเฉฑเจ เจ
เจจเฉเจตเจพเจฆ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅคJust In Time). เจ
เฉฑเจเฉ, เจเฉเจเจฐ เจคเฉเจนเจพเจจเฉเฉฐ เจฏเจพเจฆ เจนเฉ, เจเจฒเจพเจธเจฟเจ BPF เจตเจฟเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเฉเจคเจพ เจเจฟเจ เจธเฉ เจ
เจคเฉ เจเจตเฉเจเจ เจธเจฐเฉเจค เจจเจพเจฒ เจชเฉเจฐเจฎเจพเจฃเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจเฉเฉเจฟเจ เจเจฟเจ เจธเฉ - เจเฉฑเจ เจธเจฟเฉฐเจเจฒ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฆเฉ เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจเฅค เจจเจตเฉเจ เจขเจพเจเจเฉ เจตเจฟเฉฑเจ, เจเจน เจฆเฉ เจชเฉเจพเจตเจพเจ เจตเจฟเฉฑเจ เจนเฉเฉฐเจฆเจพ เจนเฉ - เจชเจนเจฟเจฒเจพเจ, เจเฉเจก เจจเฉเฉฐ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅค bpf(2)
เจ
เจคเฉ เจซเจฟเจฐ, เจฌเจพเจ
เจฆ เจตเจฟเฉฑเจ, เจนเฉเจฐ เจตเจฟเจงเฉเจเจ เจฆเฉเจเจฐเจพ เจเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจเจฟเจธเจฎ เจฆเฉ เจ
เจงเจพเจฐ เจคเฉ เจตเฉฑเจ-เจตเฉฑเจ เจนเฉเฉฐเจฆเฉ เจนเจจ, เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจเจจเจพ เจธเจฐเฉเจค เจจเจพเจฒ เจเฉเฉเจฆเจพ เจนเฉเฅค
เจเฉฑเจฅเฉ เจชเจพเจ เจ เจจเฉเฉฐ เจเฉฑเจ เจธเจตเจพเจฒ เจนเฉ เจธเจเจฆเจพ เจนเฉ: เจเฉ เจเจน เจธเฉฐเจญเจต เจธเฉ? เจ เจเจฟเจนเฉ เจเฉเจก เจฆเฉ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจธเฉเจฐเฉฑเจเจฟเจ เจฆเฉ เจเจพเจฐเฉฐเจเฉ เจเจฟเจตเฉเจ เจฆเจฟเฉฑเจคเฉ เจเจพเจเจฆเฉ เจนเฉ? เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจธเฉเจฐเฉฑเจเจฟเจ เจฆเฉ เจเจพเจฐเฉฐเจเฉ เจธเจพเจกเฉ เจฒเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจฒเฉเจก เจเจฐเจจ เจฆเฉ เจชเฉเจพเจ เจฆเฉเจเจฐเจพ เจฆเจฟเฉฑเจคเฉ เจเจพเจเจฆเฉ เจนเฉ เจเจฟเจธเจจเฉเฉฐ เจตเฉเจฐเฉเจซเจพเจเจฐ เจเจฟเจนเจพ เจเจพเจเจฆเจพ เจนเฉ (เจ เฉฐเจเจฐเฉเจเจผเฉ เจตเจฟเฉฑเจ เจเจธ เจชเฉเจพเจ เจจเฉเฉฐ เจตเฉเจฐเฉเจซเจพเจเจฐ เจเจฟเจนเจพ เจเจพเจเจฆเจพ เจนเฉ เจ เจคเฉ เจฎเฉเจ เจ เฉฐเจเจฐเฉเจเจผเฉ เจธเจผเจฌเจฆ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ เจเจพเจฐเฉ เจฐเฉฑเจเจพเจเจเจพ):
เจตเฉเจฐเฉเจซเจพเจเจฐ เจเฉฑเจ เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉเจธเจผเจ เจนเฉ เจเฉ เจเจน เจฏเจเฉเจจเฉ เจฌเจฃเจพเจเจเจฆเจพ เจนเฉ เจเจฟ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฐเจจเจฒ เจฆเฉ เจเจฎ เจเฉฐเจฎ เจตเจฟเฉฑเจ เจตเจฟเจเจจ เจจเจนเฉเจ เจชเจพเจเจเจฆเจพ เจนเฉเฅค เจตเฉเจธเฉ, เจเจธเจฆเจพ เจฎเจคเจฒเจฌ เจเจน เจจเจนเฉเจ เจนเฉ เจเจฟ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจธเจฟเจธเจเจฎ เจฆเฉ เจธเฉฐเจเจพเจฒเจจ เจตเจฟเฉฑเจ เจฆเจเจฒ เจจเจนเฉเจ เจฆเฉ เจธเจเจฆเจพ - BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ, เจเจฟเจธเจฎ เจฆเฉ เจ เจงเจพเจฐ เจคเฉ, เจเจฐเจจเจฒ เจฎเฉเจฎเฉเจฐเฉ เจฆเฉ เจญเจพเจเจพเจ เจจเฉเฉฐ เจชเฉเฉเจน เจ เจคเฉ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ เจธเจเจฆเฉ เจนเจจ, เจซเฉฐเจเจธเจผเจจเจพเจ เจฆเฉ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจเจฐ เจธเจเจฆเฉ เจนเจจ, เจเฉเจฐเจฟเจฎ, เจเฉเฉ, เจฎเฉเฉ เจฒเจฟเจ เจธเจเจฆเฉ เจนเจจ เจ เจคเฉ เจจเฉเฉฑเจเจตเจฐเจ เจชเฉเจเฉเจ เจตเฉ เจ เฉฑเจเฉ เจญเฉเจเฉเฅค เจตเฉเจฐเฉเจซเจพเจเจฐ เจเจพเจฐเฉฐเจเฉ เจฆเจฟเฉฐเจฆเจพ เจนเฉ เจเจฟ เจเฉฑเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฒเจพเจเจฃ เจจเจพเจฒ เจเจฐเจจเจฒ เจเฉเจฐเฉเจธเจผ เจจเจนเฉเจ เจนเฉเจตเฉเจเจพ เจ เจคเฉ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฟเจธ เจตเจฟเฉฑเจ, เจจเจฟเจฏเจฎเจพเจ เจฆเฉ เจ เจจเฉเจธเจพเจฐ, เจฒเจฟเจเจฃ เจฆเฉ เจชเจนเฉเฉฐเจ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉฑเจ เจเจเจเจเฉเจเฉฐเจ เจชเฉเจเฉเจ เจฆเจพ เจกเฉเจเจพ, เจชเฉเจเฉเจ เจฆเฉ เจฌเจพเจนเจฐ เจเจฐเจจเจฒ เจฎเฉเจฎเฉเจฐเฉ เจจเฉเฉฐ เจเจตเจฐเจฐเจพเจเจ เจเจฐเจจ เจฆเฉ เจฏเฉเจ เจจเจนเฉเจ เจนเฉเจตเฉเจเจพเฅค เจ เจธเฉเจ BPF เจฆเฉ เจฌเจพเจเฉ เจธเจพเจฐเฉ เจนเจฟเฉฑเจธเจฟเจเจ เจคเฉเจ เจเจพเจฃเฉ เจนเฉเจฃ เจคเฉเจ เจฌเจพเจ เจฆ, เจ เจธเฉเจ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจญเจพเจ เจตเจฟเฉฑเจ เจฅเฉเฉเฉ เจนเฉเจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจชเฉเจฐเจฎเจพเจฃเจ เจจเฉเฉฐ เจฆเฉเจเจพเจเจเฉเฅค
เจคเจพเจ เจ
เจธเฉเจ เจนเฉเจฃ เจคเฉฑเจ เจเฉ เจธเจฟเฉฑเจเจฟเจ เจนเฉ? เจเจชเจญเฉเจเจคเจพ C เจตเจฟเฉฑเจ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเจฟเจเจฆเจพ เจนเฉ, เจเจธเจจเฉเฉฐ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเจฐเจฆเจพ เจนเฉ bpf(2)
, เจเจฟเฉฑเจฅเฉ เจเจธเจจเฉเฉฐ เจเฉฑเจ เจคเจธเจฆเฉเจเจเจฐเจคเจพ เจฆเฉเจเจฐเจพ เจเจพเจเจเจฟเจ เจเจพเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจฎเฉเจฒ เจฌเจพเจเจเจเฉเจก เจตเจฟเฉฑเจ เจ
เจจเฉเจตเจพเจฆ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅค เจซเจฟเจฐ เจเจนเฉ เจเจพเจ เจเฉเจ เจนเฉเจฐ เจเจชเจญเฉเจเจคเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจตเฉเจเจ เจธเจฐเฉเจค เจจเจพเจฒ เจเฉเฉเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจน เจเจฒเจพเจเจฃเจพ เจธเจผเฉเจฐเฉ เจนเฉ เจเจพเจเจฆเจพ เจนเฉ. เจฌเฉเจ เจ
เจคเฉ เจเฉเจจเฉเจเจธเจผเจจ เจจเฉเฉฐ เจตเฉฑเจ เจเจฐเจจเจพ เจเจ เจเจพเจฐเจจเจพเจ เจเจฐเจเฉ เจเจผเจฐเฉเจฐเฉ เจนเฉเฅค เจชเจนเจฟเจฒเจพเจ, เจเฉฑเจ เจตเฉเจฐเฉเจซเจพเจเจฐ เจเจฒเจพเจเจฃเจพ เจฎเฉเจเจพเจฌเจฒเจคเจจ เจฎเจนเจฟเฉฐเจเจพ เจนเฉเฉฐเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจธเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจ เจตเจพเจฐ เจกเจพเจเจจเจฒเฉเจก เจเจฐเจเฉ เจ
เจธเฉเจ เจเฉฐเจชเจฟเจเจเจฐ เจฆเจพ เจธเจฎเจพเจ เจฌเจฐเจฌเจพเจฆ เจเจฐเจฆเฉ เจนเจพเจเฅค เจฆเฉเจเจพ, เจฌเจฟเจฒเจเฉเจฒ เจเจฟเจตเฉเจ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเฉเฉเจฟเจ เจนเฉ เจเจธเจฆเฉ เจเจฟเจธเจฎ 'เจคเฉ เจจเจฟเจฐเจญเจฐ เจเจฐเจฆเจพ เจนเฉ, เจ
เจคเฉ เจเฉฑเจ เจธเจพเจฒ เจชเจนเจฟเจฒเจพเจ เจตเจฟเจเจธเจค เจเฉเจคเจพ เจเจฟเจ เจเฉฑเจ "เจฏเฉเจจเฉเจตเจฐเจธเจฒ" เจเฉฐเจเจฐเจซเฉเจธ เจจเจตเฉเจ เจเจฟเจธเจฎ เจฆเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฒเจ เจขเฉเจเจตเจพเจ เจจเจนเฉเจ เจนเฉ เจธเจเจฆเจพ เจนเฉเฅค (เจนเจพเจฒเจพเจเจเจฟ เจนเฉเจฃ เจเจฐเจเฉเจเฉเจเจเจฐ เจนเฉเจฐ เจชเจฐเจฟเจชเฉฑเจ เจนเฉ เจฐเจฟเจนเจพ เจนเฉ, เจเจธ เจเฉฐเจเจฐเจซเฉเจธ เจจเฉเฉฐ เจชเฉฑเจงเจฐ 'เจคเฉ เจเจเจเฉเฉฑเจ เจเจฐเจจ เจฆเจพ เจตเจฟเจเจพเจฐ เจนเฉเฅค libbpf
.)
เจงเจฟเจเจจ เจฆเฉเจฃ เจตเจพเจฒเฉ เจชเจพเจ เจ เจธเจผเจพเจเจฆ เจงเจฟเจเจจ เจฆเฉเจฃ เจเจฟ เจ เจธเฉเจ เจ เจเฉ เจคเจธเจตเฉเจฐเจพเจ เจจเจพเจฒ เจเจคเจฎ เจจเจนเฉเจ เจนเฉเจ เจนเจพเจ. เจฆเจฐเจ เจธเจฒ, เจเจชเจฐเฉเจเจค เจธเจพเจฐเฉ เจเจน เจจเจนเฉเจ เจฆเฉฑเจธเจฆเฉ เจนเจจ เจเจฟ เจเจฒเจพเจธเจฟเจ เจฌเฉเจชเฉเจเจซ เจฆเฉ เจฎเฉเจเจพเจฌเจฒเฉ BPF เจฌเฉเจจเจฟเจเจฆเฉ เจคเฉเจฐ 'เจคเฉ เจคเจธเจตเฉเจฐ เจจเฉเฉฐ เจเจฟเจเจ เจฌเจฆเจฒเจฆเจพ เจนเฉเฅค เจฆเฉ เจจเจตเฉเจจเจคเจพเจตเจพเจ เจเฉ เจฒเจพเจเฉ เจนเฉเจฃ เจฆเฉ เจฆเจพเจเจฐเฉ เจจเฉเฉฐ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจคเฉเจฐ 'เจคเฉ เจตเจงเจพเจเจเจฆเฉเจเจ เจนเจจ เจธเจผเฉเจ เจฐเจก เจฎเฉเจฎเฉเจฐเฉ เจ เจคเฉ เจเจฐเจจเจฒ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉ เจฏเฉเจเจคเจพ เจนเจจเฅค เจฌเฉเจชเฉเจเจซ เจตเจฟเฉฑเจ, เจธเจผเฉเจ เจฐเจก เจฎเฉเจฎเฉเจฐเฉ เจจเฉเฉฐ เจ เจเฉเจคเฉ เจจเจเจธเจผเจฟเจเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจฒเจพเจเฉ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ - เจเฉฑเจ เจเจพเจธ API เจฆเฉ เจจเจพเจฒ เจธเจพเจเจเฉ เจเฉเจคเฉ เจกเฉเจเจพ เจขเจพเจเจเฉเฅค เจเจนเจจเจพเจ เจจเฉเฉฐ เจธเจผเจพเจเจฆ เจเจน เจจเจพเจฎ เจเจธ เจฒเจ เจฎเจฟเจฒเจฟเจ เจเจฟเจเจเจเจฟ เจฆเจฟเจเจพเจ เจฆเฉเจฃ เจตเจพเจฒเฉ เจชเจนเจฟเจฒเฉ เจเจฟเจธเจฎ เจฆเจพ เจจเจเจธเจผเจพ เจนเฉเจธเจผ เจเฉเจฌเจฒ เจธเฉเฅค เจซเจฟเจฐ เจเจฐเฉ เจฆเจฟเจเจพเจ เจฆเจฟเฉฑเจคเฉ, เจฒเฉเจเจฒ (เจชเฉเจฐเจคเฉ-เจธเฉเจชเฉเจฏเฉ) เจนเฉเจธเจผ เจเฉเจฌเจฒ เจ เจคเฉ เจฒเฉเจเจฒ เจเจฐเฉ, เจธเจฐเจ เจเฉเจฐเฉ, เจฌเฉเจชเฉเจเจซ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฆเฉ เจชเฉเจเจเฉฐเจเจฐ เจตเจพเจฒเฉ เจจเจเจธเจผเฉ เจ เจคเฉ เจนเฉเจฐ เจฌเจนเฉเจค เจเฉเจเฅค เจนเฉเจฃ เจธเจพเจกเฉ เจฒเจ เจฆเจฟเจฒเจเจธเจช เจเฉฑเจฒ เจเจน เจนเฉ เจเจฟ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจตเจฟเฉฑเจ เจนเฉเจฃ เจเจพเจฒเจพเจ เจฆเฉ เจตเจฟเจเจเจพเจฐ เจธเจฅเจฟเจคเฉ เจจเฉเฉฐ เจเจพเจเจฎ เจฐเฉฑเจเจฃ เจ เจคเฉ เจเจธเจจเฉเฉฐ เจฆเฉเจเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจ เจคเฉ เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจจเจพเจฒ เจธเจพเจเจเจพ เจเจฐเจจ เจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ เจนเฉเฅค
เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจชเจญเฉเจเจคเจพ เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ เจคเฉเจ เจจเจเจธเจผเฉ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ bpf(2)
, เจ
เจคเฉ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจเฉฑเจฒ เจฐเจนเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจคเฉเจเฅค เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ, เจธเจนเจพเจเจ เจธเจฟเจฐเจซเจผ เจจเจเจธเจผเจฟเจเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจนเฉ เจจเจนเฉเจ, เจธเจเฉเจ เจนเฉเจฐ เจเจฐเจจเจฒ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจเจฐเจจ เจฒเจ เจตเฉ เจฎเฉเจเฉเจฆ เจนเจจเฅค เจเจฆเจพเจนเจฐเจจ เจฒเจ, BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจชเฉเจเฉเจเจพเจ เจจเฉเฉฐ เจฆเฉเจเฉ เจเฉฐเจเจฐเจซเฉเจธเจพเจ 'เจคเฉ เจ
เฉฑเจเฉ เจญเฉเจเจฃ, เจชเจฐเจซ เจเจตเฉเจเจเจธ เจฌเจฃเจพเจเจฃ, เจเจฐเจจเจฒ เจขเจพเจเจเฉ เจจเฉเฉฐ เจเจเจธเฉเจธ เจเจฐเจจ, เจเจฆเจฟ เจฒเจ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเจจเฅค
เจธเฉฐเจเฉเจช เจตเจฟเฉฑเจ, BPF เจเจฐเจฌเจฟเจเจฐเฉเจฐเฉ เจฒเฉเจก เจเจฐเจจ เจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเจพ เจนเฉ, เจฏเจพเจจเฉ, เจตเฉเจฐเฉเจซเจพเจเจฐ-เจเฉเจธเจ, เจฏเฉเจเจผเจฐ เจเฉเจก เจจเฉเฉฐ เจเจฐเจจเจฒ เจธเจชเฉเจธ เจตเจฟเฉฑเจเฅค เจเจน เจเฉเจก เจเจพเจฒเจพเจ เจตเจฟเจเจเจพเจฐ เจธเจฅเจฟเจคเฉ เจจเฉเฉฐ เจฌเจเจพ เจธเจเจฆเจพ เจนเฉ เจ เจคเฉ เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจฆเฉ เจจเจพเจฒ เจกเฉเจเจพ เจฆเจพ เจเจฆเจพเจจ-เจชเฉเจฐเจฆเจพเจจ เจเจฐ เจธเจเจฆเจพ เจนเฉ, เจ เจคเฉ เจเจธ เจเจฟเจธเจฎ เจฆเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉเจเจฐเจพ เจฎเจจเจเจผเฉเจฐ เจเจฐเจจเจฒ เจเจช-เจธเจฟเจธเจเจฎเจพเจ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจตเฉ เจฐเฉฑเจเจฆเจพ เจนเฉเฅค
เจเจน เจชเจนเจฟเจฒเจพเจ เจนเฉ เจเจฐเจจเจฒ เจฎเฉเจกเฉเจเจฒ เจฆเฉเจเจฐเจพ เจชเฉเจฐเจฆเจพเจจ เจเฉเจคเฉเจเจ เจเจเจเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฆเฉ เจธเจฎเจพเจจ เจนเฉ, เจเจฟเจธ เจฆเฉ เจคเฉเจฒเจจเจพ เจตเจฟเฉฑเจ BPF เจฆเฉ เจเฉเจ เจซเจพเจเจฆเฉ เจนเจจ (เจฌเฉเจธเจผเจ, เจคเฉเจธเฉเจ เจธเจฟเจฐเจซ เจธเจฎเจพเจจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฆเฉ เจคเฉเจฒเจจเจพ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจธเจฟเจธเจเจฎ เจเจฐเฉเจธเจฟเฉฐเจ - เจคเฉเจธเฉเจ BPF เจจเจพเจฒ เจเฉฑเจ เจเจฐเจฌเจฟเจเจฐเฉเจฐเฉ เจกเจฐเจพเจเจตเจฐ เจจเจนเฉเจ เจฒเจฟเจ เจธเจเจฆเฉ เจนเฉ)เฅค เจคเฉเจธเฉเจ เจเฉฑเจ เจเฉฑเจ เจเจเจเจฐเฉ เจฅเฉเจฐเฉเจธเจผเจนเฉเจฒเจก เจจเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ (เจเฉเจ เจเจชเจฏเฉเจเจคเจพเจตเจพเจ เจเฉ BPF เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉเจเจ เจนเจจ, เจฒเจ เจเจชเจญเฉเจเจคเจพ เจจเฉเฉฐ เจเจฐเจจเจฒ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจนเฉเจจเจฐ, เจเจพเจ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจนเฉเจจเจฐ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉเฉฐเจฆเฉ เจนเฉ), เจฐเจจเจเจพเจเจฎ เจธเฉเจฐเฉฑเจเจฟเจ (เจเจจเฉเจนเจพเจ เจฒเจ เจเจฟเฉฑเจชเจฃเฉเจเจ เจตเจฟเฉฑเจ เจเจชเจฃเจพ เจนเฉฑเจฅ เจตเจงเจพเจ เจเจฟเจจเฉเจนเจพเจ เจจเฉ เจฒเจฟเจเจฃ เจตเฉเจฒเฉ เจธเจฟเจธเจเจฎ เจจเฉเฉฐ เจจเจนเฉเจ เจคเฉเฉเจฟเจเฅค เจเจพเจ เจเฉเจธเจเจฟเฉฐเจ เจฎเฉเจกเฉเจเจฒ), เจเจเจฎเฉเจธเจฟเจเฉ - เจฎเฉเจกเจฟเจเจฒเจพเจ เจจเฉเฉฐ เจฐเฉเจฒเฉเจก เจเจฐเจจ เจตเฉเจฒเฉ เจกเจพเจเจจเจเจพเจเจฎ เจนเฉเฉฐเจฆเจพ เจนเฉ, เจ เจคเฉ BPF เจธเจฌ-เจธเจฟเจธเจเจฎ เจเจน เจฏเจเฉเจจเฉ เจฌเจฃเจพเจเจเจฆเจพ เจนเฉ เจเจฟ เจเฉเจ เจตเฉ เจเจตเฉเจเจ เจฎเจฟเจธ เจจเจพ เจนเฉเจตเฉ (เจจเจฟเจฐเจชเฉฑเจ เจนเฉเจฃ เจฒเจ, เจเจน BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฆเฉเจเจ เจธเจพเจฐเฉเจเจ เจเจฟเจธเจฎเจพเจ เจฒเจ เจธเฉฑเจ เจจเจนเฉเจ เจนเฉ)เฅค
เจ เจเจฟเจนเฉเจเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฆเฉ เจฎเฉเจเฉเจฆเจเฉ เจฌเฉเจชเฉเจเจซ เจจเฉเฉฐ เจเจฐเจจเจฒ เจฆเฉ เจตเจฟเจธเจคเจพเจฐ เจฒเจ เจเฉฑเจ เจธเจฐเจตเจตเจฟเจเจชเฉ เจธเจพเจงเจจ เจฌเจฃเจพเจเจเจฆเฉ เจนเฉ, เจเจฟเจธเจฆเฉ เจ เจญเจฟเจเจธ เจตเจฟเฉฑเจ เจชเฉเจธเจผเจเฉ เจนเฉเฉฐเจฆเฉ เจนเฉ: เจฌเฉเจชเฉเจเจซ เจตเจฟเฉฑเจ เจตเฉฑเจง เจคเฉเจ เจตเฉฑเจง เจจเจตเฉเจ เจเจฟเจธเจฎ เจฆเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจธเจผเจพเจฎเจฒ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเจจ, เจตเฉฑเจง เจคเฉเจ เจตเฉฑเจง เจตเฉฑเจกเฉเจเจ เจเฉฐเจชเจจเฉเจเจ เจฒเฉเจพเจ เจธเจฐเจตเจฐเจพเจ 24 ร 7 เจคเฉ เจฌเฉเจชเฉเจเจซ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉเจเจ เจนเจจ, เจตเฉฑเจง เจคเฉเจ เจตเฉฑเจง เจธเจเจพเจฐเจเจ เฉฑเจช เจเจชเจฃเฉ เจเจพเจฐเฉเจฌเจพเจฐ เจจเฉเฉฐ เจเจนเจจเจพเจ เจนเฉฑเจฒเจพเจ 'เจคเฉ เจฌเจฃเจพเจเจเจฆเฉ เจนเจจ เจเฉ เจฌเฉเจชเฉเจเจซ 'เจคเฉ เจเจงเจพเจฐเจฟเจค เจนเฉเฉฐเจฆเฉ เจนเจจเฅค BPF เจฆเฉ เจตเจฐเจคเฉเจ เจนเจฐ เจฅเจพเจ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ: DDoS เจนเจฎเจฒเจฟเจเจ เจคเฉเจ เจธเฉเจฐเฉฑเจเจฟเจ เจฒเจ, SDN เจฌเจฃเจพเจเจฃเจพ (เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉเจฌเจฐเจจเฉเจเจธ เจฒเจ เจจเฉเจเจตเจฐเจ เจฒเจพเจเฉ เจเจฐเจจเจพ), เจฎเฉเฉฑเจ เจธเจฟเจธเจเจฎ เจเจฐเฉเจธเจฟเฉฐเจ เจเฉเจฒ เจ เจคเฉ เจ เฉฐเจเฉเจพ เจเฉเจฒเฉเจเจเจฐ เจฆเฉ เจคเฉเจฐ 'เจคเฉ, เจเฉเจธเจชเฉเจ เจเฉเจ เจชเฉเจฐเจฃเจพเจฒเฉเจเจ เจ เจคเฉ เจธเฉเจเจกเจฌเฉเจเจธ เจชเฉเจฐเจฃเจพเจฒเฉเจเจ เจเจฆเจฟ เจตเจฟเฉฑเจเฅค
เจเจ เจฒเฉเจ เจฆเฉ เจธเฉฐเจเฉเจช เจญเจพเจ เจจเฉเฉฐ เจเฉฑเจฅเฉ เจเจคเจฎ เจเจฐเฉเจ เจ เจคเฉ เจตเจฐเจเฉเจ เจฒ เจฎเจธเจผเฉเจจ เจ เจคเฉ BPF เจเจเฉเจธเจฟเจธเจเจฎ เจจเฉเฉฐ เจนเฉเจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจตเฉเจเฉเจเฅค
เจกเจฟเจเฉเจฐเฉเจธเจผเจจ: เจเจชเจฏเฉเจเจคเจพเจตเจพเจ
เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจญเจพเจเจพเจ เจตเจฟเฉฑเจ เจเจฆเจพเจนเจฐเจจเจพเจ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฆเฉ เจฏเฉเจ เจนเฉเจฃ เจฒเจ, เจคเฉเจนเจพเจจเฉเฉฐ เจเฉฑเจเฉ-เจเฉฑเจ เจเจ เจเจชเจฏเฉเจเจคเจพเจตเจพเจ เจฆเฉ เจฒเฉเฉ เจนเฉ เจธเจเจฆเฉ เจนเฉ llvm
/clang
bpf เจธเจนเจฟเจฏเฉเจ เจจเจพเจฒ เจ
เจคเฉ bpftool
. เจญเจพเจ เจตเจฟเฉฑเจ
เจฌเฉเจชเฉเจเจซ เจตเจฐเจเฉเจ เจฒ เจฎเจธเจผเฉเจจ เจฐเจเจฟเจธเจเจฐ เจ เจคเฉ เจนเจฆเจพเจเจค เจชเฉเจฐเจฃเจพเจฒเฉ
เจฌเฉเจชเฉเจเจซ เจฆเจพ เจเจฐเจเฉเจเฉเจเจเจฐ เจ เจคเฉ เจเจฎเจพเจเจก เจธเจฟเจธเจเจฎ เจเจธ เจคเฉฑเจฅ เจจเฉเฉฐ เจงเจฟเจเจจ เจตเจฟเฉฑเจ เจฐเฉฑเจเจฆเฉ เจนเฉเจ เจตเจฟเจเจธเจค เจเฉเจคเจพ เจเจฟเจ เจธเฉ เจเจฟ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจธเฉ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจ เจฒเจฟเจเจฟเจ เจเจพเจตเฉเจเจพ เจ เจคเฉ, เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเจฐเจจ เจคเฉเจ เจฌเจพเจ เจฆ, เจฎเฉเจฒ เจเฉเจก เจตเจฟเฉฑเจ เจ เจจเฉเจตเจพเจฆ เจเฉเจคเจพ เจเจพเจตเฉเจเจพเฅค เจเจธ เจฒเจ, เจฐเจเจฟเจธเจเจฐเจพเจ เจฆเฉ เจเจฟเจฃเจคเฉ เจ เจคเฉ เจเจฎเจพเจเจกเจพเจ เจฆเฉ เจธเจฎเฉเจน เจจเฉเฉฐ เจเจฃเจฟเจคเจฟเจ เจ เจฐเจฅเจพเจ เจตเจฟเฉฑเจ, เจเจงเฉเจจเจฟเจ เจฎเจธเจผเฉเจจเจพเจ เจฆเฉเจเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฆเฉ เจเฉฐเจเจฐเจธเฉเจเจธเจผเจจ เจจเฉเฉฐ เจ เฉฑเจ เจจเจพเจฒ เจเฉเจฃเจฟเจ เจเจฟเจ เจธเฉเฅค เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ, เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ 'เจคเฉ เจเจ เจคเจฐเฉเจนเจพเจ เจฆเฉเจเจ เจชเจพเจฌเฉฐเจฆเฉเจเจ เจฒเจเจพเจเจเจ เจเจเจเจ เจธเจจ, เจเจฆเจพเจนเจฐเจฃ เจตเจเฉเจ, เจนเจพเจฒ เจนเฉ เจตเจฟเฉฑเจ เจฒเฉเจช เจ เจคเฉ เจธเจฌเจฐเฉเจเฉเจจ เจฒเจฟเจเจฃเจพ เจธเฉฐเจญเจต เจจเจนเฉเจ เจธเฉ, เจ เจคเฉ เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจฆเฉ เจเจฟเจฃเจคเฉ 4096 เจคเฉฑเจ เจธเฉเจฎเจฟเจค เจธเฉ (เจนเฉเจฃ เจตเจฟเจธเจผเฉเจธเจผ เจ เจงเจฟเจเจพเจฐ เจชเฉเจฐเจพเจชเจค เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเฉฑเจ เจฎเจฟเจฒเฉเจ เจจ เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจคเฉฑเจ เจฒเฉเจก เจเจฐ เจธเจเจฆเฉ เจนเจจ)เฅค
BPF เจเฉเจฒ เจเจฟเจเจฐเจพเจ เจเจชเจญเฉเจเจคเจพ-เจชเจนเฉเฉฐเจเจฏเฉเจ 64-เจฌเจฟเฉฑเจ เจฐเจเจฟเจธเจเจฐ เจนเจจ r0
-r10
เจ
เจคเฉ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจพเจเจเจเจฐเฅค เจฐเจเจฟเจธเจเจฐ r10
เจเฉฑเจ เจซเจฐเฉเจฎ เจชเฉเจเจเฉฐเจเจฐ เจฐเฉฑเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจธเจฟเจฐเจซเจผ เจชเฉเฉเจนเจจ เจฒเจ เจนเฉเฅค เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจเฉเจฒ เจฐเจจเจเจพเจเจฎ 'เจคเฉ 512-เจฌเจพเจเจ เจธเจเฉเจ เจ
เจคเฉ เจจเจเจธเจผเจฟเจเจ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจธเจผเฉเจ
เจฐเจก เจฎเฉเจฎเฉเจฐเฉ เจฆเฉ เจ
เจธเฉเจฎเจฟเจค เจฎเจพเจคเจฐเจพ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค
BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ-เจเจฟเจธเจฎ เจฆเฉ เจเจฐเจจเจฒ เจธเจนเจพเจเจเจพเจ เจฆเฉ เจเฉฑเจ เจเจพเจธ เจธเฉเฉฑเจ เจ
เจคเฉ, เจนเจพเจฒ เจนเฉ เจตเจฟเฉฑเจ, เจจเจฟเจฏเจฎเจค เจซเฉฐเจเจธเจผเจจเจพเจ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฑเจคเฉ เจเจพเจเจฆเฉ เจนเฉเฅค เจนเจฐเฉเจ เจเจนเจฟเฉฐเจฆเฉ เจนเฉเจ เจซเฉฐเจเจธเจผเจจ เจชเฉฐเจ เจเจฐเจเฉเจฎเฉเจเจ เจฒเฉ เจธเจเจฆเจพ เจนเฉ, เจฐเจเจฟเจธเจเจฐเจพเจ เจตเจฟเฉฑเจ เจชเจพเจธ เจเฉเจคเจพ เจเจฟเจ เจนเฉ r1
-r5
, เจ
เจคเฉ เจตเจพเจชเจธเฉ เจฎเฉเฉฑเจฒ เจจเฉเฉฐ เจชเจพเจธ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ r0
. เจเจน เจเจพเจฐเฉฐเจเฉ เจนเฉ เจเจฟ เจซเฉฐเจเจธเจผเจจ เจคเฉเจ เจตเจพเจชเจธ เจเจเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ, เจฐเจเจฟเจธเจเจฐเจพเจ เจฆเฉ เจธเจฎเฉฑเจเจฐเฉ r6
-r9
เจจเจนเฉเจ เจฌเจฆเจฒเฉเจเจพเฅค
เจเฉเจธเจผเจฒ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจ
เจจเฉเจตเจพเจฆ เจฒเจ, เจฐเจเจฟเจธเจเจฐ r0
-r11
เจฎเฉเจเฉเจฆเจพ เจเจฐเจเฉเจเฉเจเจเจฐ เจฆเฉเจเจ ABI เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจจเฉเฉฐ เจงเจฟเจเจจ เจตเจฟเฉฑเจ เจฐเฉฑเจเจฆเฉ เจนเฉเจ, เจธเจพเจฐเฉ เจธเจฎเจฐเจฅเจฟเจค เจขเจพเจเจเจฟเจเจ เจจเฉเฉฐ เจ
เจธเจฒ เจฐเจเจฟเจธเจเจฐเจพเจ เจตเจฟเฉฑเจ เจตเจฟเจฒเฉฑเจเจฃ เจฐเฉเจช เจตเจฟเฉฑเจ เจฎเฉเจช เจเฉเจคเจพ เจเจฟเจ เจนเฉเฅค เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจฒเจ x86_64
เจฐเจเจฟเจธเจเจฐ เจเจฐเจฆเจพ เจนเฉ r1
-r5
, เจซเฉฐเจเจธเจผเจจ เจชเฉเจฐเจพเจฎเฉเจเจฐเจพเจ เจจเฉเฉฐ เจชเจพเจธ เจเจฐเจจ เจฒเจ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉ, 'เจคเฉ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจนเฉเฉฐเจฆเฉ เจนเจจ rdi
, rsi
, rdx
, rcx
, r8
, เจเฉ เจเจฟ เจซเฉฐเจเจธเจผเจจเจพเจ เจจเฉเฉฐ เจชเฉเจฐเจพเจฎเฉเจเจฐ เจชเจพเจธ เจเจฐเจจ เจฒเจ เจตเจฐเจคเฉ เจเจพเจเจฆเฉ เจนเจจ x86_64
. เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉฑเจฌเฉ เจชเจพเจธเฉ เจฆเจพ เจเฉเจก เจธเฉฑเจเฉ เจชเจพเจธเฉ เจฆเฉ เจเฉเจก เจตเจฟเฉฑเจ เจเจธ เจคเจฐเฉเจนเจพเจ เจ
เจจเฉเจตเจพเจฆ เจเจฐเจฆเจพ เจนเฉ:
1: (b7) r1 = 1 mov $0x1,%rdi
2: (b7) r2 = 2 mov $0x2,%rsi
3: (b7) r3 = 3 mov $0x3,%rdx
4: (b7) r4 = 4 mov $0x4,%rcx
5: (b7) r5 = 5 mov $0x5,%r8
6: (85) call pc+1 callq 0x0000000000001ee8
เจฐเจเจฟเจธเจเจฐ r0
เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจฆเจพ เจจเจคเฉเจเจพ เจตเจพเจชเจธ เจเจฐเจจ เจฒเจ เจตเฉ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉ, เจ
เจคเฉ เจฐเจเจฟเจธเจเจฐ เจตเจฟเฉฑเจ r1
เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจธเฉฐเจฆเจฐเจญ เจฒเจ เจเฉฑเจ เจชเฉเจเจเฉฐเจเจฐ เจชเจพเจธ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ - เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจเจฟเจธเจฎ 'เจคเฉ เจจเจฟเจฐเจญเจฐ เจเจฐเจฆเจฟเจเจ, เจเจน, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉฑเจ เจฌเจฃเจคเจฐ เจนเฉ เจธเจเจฆเจพ เจนเฉ struct xdp_md
struct __sk_buff
struct pt_regs
เจเจธ เจฒเจ, เจธเจพเจกเฉ เจเฉเจฒ เจจเจเจธเจผเจฟเจเจ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจฐเจเจฟเจธเจเจฐเจพเจ, เจเจฐเจจเจฒ เจธเจนเจพเจเจเจพเจ, เจเฉฑเจ เจธเจเฉเจ, เจเฉฑเจ เจธเฉฐเจฆเจฐเจญ เจชเฉเจเจเฉฐเจเจฐ เจ เจคเฉ เจธเจผเฉเจ เจฐเจก เจฎเฉเจฎเฉเจฐเฉ เจฆเจพ เจเฉฑเจ เจธเฉเฉฑเจ เจธเฉเฅค เจเจน เจจเจนเฉเจ เจเจฟ เจฏเจพเจคเจฐเจพ 'เจคเฉ เจเจน เจธเจญ เจเจผเจฐเฉเจฐเฉ เจนเฉ, เจชเจฐ ...
เจเจ เจตเจฐเจฃเจจ เจจเฉเฉฐ เจเจพเจฐเฉ เจฐเฉฑเจเฉเจ เจ
เจคเฉ เจเจนเจจเจพเจ เจตเจธเจคเฉเจเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจเจฎเจพเจเจก เจธเจฟเจธเจเจฎ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเฉเจเฅค เจธเจพเจฐเฉ (
เจเจน เจเจธ เจฒเจ เจนเฉ Code
- เจเจน เจนเจฆเจพเจเจค เจฆเฉ เจเจจเจเฉเจกเจฟเฉฐเจ เจนเฉ, Dst
/Src
เจฐเจฟเจธเฉเจตเจฐ เจ
เจคเฉ เจธเจฐเฉเจค เจฆเฉ เจเจจเจเฉเจกเจฟเฉฐเจ เจนเจจ, เจเฉเจฐเจฎเจตเจพเจฐ, Off
- 16-เจฌเจฟเฉฑเจ เจนเจธเจคเจพเจเจฐเจฟเจค เจเฉฐเจกเฉเจเจเฉเจธเจผเจจ, เจ
เจคเฉ Imm
เจเฉฑเจ 32-เจฌเจฟเฉฑเจ เจนเจธเจคเจพเจเจฐเจฟเจค เจชเฉเจฐเจจ เจ
เฉฐเจ เจนเฉ เจเฉ เจเฉเจ เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจตเจฟเฉฑเจ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉ (cBPF เจธเจฅเจฟเจฐ K เจฆเฉ เจธเจฎเจพเจจ)เฅค เจเจจเจเฉเจกเจฟเฉฐเจ Code
เจฆเฉ เจเจฟเจธเจฎเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจนเฉ:
เจนเจฆเจพเจเจคเจพเจ เจฆเฉเจเจ เจเจฒเจพเจธเจพเจ 0, 1, 2, 3 เจฎเฉเจฎเฉเจฐเฉ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจเจฎเจพเจเจกเจพเจ เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจฆเฉเจเจ เจนเจจเฅค เจเจน BPF_LD
, BPF_LDX
, BPF_ST
, BPF_STX
, เจเฉเจฐเจฎเจตเจพเจฐ. เจเจฒเจพเจธ 4, 7 (BPF_ALU
, BPF_ALU64
) ALU เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจฆเจพ เจเฉฑเจ เจธเจฎเฉเจน เจฌเจฃเจพเจเจเจฆเฉ เจนเจจเฅค เจเจฒเจพเจธ 5, 6 (BPF_JMP
, BPF_JMP32
) เจตเจฟเฉฑเจ เจเฉฐเจช เจนเจฟเจฆเจพเจเจคเจพเจ เจธเจผเจพเจฎเจฒ เจนเจจเฅค
BPF เจจเจฟเจฐเจฆเฉเจธเจผ เจชเฉเจฐเจฃเจพเจฒเฉ เจฆเจพ เจ เจงเจฟเจเจจ เจเจฐเจจ เจฆเฉ เจ เจเจฒเฉ เจฏเฉเจเจจเจพ เจเจธ เจคเจฐเฉเจนเจพเจ เจนเฉ: เจธเจพเจฐเฉเจเจ เจนเจฆเจพเจเจคเจพเจ เจ เจคเฉ เจเจนเจจเจพเจ เจฆเฉ เจฎเจพเจชเจฆเฉฐเจกเจพเจ เจจเฉเฉฐ เจงเจฟเจเจจ เจจเจพเจฒ เจธเฉเจเฉเจฌเฉฑเจง เจเจฐเจจ เจฆเฉ เจฌเจเจพเจ, เจ เจธเฉเจ เจเจธ เจญเจพเจ เจตเจฟเฉฑเจ เจเฉเจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจฆเฉเจเจพเจเจเฉ เจ เจคเฉ เจเจนเจจเจพเจ เจคเฉเจ เจเจน เจธเจชเฉฑเจธเจผเจ เจนเฉ เจเจพเจตเฉเจเจพ เจเจฟ เจจเจฟเจฐเจฆเฉเจธเจผ เจ เจธเจฒ เจตเจฟเฉฑเจ เจเจฟเจตเฉเจ เจเฉฐเจฎ เจเจฐเจฆเฉ เจนเจจ เจ เจคเฉ เจเจฟเจตเฉเจ BPF เจฒเจ เจเจฟเจธเฉ เจตเฉ เจฌเจพเจเจจเจฐเฉ เจซเจพเจเจฒ เจจเฉเฉฐ เจนเฉฑเจฅเฉเจ เจตเฉฑเจ เจเจฐเฉเฅค เจฒเฉเจ เจตเจฟเจ เจฌเจพเจ เจฆ เจตเจฟเจ เจธเจฎเฉฑเจเจฐเฉ เจจเฉเฉฐ เจเจเจธเจพเจฐ เจเจฐเจจ เจฒเจ, เจ เจธเฉเจ เจตเฉเจฐเฉเจซเจพเจเจฐ, เจเฉเจเจเจเฉ เจเฉฐเจชเจพเจเจฒเจฐ, เจเจฒเจพเจธเจฟเจ เจฌเฉเจชเฉเจเจซ เจฆเฉ เจ เจจเฉเจตเจพเจฆ เจฆเฉ เจจเจพเจฒ-เจจเจพเจฒ เจจเจเจธเจผเจฟเจเจ เจฆเจพ เจ เจงเจฟเจเจจ เจเจฐเจฆเฉ เจธเจฎเฉเจ, เจเจพเจฒเจฟเฉฐเจ เจซเฉฐเจเจธเจผเจจเจพเจ เจเจฆเจฟ เจฌเจพเจฐเฉ เจญเจพเจเจพเจ เจตเจฟเจ เจตเจฟเจ เจเจคเฉเจเจค เจนเจฆเจพเจเจคเจพเจ เจจเจพเจฒ เจตเฉ เจฎเฉเจฒเจพเจเจพเจค เจเจฐเจพเจเจเฉเฅค
เจเจฆเฉเจ เจ
เจธเฉเจ เจตเจฟเจ
เจเจคเฉเจเจค เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเจฆเฉ เจนเจพเจ, เจ
เจธเฉเจ เจเฉเจฐ เจซเจพเจเจฒเจพเจ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเฉเจตเจพเจเจเฉ bpf.h
bpf_common.h
เจเจฆเจพเจนเจฐเจจ: เจคเฉเจนเจพเจกเฉ เจธเจฟเจฐ เจตเจฟเฉฑเจ BPF เจจเฉเฉฐ เจตเฉฑเจ เจเจฐเจจเจพ
เจเจ เจเฉฑเจ เจเจฆเจพเจนเจฐเจจ เจตเฉเจเฉเจ เจเจฟเจธ เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเฉฐเจชเจพเจเจฒ เจเจฐเจฆเฉ เจนเจพเจ readelf-example.c
เจ
เจคเฉ เจจเจคเฉเจเฉ เจตเจเฉเจ เจฌเจพเจเจจเจฐเฉ เจจเฉเฉฐ เจฆเฉเจเฉเฅค เจ
เจธเฉเจ เจ
เจธเจฒ เจธเจฎเฉฑเจเจฐเฉ เจจเฉเฉฐ เจชเฉเจฐเจเจ เจเจฐเจพเจเจเฉ readelf-example.c
เจนเฉเจ เจพเจ, เจฌเจพเจเจจเจฐเฉ เจเฉเจกเจพเจ เจคเฉเจ เจเจธเจฆเฉ เจคเจฐเจ เจจเฉเฉฐ เจฌเจนเจพเจฒ เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ:
$ clang -target bpf -c readelf-example.c -o readelf-example.o -O2
$ llvm-readelf -x .text readelf-example.o
Hex dump of section '.text':
0x00000000 b7000000 01000000 15010100 00000000 ................
0x00000010 b7000000 02000000 95000000 00000000 ................
เจเจเจเจชเฉเฉฑเจ เจตเจฟเฉฑเจ เจชเจนเจฟเจฒเจพ เจเจพเจฒเจฎ readelf
เจเฉฑเจ เจเฉฐเจกเฉเจเจเฉเจธเจผเจจ เจนเฉ เจ
เจคเฉ เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจเจพเจฐ เจเจฎเจพเจเจกเจพเจ เจนเจจ:
Code Dst Src Off Imm
b7 0 0 0000 01000000
15 0 1 0100 00000000
b7 0 0 0000 02000000
95 0 0 0000 00000000
เจเจฎเจพเจเจก เจเฉเจก เจฌเจฐเจพเจฌเจฐ เจนเจจ b7
, 15
, b7
ะธ 95
. เจฏเจพเจฆ เจเจฐเฉ เจเจฟ เจเฉฑเจเฉ-เจเฉฑเจ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจคเจฟเฉฐเจจ เจฌเจฟเฉฑเจ เจนเจฆเจพเจเจค เจเจฒเจพเจธ เจนเจจเฅค เจธเจพเจกเฉ เจเฉเจธ เจตเจฟเฉฑเจ, เจธเจพเจฐเฉเจเจ เจนเจฆเจพเจเจคเจพเจ เจฆเจพ เจเฉเจฅเจพ เจฌเจฟเฉฑเจ เจเจพเจฒเฉ เจนเฉ, เจเจธเจฒเจ เจนเจฆเจพเจเจค เจฆเฉเจเจ เจเจฒเจพเจธเจพเจ เจเฉเจฐเจฎเจตเจพเจฐ 7, 5, 7, 5 เจนเจจเฅค เจเจฒเจพเจธ 7 เจนเฉ BPF_ALU64
, เจ
เจคเฉ 5 เจนเฉ BPF_JMP
. เจฆเฉเจตเจพเจ เจเจฒเจพเจธเจพเจ เจฒเจ, เจนเจฆเจพเจเจค เจฆเจพ เจซเจพเจฐเจฎเฉเจ เจเฉฑเจเฉ เจเจฟเจนเจพ เจนเฉ (เจเฉฑเจชเจฐ เจฆเฉเจเฉ) เจ
เจคเฉ เจ
เจธเฉเจ เจเจชเจฃเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ เจธเจเจฆเฉ เจนเจพเจ (เจเจธเฉ เจธเจฎเฉเจ เจ
เจธเฉเจ เจฌเจพเจเฉ เจฆเฉ เจเจพเจฒเจฎเจพเจ เจจเฉเฉฐ เจฎเจจเฉเฉฑเจเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจเจพเจเจเฉ):
Op S Class Dst Src Off Imm
b 0 ALU64 0 0 0 1
1 0 JMP 0 1 1 0
b 0 ALU64 0 0 0 2
9 0 JMP 0 0 0 0
เจเจชเจฐเฉเจธเจผเจจ b
เจเจฒเจพเจธ ALU64
เจนเฉ s
(เจธเจฐเฉเจค), เจซเจฟเจฐ เจฎเฉเฉฑเจฒ เจธเจฐเฉเจค เจฐเจเจฟเจธเจเจฐ เจคเฉเจ เจฒเจฟเจ เจเจพเจเจฆเจพ เจนเฉ, เจ
เจคเฉ เจเฉเจเจฐ, เจเจฟเจตเฉเจ เจเจฟ เจธเจพเจกเฉ เจเฉเจธ เจตเจฟเฉฑเจ, เจเจน เจธเฉเฉฑเจ เจจเจนเฉเจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจคเจพเจ เจฎเฉเฉฑเจฒ เจจเฉเฉฐ เจเฉเจคเจฐ เจคเฉเจ เจฒเจฟเจ เจเจพเจเจฆเจพ เจนเฉ Imm
. เจเจธ เจฒเจ เจชเจนเจฟเจฒเฉ เจ
เจคเฉ เจคเฉเจเฉ เจนเจฆเจพเจเจค เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจเจพเจฐเจตเจพเจ เจเจฐเจฆเฉ เจนเจพเจ r0 = Imm
. เจ
เฉฑเจเฉ, JMP เจเจฒเจพเจธ 1 เจเจชเจฐเฉเจธเจผเจจ เจนเฉ S
เจเจผเฉเจฐเฉ เจนเฉ, เจเจน เจซเฉเจฒเจก เจจเจพเจฒ เจธเจฐเฉเจค เจฐเจเจฟเจธเจเจฐ เจฆเฉ เจฎเฉเฉฑเจฒ เจฆเฉ เจคเฉเจฒเจจเจพ เจเจฐเจฆเจพ เจนเฉ Imm
. เจเฉเจเจฐ เจฎเฉเฉฑเจฒ เจฎเฉเจฒ เจเจพเจเจฆเฉ เจนเจจ, เจคเจพเจ เจคเจฌเจฆเฉเจฒเฉ เจนเฉเฉฐเจฆเฉ เจนเฉ PC + Off
เจเจฟเฉฑเจฅเฉ PC
, เจเจฎ เจตเจพเจเจ, เจ
เจเจฒเฉ เจนเจฆเจพเจเจค เจฆเจพ เจชเจคเจพ เจธเจผเจพเจฎเจฒ เจเจฐเจฆเจพ เจนเฉเฅค เจ
เฉฐเจค เจตเจฟเฉฑเจ, เจเฉเจเจฎเจชเฉ เจเจฒเจพเจธ 9 เจเจชเจฐเฉเจธเจผเจจ เจนเฉ BPF_EXIT
r0
. เจเจ เจเจชเจฃเฉ เจธเจพเจฐเจฃเฉ เจตเจฟเฉฑเจ เจเฉฑเจ เจจเจตเจพเจ เจเจพเจฒเจฎ เจเฉเฉเฉเจ:
Op S Class Dst Src Off Imm Disassm
MOV 0 ALU64 0 0 0 1 r0 = 1
JEQ 0 JMP 0 1 1 0 if (r1 == 0) goto pc+1
MOV 0 ALU64 0 0 0 2 r0 = 2
EXIT 0 JMP 0 0 0 0 exit
เจ เจธเฉเจ เจเจธเจจเฉเฉฐ เจตเจงเฉเจฐเฉ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจฐเฉเจช เจตเจฟเฉฑเจ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ เจธเจเจฆเฉ เจนเจพเจ:
r0 = 1
if (r1 == 0) goto END
r0 = 2
END:
exit
เจเฉ เจธเจพเจจเฉเฉฐ เจฏเจพเจฆ เจนเฉ เจเจฟ เจฐเจเจฟเจธเจเจฐ เจตเจฟเจ เจเฉ เจนเฉ r1
เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจฐเจจเจฒ เจคเฉเจ เจชเฉเจฐเจธเฉฐเจ เจฒเจ เจเฉฑเจ เจชเฉเจเจเฉฐเจเจฐ เจชเจพเจธ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ, เจ
เจคเฉ เจฐเจเจฟเจธเจเจฐ เจตเจฟเฉฑเจ r0
เจฎเฉเฉฑเจฒ เจเจฐเจจเจฒ เจจเฉเฉฐ เจตเจพเจชเจธ เจเจฐ เจฆเจฟเฉฑเจคเจพ เจเจพเจเจฆเจพ เจนเฉ, เจซเจฟเจฐ เจ
เจธเฉเจ เจฆเฉเจ เจธเจเจฆเฉ เจนเจพเจ เจเจฟ เจเฉเจเจฐ เจธเฉฐเจฆเจฐเจญ เจตเฉฑเจฒ เจชเฉเจเจเฉฐเจเจฐ เจเจผเฉเจฐเฉ เจนเฉ, เจคเจพเจ เจ
เจธเฉเจ 1 เจตเจพเจชเจธ เจเจฐเจฆเฉ เจนเจพเจ, เจ
เจคเฉ เจจเจนเฉเจ เจคเจพเจ - 2. เจเจ เจ
เจธเฉเจ เจธเจฐเฉเจค เจจเฉเฉฐ เจฆเฉเจ เจเฉ เจเจพเจเจ เจเจฐเฉเจ เจเจฟ เจ
เจธเฉเจ เจธเจนเฉ เจนเจพเจ:
$ cat readelf-example.c
int foo(void *ctx)
{
return ctx ? 2 : 1;
}
เจนเจพเจ, เจเจน เจเฉฑเจ เจ เจฐเจฅเจนเฉเจฃ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจนเฉ, เจชเจฐ เจเจน เจธเจฟเจฐเจซเจผ เจเจพเจฐ เจธเจงเจพเจฐเจจ เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจตเจฟเฉฑเจ เจ เจจเฉเจตเจพเจฆ เจเจฐเจฆเจพ เจนเฉเฅค
เจ เจชเจตเจพเจฆ เจเจฆเจพเจนเจฐเจจ: 16-เจฌเจพเจเจ เจนเจฆเจพเจเจค
เจ
เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจเจผเจฟเจเจฐ เจเฉเจคเจพ เจนเฉ เจเจฟ เจเฉเจ เจจเจฟเจฐเจฆเฉเจธเจผ 64 เจฌเจฟเฉฑเจ เจคเฉเจ เจตเฉฑเจง เจฒเฉเจเจฆเฉ เจนเจจเฅค เจเจน, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ 'เจคเฉ เจฒเจพเจเฉ เจนเฉเฉฐเจฆเจพ เจนเฉ lddw
(เจเฉเจก = 0x18
= BPF_LD
BPF_DW
BPF_IMM
Imm
... เจคเฉฑเจฅ เจเจน เจนเฉ เจเจฟ Imm
เจฆเจพ เจเจเจพเจฐ 32 เจนเฉ, เจ
เจคเฉ เจเฉฑเจ เจฆเฉเจนเจฐเจพ เจธเจผเจฌเจฆ 64 เจฌเจฟเฉฑเจ เจนเฉ, เจเจธเจฒเจ เจเฉฑเจ 64-เจฌเจฟเฉฑเจ เจนเจฆเจพเจเจค เจตเจฟเฉฑเจ เจเฉฑเจ เจฐเจเจฟเจธเจเจฐ เจตเจฟเฉฑเจ 64-เจฌเจฟเฉฑเจ เจคเจคเจเจพเจฒ เจฎเฉเฉฑเจฒ เจฒเฉเจก เจเจฐเจจเจพ เจเฉฐเจฎ เจจเจนเฉเจ เจเจฐเฉเจเจพเฅค เจ
เจเจฟเจนเจพ เจเจฐเจจ เจฒเจ, เจเฉเจคเจฐ เจตเจฟเฉฑเจ 64-เจฌเจฟเฉฑเจ เจฎเฉเฉฑเจฒ เจฆเฉ เจฆเฉเจเฉ เจนเจฟเฉฑเจธเฉ เจจเฉเฉฐ เจธเจเฉเจฐ เจเจฐเจจ เจฒเจ เจฆเฉ เจจเจพเจฒ เจฒเฉฑเจเจฆเฉเจเจ เจนเจฆเจพเจเจคเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ Imm
. เจเจฆเจพเจนเจฐเจจ:
$ cat x64.c
long foo(void *ctx)
{
return 0x11223344aabbccdd;
}
$ clang -target bpf -c x64.c -o x64.o -O2
$ llvm-readelf -x .text x64.o
Hex dump of section '.text':
0x00000000 18000000 ddccbbaa 00000000 44332211 ............D3".
0x00000010 95000000 00000000 ........
เจฌเจพเจเจจเจฐเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจธเจฟเจฐเจซเจผ เจฆเฉ เจนเจฆเจพเจเจคเจพเจ เจนเจจ:
Binary Disassm
18000000 ddccbbaa 00000000 44332211 r0 = Imm[0]|Imm[1]
95000000 00000000 exit
เจ
เจธเฉเจ เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจจเจพเจฒ เจฆเฉเจฌเจพเจฐเจพ เจฎเจฟเจฒเจพเจเจเฉ lddw
, เจเจฆเฉเจ เจ
เจธเฉเจ เจชเฉเจฒเจพเฉ เจ
เจคเฉ เจจเจเจธเจผเจฟเจเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเจฆเฉ เจนเจพเจเฅค
เจเจฆเจพเจนเจฐเจจ: เจฎเจฟเจเจฐเฉ เจเจเจผเจพเจฐเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ BPF เจจเฉเฉฐ เจตเฉฑเจ เจเจฐเจจเจพ
เจเจธ เจฒเจ, เจ เจธเฉเจ BPF เจฌเจพเจเจจเจฐเฉ เจเฉเจกเจพเจ เจจเฉเฉฐ เจชเฉเฉเจนเจจเจพ เจธเจฟเฉฑเจเจฟเจ เจนเฉ เจ เจคเฉ เจเฉเจเจฐ เจฒเฉเฉ เจนเฉเจตเฉ เจคเจพเจ เจเจฟเจธเฉ เจตเฉ เจนเจฆเจพเจเจค เจจเฉเฉฐ เจชเจพเจฐเจธ เจเจฐเจจ เจฒเจ เจคเจฟเจเจฐ เจนเจพเจเฅค เจนเจพเจฒเจพเจเจเจฟ, เจเจน เจเจนเจฟเจฃเจพ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจฃ เจนเฉ เจเจฟ เจ เจญเจฟเจเจธ เจตเจฟเฉฑเจ เจฎเจฟเจเจฐเฉ เจธเจพเจงเจจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจตเฉฑเจ เจเจฐเจจเจพ เจตเจงเฉเจฐเฉ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจ เจคเฉ เจคเฉเจเจผ เจนเฉ, เจเจฆเจพเจนเจฐเจฃ เจฒเจ:
$ llvm-objdump -d x64.o
Disassembly of section .text:
0000000000000000 <foo>:
0: 18 00 00 00 dd cc bb aa 00 00 00 00 44 33 22 11 r0 = 1234605617868164317 ll
2: 95 00 00 00 00 00 00 00 exit
เจฌเฉเจชเฉเจเจซ เจตเจธเจคเฉเจเจ เจฆเจพ เจเฉเจตเจจ เจเฉฑเจเจฐ, เจฌเฉเจชเฉเจเจซเจเจธ เจซเจพเจเจฒ เจธเจฟเจธเจเจฎ
(เจฎเฉเจ เจชเจนเจฟเจฒเจพเจ เจเจธ เจเจชเจญเจพเจ เจตเจฟเฉฑเจ เจตเจฐเจฃเจฟเจค เจเฉเจ เจตเฉเจฐเจตเจฟเจเจ เจคเฉเจ เจธเจฟเฉฑเจเจฟเจ
BPF เจตเจธเจคเฉเจเจ - เจชเฉเจฐเฉเจเจฐเจพเจฎ เจ
เจคเฉ เจจเจเจธเจผเฉ - เจเจฎเจพเจเจกเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจคเฉเจ เจฌเจฃเจพเจ เจเจ เจนเจจ BPF_PROG_LOAD
ะธ BPF_MAP_CREATE
เจธเจฟเจธเจเจฎ เจเจพเจฒ bpf(2)
, เจ
เจธเฉเจ เจ
เจเจฒเฉ เจญเจพเจ เจตเจฟเฉฑเจ เจเจธ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเจพเจเจเฉ เจเจฟ เจเจน เจเจฟเจตเฉเจ เจตเจพเจชเจฐเจฆเจพ เจนเฉเฅค เจเจน เจเจฐเจจเจฒ เจกเจพเจเจพ เจฌเจฃเจคเจฐ เจฌเจฃเจพเจเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจนเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจนเจฐเฉเจ เจฒเจ refcount
(เจนเจตเจพเจฒเจพ เจเจฟเจฃเจคเฉ) เจจเฉเฉฐ เจเฉฑเจ 'เจคเฉ เจธเฉเฉฑเจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจ
เจคเฉ เจเจฌเจเฉเจเจ เจตเฉฑเจฒ เจเจธเจผเจพเจฐเจพ เจเจฐเจจ เจตเจพเจฒเฉ เจเฉฑเจ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจเจชเจญเฉเจเจคเจพ เจจเฉเฉฐ เจตเจพเจชเจธ เจเจฐ เจฆเจฟเฉฑเจคเฉ เจเจพเจเจฆเฉ เจนเฉเฅค เจนเฉเจเจกเจฒ เจฌเฉฐเจฆ เจนเฉเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ refcount
เจตเจธเจคเฉ เจจเฉเฉฐ เจเฉฑเจ เจฆเฉเจเจฐเจพ เจเจเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ, เจ
เจคเฉ เจเจฆเฉเจ เจเจน เจเจผเฉเจฐเฉ เจคเฉฑเจ เจชเจนเฉเฉฐเจเจฆเจพ เจนเฉ, เจคเจพเจ เจตเจธเจคเฉ เจจเจธเจผเจ เจนเฉ เจเจพเจเจฆเฉ เจนเฉเฅค
เจเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเจเจธเจผเจฟเจเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเจพ เจนเฉ, เจคเจพเจ refcount
เจเจน เจจเจเจธเจผเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฒเฉเจก เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ เจเฉฑเจ เจฆเฉเจเจฐเจพ เจตเจงเจพเจ เจเจพเจเจฆเฉ เจนเจจ, เจเจฟเจตเฉเจ เจเจฟ. เจเจนเจจเจพเจ เจฆเฉ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐเจพเจ เจจเฉเฉฐ เจเจชเจญเฉเจเจคเจพ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจคเฉเจ เจฌเฉฐเจฆ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจ
เจเฉ เจตเฉ refcount
เจเจผเฉเจฐเฉ เจจเจนเฉเจ เจฌเจฃเฉเจเจพ:
เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจธเจซเจฒเจคเจพเจชเฉเจฐเจตเจ เจฒเฉเจก เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ, เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจเจฟเจธเฉ เจเจฟเจธเจฎ เจฆเฉ เจเจตเฉเจเจ เจเจจเจฐเฉเจเจฐ เจจเจพเจฒ เจเฉเฉเจฆเฉ เจนเจพเจเฅค เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจ
เจธเฉเจ เจเจเจฃ เจตเจพเจฒเฉ เจชเฉเจเฉเจเจพเจ เจฆเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจเจฐเจจ เจฒเจ เจเจธเจจเฉเฉฐ เจเฉฑเจ เจจเฉเจเจตเจฐเจ เจเฉฐเจเจฐเจซเฉเจธ เจคเฉ เจฐเฉฑเจ เจธเจเจฆเฉ เจนเจพเจ เจเจพเจ เจเจธเจจเฉเฉฐ เจเฉเจ เจจเจพเจฒ เจเฉเฉ เจธเจเจฆเฉ เจนเจพเจ tracepoint
เจเฉเจฐ เจตเจฟเฉฑเจ. เจเจธ เจฌเจฟเฉฐเจฆเฉ 'เจคเฉ, เจนเจตเจพเจฒเจพ เจเจพเจเจเจเจฐ เจตเฉ เจเฉฑเจ เจคเฉเจ เจตเฉฑเจง เจเจพเจตเฉเจเจพ เจ
เจคเฉ เจ
เจธเฉเจ เจฒเฉเจกเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจจเฉเฉฐ เจฌเฉฐเจฆ เจเจฐเจจ เจฆเฉ เจฏเฉเจ เจนเฉเจตเจพเจเจเฉเฅค
เจเฉเจเจฐ เจ เจธเฉเจ เจนเฉเจฃ เจฌเฉเจเจฒเฉเจกเจฐ เจจเฉเฉฐ เจฌเฉฐเจฆ เจเจฐ เจฆเจฟเฉฐเจฆเฉ เจนเจพเจ เจคเจพเจ เจเฉ เจนเฉเจตเฉเจเจพ? เจเจน เจเจตเฉเจเจ เจเจจเจฐเฉเจเจฐ (เจนเฉเฉฑเจ) เจฆเฉ เจเจฟเจธเจฎ 'เจคเฉ เจจเจฟเจฐเจญเจฐ เจเจฐเจฆเจพ เจนเฉเฅค เจฒเฉเจกเจฐ เจฆเฉ เจชเฉเจฐเจพ เจนเฉเจฃ เจคเฉเจ เจฌเจพเจ เจฆ เจธเจพเจฐเฉ เจจเฉเฉฑเจเจตเจฐเจ เจนเฉเฉฑเจ เจฎเฉเจเฉเจฆ เจนเฉเจฃเจเฉ, เจเจน เจ เจเฉเจคเฉ เจเจฒเฉเจฌเจฒ เจนเฉเฉฑเจ เจนเจจเฅค เจ เจคเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเจฐเฉเจธ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจเจธ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจคเฉเจ เจฌเจพเจ เจฆ เจเจพเจฐเฉ เจเฉเจคเจพ เจเจพเจตเฉเจเจพ เจเจฟเจธ เจจเฉ เจเจนเจจเจพเจ เจจเฉเฉฐ เจฌเจฃเจพเจเจ เจนเฉ (เจ เจคเฉ เจเจธ เจฒเจ เจเจนเจจเจพเจ เจจเฉเฉฐ เจฒเฉเจเจฒ เจเจฟเจนเจพ เจเจพเจเจฆเจพ เจนเฉ, "เจธเจฅเจพเจจเจ เจคเฉเจ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจคเฉฑเจ")เฅค เจคเจเจจเฉเจเฉ เจคเฉเจฐ 'เจคเฉ, เจธเจฅเจพเจจเจ เจนเฉเฉฑเจเจพเจ เจเฉเจฒ เจนเจฎเฉเจธเจผเจพ เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจตเจฟเฉฑเจ เจเฉฑเจ เจ เจจเฉเจธเจพเจฐเฉ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉ เจ เจคเฉ เจเจธเจฒเจ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจฌเฉฐเจฆ เจนเฉเจฃ 'เจคเฉ เจฌเฉฐเจฆ เจนเฉ เจเจพเจเจฆเฉ เจนเฉ, เจชเจฐ เจเจฒเฉเจฌเจฒ เจนเฉเฉฑเจ เจจเจนเฉเจ เจนเฉเฉฐเจฆเฉเฅค เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจ, เจฒเจพเจฒ เจเจฐเจพเจธ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ, เจฎเฉเจ เจเจน เจฆเจฟเจเจพเจเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเจพ เจนเจพเจ เจเจฟ เจเจฟเจตเฉเจ เจฒเฉเจกเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจธเจฎเจพเจชเจคเฉ เจธเจฅเจพเจจเจ เจ เจคเฉ เจเจฒเฉเจฌเจฒ เจนเฉเฉฑเจเจพเจ เจฆเฉ เจฎเจพเจฎเจฒเฉ เจตเจฟเฉฑเจ เจตเจธเจคเฉเจเจ เจฆเฉ เจเฉเจตเจจ เจเจพเจฒ เจจเฉเฉฐ เจชเฉเจฐเจญเจพเจตเจค เจเจฐเจฆเฉ เจนเฉเฅค
เจธเจฅเจพเจจเจ เจ เจคเฉ เจเจฒเฉเจฌเจฒ เจนเฉเฉฑเจ เจตเจฟเจเจเจพเจฐ เจ เฉฐเจคเจฐ เจเจฟเจเจ เจนเฉ? เจเฉเจ เจเจฟเจธเจฎเจพเจ เจฆเฉ เจจเฉเจเจตเจฐเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจเจฒเจพเจเจฃเจพ เจเจชเจญเฉเจเจคเจพ-เจธเจชเฉเจธ เจคเฉเจ เจฌเจฟเจจเจพเจ เจ เจฐเจฅ เจฐเฉฑเจเจฆเจพ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, DDoS เจธเฉเจฐเฉฑเจเจฟเจ เจฆเฉ เจเจฒเจชเจจเจพ เจเจฐเฉ - เจฌเฉเจเจฒเฉเจกเจฐ เจจเจฟเจฏเจฎ เจฒเจฟเจเจฆเจพ เจนเฉ เจ เจคเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจจเฉเฉฑเจเจตเจฐเจ เจเฉฐเจเจฐเจซเฉเจธ เจจเจพเจฒ เจเฉเฉเจฆเจพ เจนเฉ, เจเจฟเจธ เจคเฉเจ เจฌเจพเจ เจฆ เจฌเฉเจเจฒเฉเจกเจฐ เจเจพ เจธเจเจฆเจพ เจนเฉ เจ เจคเฉ เจเจชเจฃเฉ เจเจช เจจเฉเฉฐ เจฎเจพเจฐ เจธเจเจฆเจพ เจนเฉเฅค เจฆเฉเจเฉ เจชเจพเจธเฉ, เจเฉฑเจ เจกเฉเจฌเฉฑเจเจฟเฉฐเจ เจเจฐเฉเจธ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจเจฒเจชเจจเจพ เจเจฐเฉ เจเฉ เจคเฉเจธเฉเจ เจฆเจธ เจฎเจฟเฉฐเจเจพเจ เจตเจฟเฉฑเจ เจเจชเจฃเฉ เจเฉเจกเจฟเจเจ 'เจคเฉ เจฒเจฟเจเจฟเจ เจธเฉ - เจเจฆเฉเจ เจเจน เจชเฉเจฐเจพ เจนเฉ เจเจพเจเจฆเจพ เจนเฉ, เจคเฉเจธเฉเจ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉ เจเจฟ เจธเจฟเจธเจเจฎ เจตเจฟเฉฑเจ เจเฉเจ เจเฉเฉเจพ เจจเจพ เจฌเจเฉ, เจ เจคเฉ เจธเจฅเจพเจจเจ เจนเฉเฉฑเจ เจเจน เจฏเจเฉเจจเฉ เจฌเจฃเจพเจเจฃเจเฉเฅค
เจฆเฉเจเฉ เจชเจพเจธเฉ, เจเจฒเจชเจจเจพ เจเจฐเฉ เจเจฟ เจคเฉเจธเฉเจ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจเฉฑเจ เจเจฐเฉเจธเจชเฉเจเจเฉฐเจ เจจเจพเจฒ เจเฉเฉเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉ เจ
เจคเฉ เจเจ เจธเจพเจฒเจพเจ เจคเฉเจ เจ
เฉฐเจเฉเฉ เจเจเฉฑเจ เฉ เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉเฅค เจเจธ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ, เจคเฉเจธเฉเจ เจเจชเจญเฉเจเจคเจพ เจฆเฉ เจนเจฟเฉฑเจธเฉ เจจเฉเฉฐ เจชเฉเจฐเจพ เจเจฐเจจเจพ เจ
เจคเฉ เจธเจฎเฉเจ-เจธเจฎเฉเจ 'เจคเฉ เจ
เฉฐเจเฉเจฟเจเจ 'เจคเฉ เจตเจพเจชเจธ เจเจพเจฃเจพ เจเจพเจนเฉเจเฉเฅค bpf เจซเจพเจเจฒ เจธเจฟเจธเจเจฎ เจเจน เจฎเฉเจเจพ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเจพ เจนเฉเฅค เจเจน เจเฉฑเจ เจเจจ-เจฎเฉเจฎเฉเจฐเฉ-เจธเจฟเจฐเจซ เจธเฉเจกเฉ-เจซเจพเจเจฒ เจธเจฟเจธเจเจฎ เจนเฉ เจเฉ BPF เจตเจธเจคเฉเจเจ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเฉเจฃ เจตเจพเจฒเฉเจเจ เจซเจพเจเจฒเจพเจ เจฌเจฃเจพเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจธ เจคเจฐเฉเจนเจพเจ เจตเจงเจฆเจพ เจนเฉ refcount
เจตเจธเจคเฉเจเจ. เจเจธ เจคเฉเจ เจฌเจพเจ
เจฆ, เจฒเฉเจกเจฐ เจฌเจพเจนเจฐ เจ เจธเจเจฆเจพ เจนเฉ, เจ
เจคเฉ เจเจธ เจฆเฉเจเจฐเจพ เจฌเจฃเจพเจเจเจ เจเจเจเจ เจตเจธเจคเฉเจเจ เจเจผเจฟเฉฐเจฆเจพ เจฐเจนเจฟเจฃเจเฉเจเจเฅค
bpffs เจตเจฟเฉฑเจ เจซเจพเจเจฒเจพเจ เจฌเจฃเจพเจเจฃเจพ เจเฉ BPF เจตเจธเจคเฉเจเจ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเจฟเฉฐเจฆเฉ เจนเจจ เจจเฉเฉฐ "เจชเจฟเจจเจฟเฉฐเจ" เจเจฟเจนเจพ เจเจพเจเจฆเจพ เจนเฉ (เจเจฟเจตเฉเจ เจเจฟ เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจตเจพเจเจพเจเจธเจผ เจตเจฟเฉฑเจ: "เจชเฉเจฐเจเจฟเจฐเจฟเจ เจเฉฑเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจพเจ เจจเจเจธเจผเฉ เจจเฉเฉฐ เจชเจฟเฉฐเจจ เจเจฐ เจธเจเจฆเฉ เจนเฉ")เฅค BPF เจตเจธเจคเฉเจเจ เจฒเจ เจซเจพเจเจฒ เจเจฌเจเฉเจเจ เจฌเจฃเจพเจเจฃเจพ เจจเจพ เจธเจฟเจฐเจซเจผ เจธเจฅเจพเจจเจ เจตเจธเจคเฉเจเจ เจฆเฉ เจเฉเจตเจจ เจจเฉเฉฐ เจตเจงเจพเจเจฃ เจฒเจ, เจธเจเฉเจ เจเจฒเฉเจฌเจฒ เจตเจธเจคเฉเจเจ เจฆเฉ เจตเจฐเจคเฉเจเจฏเฉเจเจคเจพ เจฒเจ เจตเฉ เจ เจฐเจฅ เจฐเฉฑเจเจฆเจพ เจนเฉ - เจเจฒเฉเจฌเจฒ DDoS เจธเฉเจฐเฉฑเจเจฟเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจจเจพเจฒ เจเจฆเจพเจนเจฐเจจ 'เจคเฉ เจตเจพเจชเจธ เจเจพเจฃเจพ, เจ เจธเฉเจ เจ เฉฐเจเฉเจฟเจเจ เจจเฉเฉฐ เจตเฉเจเจฃ เจฆเฉ เจฏเฉเจ เจนเฉเจฃเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจพเจเฅค เจธเจฎเฉ เจฆเฉ เจธเจฎเฉ.
BPF เจซเจพเจเจฒ เจธเจฟเจธเจเจฎ เจจเฉเฉฐ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจฎเจพเจเจเจ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ /sys/fs/bpf
, เจชเจฐ เจเจธเจจเฉเฉฐ เจธเจฅเจพเจจเจ เจคเฉเจฐ 'เจคเฉ เจตเฉ เจฎเจพเจเจเจ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเจธ เจคเจฐเฉเจนเจพเจ:
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint
เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจซเจพเจเจฒ เจธเจฟเจธเจเจฎ เจจเจพเจ เจฌเจฃเจพเจ เจเจ เจนเจจ BPF_OBJ_PIN
BPF เจธเจฟเจธเจเจฎ เจเจพเจฒเฅค เจฆเจฐเจธเจพเจเจฃ เจฒเจ, เจเจ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฐเฉเจ, เจเจธเจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจเจฐเฉเจ, เจเจธเจจเฉเฉฐ เจ
เจชเจฒเฉเจก เจเจฐเฉเจ, เจ
เจคเฉ เจเจธเจจเฉเฉฐ เจชเจฟเฉฐเจจ เจเจฐเฉเจ bpffs
. เจธเจพเจกเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเฉเจ เจตเฉ เจฒเจพเจญเจฆเจพเจเจ เจจเจนเฉเจ เจเจฐเจฆเจพ เจนเฉ, เจ
เจธเฉเจ เจธเจฟเจฐเจซ เจเฉเจก เจชเฉเจธเจผ เจเจฐ เจฐเจนเฉ เจนเจพเจ เจคเจพเจ เจเฉ เจคเฉเจธเฉเจ เจเจฆเจพเจนเจฐเจฃ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจชเฉเจธเจผ เจเจฐ เจธเจเฉ:
$ cat test.c
__attribute__((section("xdp"), used))
int test(void *ctx)
{
return 0;
}
char _license[] __attribute__((section("license"), used)) = "GPL";
เจเจ เจเจธ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจเจฐเฉเจ เจ
เจคเฉ เจซเจพเจเจฒ เจธเจฟเจธเจเจฎ เจฆเฉ เจเฉฑเจ เจธเจฅเจพเจจเจ เจเจพเจชเฉ เจฌเจฃเจพเจเจ bpffs
:
$ clang -target bpf -c test.c -o test.o
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint
เจเจ เจนเฉเจฃ เจเจชเจฏเฉเจเจคเจพ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจกเจพเจเจจเจฒเฉเจก เจเจฐเฉเจ bpftool
เจ
เจคเฉ เจจเจพเจฒ เจตเจพเจฒเฉเจเจ เจธเจฟเจธเจเจฎ เจเจพเจฒเจพเจ เจจเฉเฉฐ เจฆเฉเจเฉ bpf(2)
(เจธเจเฉเจฐเฉเจธ เจเจเจเจชเฉเฉฑเจ เจคเฉเจ เจเฉเจ เจ
เจชเฉเจฐเจธเฉฐเจเจฟเจ เจฒเจพเจเจจเจพเจ เจนเจเจพ เจฆเจฟเฉฑเจคเฉเจเจ เจเจเจเจ เจนเจจ):
$ sudo strace -e bpf bpftool prog load ./test.o bpf-mountpoint/test
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, prog_name="test", ...}, 120) = 3
bpf(BPF_OBJ_PIN, {pathname="bpf-mountpoint/test", bpf_fd=3}, 120) = 0
เจเฉฑเจฅเฉ เจ
เจธเฉเจ เจตเจฐเจคเจฆเฉ เจนเฉเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฒเฉเจก เจเฉเจคเจพ เจนเฉ BPF_PROG_LOAD
, เจเจฐเจจเจฒ เจคเฉเจ เจเฉฑเจ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจชเฉเจฐเจพเจชเจค เจนเฉเจเจ เจนเฉ 3
เจ
เจคเฉ เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ BPF_OBJ_PIN
เจเจธ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจจเฉเฉฐ เจเฉฑเจ เจซเจพเจเจฒ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจชเจฟเฉฐเจจ เจเฉเจคเจพ "bpf-mountpoint/test"
. เจเจธ เจคเฉเจ เจฌเจพเจ
เจฆ เจฌเฉเจเจฒเฉเจกเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ bpftool
เจเฉฐเจฎ เจเจฐเจจเจพ เจชเฉเจฐเจพ เจนเฉ เจเจฟเจ, เจชเจฐ เจธเจพเจกเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฐเจฟเจนเจพ, เจนเจพเจฒเจพเจเจเจฟ เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจเจฟเจธเฉ เจตเฉ เจจเฉเฉฑเจเจตเจฐเจ เจเฉฐเจเจฐเจซเฉเจธ เจจเจพเจฒ เจเฉเฉเจฟเจ เจจเจนเฉเจ เจนเฉ:
$ sudo bpftool prog | tail -3
783: xdp name test tag 5c8ba0cf164cb46c gpl
loaded_at 2020-05-05T13:27:08+0000 uid 0
xlated 24B jited 41B memlock 4096B
เจ
เจธเฉเจ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจซเจพเจเจฒ เจเจฌเจเฉเจเจ เจจเฉเฉฐ เจฎเจฟเจเจพ เจธเจเจฆเฉ เจนเจพเจ unlink(2)
เจ
เจคเฉ เจเจธ เจคเฉเจ เจฌเจพเจ
เจฆ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฎเจฟเจเจพ เจฆเจฟเฉฑเจคเจพ เจเจพเจตเฉเจเจพ:
$ sudo rm ./bpf-mountpoint/test
$ sudo bpftool prog show id 783
Error: get by id (783): No such file or directory
เจตเจธเจคเฉเจเจ เจจเฉเฉฐ เจฎเจฟเจเจพเจเจฃเจพ
เจตเจธเจคเฉเจเจ เจจเฉเฉฐ เจฎเจฟเจเจพเจเจฃ เจฌเจพเจฐเฉ เจฌเฉเจฒเจฆเฉ เจนเฉเจ, เจเจน เจธเจชเฉฑเจธเจผเจ เจเจฐเจจเจพ เจเจผเจฐเฉเจฐเฉ เจนเฉ เจเจฟ เจเจฆเฉเจ เจ เจธเฉเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจนเฉเฉฑเจ (เจเจตเฉเจเจ เจเจจเจฐเฉเจเจฐ) เจคเฉเจ เจกเจฟเจธเจเจจเฉเจเจ เจเจฐ เจฆเจฟเฉฐเจฆเฉ เจนเจพเจ, เจคเจพเจ เจเฉเจ เจตเฉ เจจเจตเจพเจ เจเจตเฉเจเจ เจเจธเจฆเฉ เจธเจผเฉเจฐเฉเจเจค เจจเจนเฉเจ เจเจฐเฉเจเจพ, เจนเจพเจฒเจพเจเจเจฟ, เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉเจเจ เจธเจพเจฐเฉเจเจ เจฎเฉเจเฉเจฆเจพ เจธเจฅเจฟเจคเฉเจเจ เจจเฉเฉฐ เจเจฎ เจเฉเจฐเจฎ เจตเจฟเฉฑเจ เจชเฉเจฐเจพ เจเฉเจคเจพ เจเจพเจตเฉเจเจพเฅค .
BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฆเฉเจเจ เจเฉเจ เจเจฟเจธเจฎเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ เจซเจฒเจพเจ 'เจคเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเฉเจเจ เจนเจจ, เจฏเจพเจจเฉ. เจเฉเจฐเจฎ เจชเจฐเจฎเจพเจฃเฉ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเจพ เจนเฉ replace = detach old program, attach new program
. เจเจธ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ, เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจชเฉเจฐเจพเจฃเฉ เจธเฉฐเจธเจเจฐเจฃ เจฆเฉเจเจ เจธเจพเจฐเฉเจเจ เจธเจฐเจเจฐเจฎ เจเจฆเจพเจนเจฐเจฃเจพเจ เจเจชเจฃเจพ เจเฉฐเจฎ เจเจคเจฎ เจเจฐ เจฆเฉเจฃเจเฉเจเจ, เจ
เจคเฉ เจจเจตเฉเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจคเฉเจ เจจเจตเฉเจ เจเจตเฉเจเจ เจนเฉเจเจกเจฒเจฐ เจฌเจฃเจพเจ เจเจพเจฃเจเฉ, เจ
เจคเฉ เจเฉฑเจฅเฉ "เจเจเจฎเฉเจธเจฟเจเฉ" เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉ เจเจฟ เจเฉฑเจ เจตเฉ เจเจเจจเจพ เจเฉเฉฐเจเฉ เจจเจนเฉเจ เจเจพเจตเฉเจเฉเฅค
เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจเจตเฉเจเจ เจธเจฐเฉเจคเจพเจ เจจเจพเจฒ เจเฉเฉเจจเจพ
เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ, เจ
เจธเฉเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจเจตเฉเจเจ เจธเจฐเฉเจคเจพเจ เจจเจพเจฒ เจเฉเฉเจจ เจฆเจพ เจตเฉฑเจเจฐเฉ เจคเฉเจฐ 'เจคเฉ เจตเจฐเจฃเจจ เจจเจนเฉเจ เจเจฐเจพเจเจเฉ, เจเจฟเจเจเจเจฟ เจเจน เจเฉฑเจ เจเจพเจธ เจเจฟเจธเจฎ เจฆเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจ เจเจธเจฆเจพ เจ
เจงเจฟเจเจจ เจเจฐเจจเจพ เจธเจฎเจเจฆเจพเจฐ เจนเฉเฅค เจธเฉ.เจเจฎ.
เจฌเฉเจชเฉเจเจซ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจเจฌเจเฉเจเจ เจจเฉเฉฐ เจนเฉเจฐเจพเจซเฉเจฐเฉ เจเจฐเจจเจพ
เจฌเฉเจชเฉเจเจซ เจชเฉเจฐเฉเจเจฐเจพเจฎ
เจธเจพเจฐเฉเจเจ BPF เจตเจธเจคเฉเจเจ เจจเฉเฉฐ เจเฉฑเจ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจคเฉเจ เจฌเจฃเจพเจเจ เจ
เจคเฉ เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ bpf
, เจนเฉเจ เจฆเจฟเฉฑเจคเฉ เจชเฉเจฐเฉเจเฉเจเจพเจเจช เจจเจพเจฒ:
#include <linux/bpf.h>
int bpf(int cmd, union bpf_attr *attr, unsigned int size);
เจเฉฑเจฅเฉ เจเฉเจฎ เจนเฉ cmd
เจเจฟเจธเจฎ เจฆเฉ เจฎเฉเฉฑเจฒเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจนเฉ enum bpf_cmd
attr
- เจเฉฑเจ เจเจพเจธ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเจ เจชเฉเจฐเจพเจฎเฉเจเจฐเจพเจ เจฒเจ เจเฉฑเจ เจชเฉเจเจเฉฐเจเจฐ เจ
เจคเฉ size
- เจชเฉเจเจเฉฐเจเจฐ เจฆเฉ เจ
เจจเฉเจธเจพเจฐ เจตเจธเจคเฉ เจฆเจพ เจเจเจพเจฐ, เจเจฟเจตเฉเจ เจเจฟ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจเจน sizeof(*attr)
. เจเจฐเจจเจฒ 5.8 เจตเจฟเฉฑเจ เจธเจฟเจธเจเจฎ เจเจพเจฒ bpf
34 เจตเฉฑเจ-เจตเฉฑเจ เจเจฎเจพเจเจกเจพเจ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจฆเจพ เจนเฉ, เจ
เจคเฉ union bpf_attr
200 เจฒเจพเจเจจเจพเจ 'เจคเฉ เจเจฌเจเจผเจพ เจเจฐเจฆเจพ เจนเฉเฅค เจชเจฐ เจธเจพเจจเฉเฉฐ เจเจธ เจคเฉเจ เจกเจฐเจจเจพ เจจเจนเฉเจ เจเจพเจนเฉเจฆเจพ, เจเจฟเจเจเจเจฟ เจ
เจธเฉเจ เจเจ เจฒเฉเจเจพเจ เจฆเฉ เจฆเฉเจฐเจพเจจ เจเจชเจฃเฉ เจเจช เจจเฉเฉฐ เจนเฉเจเจฎเจพเจ เจ
เจคเฉ เจฎเจพเจชเจฆเฉฐเจกเจพเจ เจจเจพเจฒ เจเจพเจฃเฉ เจนเฉเจตเจพเจเจเฉเฅค
เจเจ เจเฉเจฎ เจจเจพเจฒ เจธเจผเฉเจฐเฉเจเจค เจเจฐเฉเจ BPF_PROG_LOAD
, เจเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฌเจฃเจพเจเจเจฆเจพ เจนเฉ - BPF เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจฆเจพ เจเฉฑเจ เจธเฉเฉฑเจ เจฒเฉเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจธเจจเฉเฉฐ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเจฐเจฆเจพ เจนเฉเฅค เจฒเฉเจก เจนเฉเจฃ เจฆเฉ เจธเจฎเฉเจ, เจตเฉเจฐเฉเจซเจพเจเจฐ เจฒเจพเจเจ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ, เจ
เจคเฉ เจซเจฟเจฐ เจเฉเจเจเจเฉ เจเฉฐเจชเจพเจเจฒเจฐ เจ
เจคเฉ, เจธเจซเจฒเจคเจพเจชเฉเจฐเจตเจ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจคเฉเจ เจฌเจพเจ
เจฆ, เจชเฉเจฐเฉเจเจฐเจพเจฎ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจเจชเจญเฉเจเจคเจพ เจจเฉเฉฐ เจตเจพเจชเจธ เจเจฐ เจฆเจฟเฉฑเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅค เจ
เจธเฉเจ เจชเจฟเจเจฒเฉ เจญเจพเจ เจตเจฟเฉฑเจ เจฆเฉเจเจฟเจ เจนเฉ เจเจฟ เจเจธ เจจเจพเจฒ เจ
เฉฑเจเฉ เจเฉ เจนเฉเฉฐเจฆเจพ เจนเฉ
เจ
เจธเฉเจ เจนเฉเจฃ เจเฉฑเจ เจเจธเจเจฎ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเจฟเจเจพเจเจเฉ เจเฉ เจเฉฑเจ เจธเจงเจพเจฐเจจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฒเฉเจก เจเจฐเฉเจเจพ, เจชเจฐ เจชเจนเจฟเจฒเจพเจ เจธเจพเจจเฉเฉฐ เจเจน เจซเฉเจธเจฒเจพ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ เจเจฟ เจ
เจธเฉเจ เจเจฟเจธ เจเจฟเจธเจฎ เจฆเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเฉเจก เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจพเจ - เจธเจพเจจเฉเฉฐ เจเฉเจฃเจจเจพ เจนเฉเจตเฉเจเจพเฅค BPF_PROG_TYPE_XDP
, เจเฉ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจเจฐเฉเจเจพ XDP_PASS
(เจธเจพเจฐเฉ เจชเฉเจเฉเจ เจเฉฑเจกเฉ)เฅค BPF เจ
เจธเฉเจเจฌเจฒเจฐ เจตเจฟเฉฑเจ เจเจน เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ:
r0 = 2
exit
เจฆเฉ เจฌเจพเจ เจฆ เจธเจพเจจเฉเฉฐ 'เจคเฉ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ เจนเฉ เจนเฉ, เจเฉ เจเจฟ เจ เจธเฉเจ เจ เจชเจฒเฉเจก เจเจฐเจพเจเจเฉ, เจ เจธเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจฆเฉฑเจธ เจธเจเจฆเฉ เจนเจพเจ เจเจฟ เจ เจธเฉเจ เจเจธเจจเฉเฉฐ เจเจฟเจตเฉเจ เจเจฐเจพเจเจเฉ:
#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/bpf.h>
static inline __u64 ptr_to_u64(const void *ptr)
{
return (__u64) (unsigned long) ptr;
}
int main(void)
{
struct bpf_insn insns[] = {
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_0,
.imm = XDP_PASS
},
{
.code = BPF_JMP | BPF_EXIT
},
};
union bpf_attr attr = {
.prog_type = BPF_PROG_TYPE_XDP,
.insns = ptr_to_u64(insns),
.insn_cnt = sizeof(insns)/sizeof(insns[0]),
.license = ptr_to_u64("GPL"),
};
strncpy(attr.prog_name, "woo", sizeof(attr.prog_name));
syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
for ( ;; )
pause();
}
เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจฆเจฟเจฒเจเจธเจช เจเจเจจเจพเจตเจพเจ เจเฉฑเจ เจเจฐเฉ เจฆเฉ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจนเฉเฉฐเจฆเฉเจเจ เจนเจจ insns
- เจฎเจธเจผเฉเจจ เจเฉเจก เจตเจฟเฉฑเจ เจธเจพเจกเจพ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเฅค เจเจธ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ, BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจนเจฐเฉเจ เจนเจฆเจพเจเจค เจจเฉเฉฐ เจขเจพเจเจเฉ เจตเจฟเฉฑเจ เจชเฉเจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ bpf_insn
insns
เจนเจฆเจพเจเจคเจพเจ เจฆเฉ เจชเจพเจฒเจฃเจพ เจเจฐเจฆเจพ เจนเฉ r0 = 2
, เจฆเฉเจเจพ - exit
.
เจชเจฟเฉฑเจเฉ เจนเจเจฃเจพเฅค เจเจฐเจจเจฒ เจฎเจธเจผเฉเจจ เจเฉเจก เจฒเจฟเจเจฃ เจ
เจคเฉ เจเจฐเจจเจฒ เจนเฉเจกเจฐ เจซเจพเจเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฒเจ เจตเจงเฉเจฐเฉ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจฎเฉเจเจฐเฉ เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจฆเจพ เจนเฉ tools/include/linux/filter.h
เจ
เจธเฉเจ เจฒเจฟเจ เจธเจเจฆเฉ เจนเจพเจ
struct bpf_insn insns[] = {
BPF_MOV64_IMM(BPF_REG_0, XDP_PASS),
BPF_EXIT_INSN()
};
เจชเจฐ เจเจฟเจเจเจเจฟ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจฎเฉเจฒ เจเฉเจก เจตเจฟเฉฑเจ เจฒเจฟเจเจฃเจพ เจธเจฟเจฐเจซเจผ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจเฉเจธเจเจพเจ เจ เจคเฉ BPF เจฌเจพเจฐเฉ เจฒเฉเจเจพเจ เจจเฉเฉฐ เจฒเจฟเจเจฃ เจฒเจ เจเจผเจฐเฉเจฐเฉ เจนเฉ, เจเจนเจจเจพเจ เจฎเฉเจเจฐเฉ เจฆเฉ เจ เจฃเจนเฉเจเจฆ เจ เจธเจฒ เจตเจฟเฉฑเจ เจกเจฟเจตเฉเจฒเจชเจฐ เจฆเฉ เจเฉเจตเจจ เจจเฉเฉฐ เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจจเจนเฉเจ เจเจฐเจฆเฉ เจนเฉเฅค
BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ, เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเจฐเจจ เจฒเจ เจ
เฉฑเจเฉ เจตเจงเจฆเฉ เจนเจพเจเฅค เจฎเจพเจชเจฆเฉฐเจกเจพเจ เจฆเจพ เจธเจพเจกเจพ เจจเจฟเจเจจเจคเจฎ เจธเจฎเฉเจน attr
เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจเจฟเจธเจฎ, เจธเฉเฉฑเจ เจ
เจคเฉ เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจฆเฉ เจเจฟเจฃเจคเฉ, เจฒเฉเฉเฉเจเจฆเจพ เจฒเจพเจเจธเฉฐเจธ เจ
เจคเฉ เจจเจพเจฎ เจธเจผเจพเจฎเจฒ เจเจฐเจฆเจพ เจนเฉ "woo"
, เจเจฟเจธ เจจเฉเฉฐ เจ
เจธเฉเจ เจกเจพเจเจจเจฒเฉเจก เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ เจธเจฟเจธเจเจฎ 'เจคเฉ เจเจชเจฃเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฒเฉฑเจญเจฃ เจฒเจ เจตเจฐเจคเจฆเฉ เจนเจพเจเฅค เจชเฉเจฐเฉเจเจฐเจพเจฎ, เจเจฟเจตเฉเจ เจเจฟ เจตเจพเจ
เจฆเจพ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจธเจฟเจธเจเจฎ เจตเจฟเฉฑเจ เจฒเฉเจก เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ bpf
.
เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจ
เฉฐเจค เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจเฉฑเจ เจ
เจจเฉฐเจค เจฒเฉเจช เจตเจฟเฉฑเจ เจเจคเจฎ เจนเฉเฉฐเจฆเฉ เจนเจพเจ เจเฉ เจชเฉเจฒเฉเจก เจฆเฉ เจจเจเจฒ เจเจฐเจฆเจพ เจนเฉเฅค เจเจธ เจคเฉเจ เจฌเจฟเจจเจพเจ, เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจฐเจจเจฒ เจฆเฉเจเจฐเจพ เจฎเจพเจฐ เจฆเจฟเฉฑเจคเจพ เจเจพเจตเฉเจเจพ เจเจฆเฉเจ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจเฉ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจธเจพเจจเฉเฉฐ เจตเจพเจชเจธ เจเจฐเจฆเจพ เจนเฉ เจฌเฉฐเจฆ เจนเฉ เจเจพเจเจฆเจพ เจนเฉ bpf
, เจ
เจคเฉ เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจธเจฟเจธเจเจฎ เจตเจฟเฉฑเจ เจจเจนเฉเจ เจฆเฉเจเจพเจเจเฉเฅค
เจเฉเจฐ, เจ
เจธเฉเจ เจเจพเจเจ เจฒเจ เจคเจฟเจเจฐ เจนเจพเจเฅค เจเจ เจเจเฉฑเจ เฉ เจนเฉ เจเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจฒเจพเจเจเจฆเฉ เจนเจพเจ strace
เจเจน เจฆเฉเจเจฃ เจฒเจ เจเจฟ เจธเจญ เจเฉเจ เจเฉฐเจฎ เจเจฐ เจฐเจฟเจนเจพ เจนเฉ เจเจฟเจตเฉเจ เจเจฟ เจเจน เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ:
$ clang -g -O2 simple-prog.c -o simple-prog
$ sudo strace ./simple-prog
execve("./simple-prog", ["./simple-prog"], 0x7ffc7b553480 /* 13 vars */) = 0
...
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0x7ffe03c4ed50, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_V
ERSION(0, 0, 0), prog_flags=0, prog_name="woo", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS}, 72) = 3
pause(
เจธเจญ เจเฉเจ เจ เฉเจ เจนเฉ, bpf(2)
เจนเฉเจเจกเจฒ 3 เจธเจพเจกเฉ เจเฉเจฒ เจตเจพเจชเจธ เจเจเจ เจ
เจคเฉ เจ
เจธเฉเจ เจเจธเจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจ
เจจเฉฐเจค เจฒเฉเจช เจตเจฟเฉฑเจ เจเจฒเฉ เจเจ pause()
. เจเจ เจธเจฟเจธเจเจฎ เจตเจฟเฉฑเจ เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฒเฉฑเจญเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจ. เจ
เจเจฟเจนเจพ เจเจฐเจจ เจฒเจ เจ
เจธเฉเจ เจเจฟเจธเฉ เจนเฉเจฐ เจเจฐเจฎเฉเจจเจฒ 'เจคเฉ เจเจพเจตเจพเจเจเฉ เจ
เจคเฉ เจเจชเจฏเฉเจเจคเจพ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจพเจเจเฉ bpftool
:
# bpftool prog | grep -A3 woo
390: xdp name woo tag 3b185187f1855c4c gpl
loaded_at 2020-08-31T24:66:44+0000 uid 0
xlated 16B jited 40B memlock 4096B
pids simple-prog(10381)
เจ
เจธเฉเจ เจฆเฉเจเจฆเฉ เจนเจพเจ เจเจฟ เจธเจฟเจธเจเจฎ เจเฉฑเจคเฉ เจเฉฑเจ เจฒเฉเจก เจเฉเจคเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจนเฉ woo
เจเจฟเจธเจฆเฉ เจเจฒเฉเจฌเจฒ เจเจเจกเฉ 390 เจนเฉ เจ
เจคเฉ เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจ เจเจพเจฐเฉ เจนเฉ simple-prog
เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเฉฑเจฒ เจเจธเจผเจพเจฐเจพ เจเจฐเจจ เจตเจพเจฒเจพ เจเฉฑเจ เจเจชเจจ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจนเฉ (เจ
เจคเฉ เจเฉ simple-prog
เจเฉฐเจฎ เจจเฉเฉฐ เจชเฉเจฐเจพ เจเจฐเฉเจเจพ, เจซเจฟเจฐ woo
เจ
เจฒเฉเจช เจนเฉ เจเจพเจตเฉเจเจพ). เจเจฟเจตเฉเจ เจเจฟ เจเจฎเฉเจฆ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ, เจชเฉเจฐเฉเจเจฐเจพเจฎ woo
BPF เจเจฐเจเฉเจเฉเจเจเจฐ เจตเจฟเฉฑเจ เจฌเจพเจเจจเจฐเฉ เจเฉเจกเจพเจ เจฆเฉ - เจฆเฉ เจจเจฟเจฐเจฆเฉเจธเจผ - 16 เจฌเจพเจเจ เจฒเฉเจเจฆเจพ เจนเฉ, เจชเจฐ เจเจธเจฆเฉ เจฎเฉเจฒ เจฐเฉเจช (x86_64) เจตเจฟเฉฑเจ เจเจน เจชเจนเจฟเจฒเจพเจ เจนเฉ 40 เจฌเจพเจเจ เจนเฉเฅค เจเจ เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจธเจฆเฉ เจ
เจธเจฒเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจตเฉเจเฉเจ:
# bpftool prog dump xlated id 390
0: (b7) r0 = 2
1: (95) exit
เจเฉเจ เจนเฉเจฐเจพเจจเฉ เจจเจนเฉเจเฅค เจเจ เจนเฉเจฃ JIT เจเฉฐเจชเจพเจเจฒเจฐ เจฆเฉเจเจฐเจพ เจคเจฟเจเจฐ เจเฉเจคเฉ เจเฉเจก เจจเฉเฉฐ เจตเฉเจเฉเจ:
# bpftool prog dump jited id 390
bpf_prog_3b185187f1855c4c_woo:
0: nopl 0x0(%rax,%rax,1)
5: push %rbp
6: mov %rsp,%rbp
9: sub $0x0,%rsp
10: push %rbx
11: push %r13
13: push %r14
15: push %r15
17: pushq $0x0
19: mov $0x2,%eax
1e: pop %rbx
1f: pop %r15
21: pop %r14
23: pop %r13
25: pop %rbx
26: leaveq
27: retq
เจฒเจ เจฌเจนเฉเจค เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ เจจเจนเฉเจ เจนเฉ exit(2)
, เจชเจฐ เจจเจฟเจฐเจชเฉฑเจเจคเจพ เจตเจฟเฉฑเจ, เจธเจพเจกเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจนเฉ, เจ
เจคเฉ เจเฉเจฐ-เจฎเจพเจฎเฉเจฒเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฒเจ เจเฉเจเจเจเฉ เจเฉฐเจชเจพเจเจฒเจฐ เจฆเฉเจเจฐเจพ เจเฉเฉเจฟเจ เจเจฟเจ เจชเฉเจฐเฉเจฒเฉเจ เจ
เจคเฉ เจเจชเฉเจฒเฉเจ, เจฌเฉเจธเจผเจ, เจฒเฉเฉเฉเจเจฆเจพ เจนเฉเฅค
เจจเจเจธเจผเฉ
BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจขเจพเจเจเจพเจเจค เจฎเฉเจฎเฉเจฐเฉ เจเฉเจคเจฐเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเจจ เจเฉ เจฆเฉเจเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจ
เจคเฉ เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจตเจฟเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฒเจ เจชเจนเฉเฉฐเจเจฏเฉเจ เจนเจจเฅค เจเจนเจจเจพเจ เจตเจธเจคเฉเจเจ เจจเฉเฉฐ เจจเจเจธเจผเฉ เจเจฟเจนเจพ เจเจพเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจธ เจญเจพเจ เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจฆเจฟเจเจพเจตเจพเจเจเฉ เจเจฟ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจนเจจเจพเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจฌเจฆเจฒเจฃเจพ เจนเฉ bpf
.
เจเจฒเฉ เจนเฉเจฃเฉ เจฆเฉฑเจธ เจฆเฉเจเจ เจเจฟ เจจเจเจธเจผเจฟเจเจ เจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ เจธเจฟเจฐเจซ เจธเจผเฉเจ
เจฐเจก เจฎเฉเจฎเฉเจฐเฉ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจคเฉฑเจ เจธเฉเจฎเจฟเจค เจจเจนเฉเจ เจนเฉ. เจเฉฑเจฅเฉ เจตเจฟเจธเจผเฉเจธเจผ-เจเจฆเฉเจธเจผ เจตเจพเจฒเฉ เจจเจเจธเจผเฉ เจนเฉเฉฐเจฆเฉ เจนเจจ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฒเจ เจชเฉเจเจเฉฐเจเจฐ เจเจพเจ เจจเฉเฉฑเจเจตเจฐเจ เจเฉฐเจเจฐเจซเฉเจธ เจฒเจ เจชเฉเจเจเฉฐเจเจฐ, เจชเจฐเจซ เจเจตเฉเจเจเจธ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจจเจเจธเจผเฉ เจเจฆเจฟเฅค เจ
เจธเฉเจ เจเฉฑเจฅเฉ เจเจนเจจเจพเจ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจจเจนเฉเจ เจเจฐเจพเจเจเฉ, เจคเจพเจ เจเฉ เจชเจพเจ เจ เจจเฉเฉฐ เจเจฒเจเจฃ เจตเจฟเฉฑเจ เจจเจพ เจชเจตเฉ. เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ, เจ
เจธเฉเจ เจธเจฟเฉฐเจเฉเจฐเฉเจจเจพเจเจเจผเฉเจธเจผเจจ เจฎเฉเฉฑเจฆเจฟเจเจ เจจเฉเฉฐ เจจเจเจผเจฐเจ
เฉฐเจฆเจพเจเจผ เจเจฐเจฆเฉ เจนเจพเจ, เจเจฟเจเจเจเจฟ เจเจน เจธเจพเจกเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจฒเจ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจจเจนเฉเจ เจนเฉเฅค เจเจชเจฒเจฌเจง เจจเจเจธเจผเฉ เจฆเฉเจเจ เจเจฟเจธเจฎเจพเจ เจฆเฉ เจเฉฑเจ เจชเฉเจฐเฉ เจธเฉเจเฉ เจตเจฟเฉฑเจ เจฒเฉฑเจญเฉ เจเจพ เจธเจเจฆเฉ เจนเฉ <linux/bpf.h>
BPF_MAP_TYPE_HASH
.
เจเฉ เจคเฉเจธเฉเจ เจเฉฑเจ เจนเฉเจธเจผ เจเฉเจฌเจฒ เจฌเจฃเจพเจเจเจฆเฉ เจนเฉ, เจเจนเฉ, C++, เจคเฉเจธเฉเจ เจเจนเฉเจเฉ unordered_map<int,long> woo
, เจเจฟเจธเจฆเจพ เจฐเฉเจธเฉ เจตเจฟเฉฑเจ เจ
เจฐเจฅ เจนเฉ โเจฎเฉเจจเฉเฉฐ เจเฉฑเจ เจฎเฉเจเจผ เจฆเฉ เจฒเฉเฉ เจนเฉ woo
เจ
เจธเฉเจฎเจค เจเจเจพเจฐ, เจเจฟเจธ เจฆเฉเจเจ เจเฉเฉฐเจเฉเจเจ เจเจฟเจธเจฎ เจฆเฉเจเจ เจนเจจ int
, เจ
เจคเฉ เจฎเฉเฉฑเจฒ เจเจฟเจธเจฎ เจนเจจ long
" เจเฉฑเจ BPF เจนเฉเจธเจผ เจเฉเจฌเจฒ เจฌเจฃเจพเจเจฃ เจฒเจ, เจธเจพเจจเฉเฉฐ เจฌเจนเฉเจค เจเฉเจ เจเจนเฉ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ, เจธเจฟเจตเจพเจ เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ เจเจฟ เจธเจพเจจเฉเฉฐ เจเฉเจฌเจฒ เจฆเจพ เจตเฉฑเจง เจคเฉเจ เจตเฉฑเจง เจเจเจพเจฐ เจจเจฟเจฐเจงเจพเจฐเจค เจเจฐเจจเจพ เจชเจเจเจพ, เจ
เจคเฉ เจเฉเฉฐเจเฉเจเจ เจ
เจคเฉ เจฎเฉเฉฑเจฒเจพเจ เจฆเฉเจเจ เจเจฟเจธเจฎเจพเจ เจจเฉเฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจเจฐเจจ เจฆเฉ เจฌเจเจพเจ, เจธเจพเจจเฉเฉฐ เจเจนเจจเจพเจ เจฆเฉ เจเจเจพเจฐ เจจเฉเฉฐ เจฌเจพเจเจ เจตเจฟเฉฑเจ เจจเจฟเจฐเจงเจพเจฐเจค เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค . เจจเจเจธเจผเฉ เจฌเจฃเจพเจเจฃ เจฒเจ เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเฉ BPF_MAP_CREATE
เจธเจฟเจธเจเจฎ เจเจพเจฒ bpf
. เจเจ เจเฉฑเจ เจเฉฑเจ เจเจพเจ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจตเฉเจเฉเจ เจเฉ เจเฉฑเจ เจจเจเจธเจผเจพ เจฌเจฃเจพเจเจเจฆเจพ เจนเฉเฅค เจฌเฉเจชเฉเจเจซ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจฒเฉเจก เจเจฐเจจ เจตเจพเจฒเฉ เจชเจฟเจเจฒเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจคเฉเจ เจฌเจพเจ
เจฆ, เจเจน เจคเฉเจนเจพเจกเฉ เจฒเจ เจธเจงเจพเจฐเจจ เจเจพเจชเจฆเจพ เจนเฉ:
$ cat simple-map.c
#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/bpf.h>
int main(void)
{
union bpf_attr attr = {
.map_type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(int),
.value_size = sizeof(int),
.max_entries = 4,
};
strncpy(attr.map_name, "woo", sizeof(attr.map_name));
syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
for ( ;; )
pause();
}
เจเฉฑเจฅเฉ เจ
เจธเฉเจ เจชเฉเจฐเจพเจฎเฉเจเจฐเจพเจ เจฆเจพ เจเฉฑเจ เจธเฉเฉฑเจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจฆเฉ เจนเจพเจ attr
, เจเจฟเจธ เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจเจนเจฟเฉฐเจฆเฉ เจนเจพเจ "เจฎเฉเจจเฉเฉฐ เจเฉเฉฐเจเฉเจเจ เจ
เจคเฉ เจเจเจพเจฐ เจฆเฉ เจฎเฉเฉฑเจฒเจพเจ เจตเจพเจฒเฉ เจเฉฑเจ เจนเฉเจธเจผ เจเฉเจฌเจฒ เจฆเฉ เจฒเฉเฉ เจนเฉ sizeof(int)
, เจเจฟเจธ เจตเจฟเฉฑเจ เจฎเฉเจ เจตเฉฑเจง เจคเฉเจ เจตเฉฑเจง เจเจพเจฐ เจคเฉฑเจค เจฐเฉฑเจ เจธเจเจฆเจพ เจนเจพเจเฅค" BPF เจจเจเจธเจผเฉ เจฌเจฃเจพเจเจเจฆเฉ เจธเจฎเฉเจ, เจคเฉเจธเฉเจ เจนเฉเจฐ เจฎเจพเจชเจฆเฉฐเจก เจจเจฟเจฐเจงเจพเจฐเจค เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเจธเฉ เจคเจฐเฉเจนเจพเจ เจเจฟเจตเฉเจ เจเจฟ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจจเจพเจฒ เจเจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจ, เจ
เจธเฉเจ เจเจฌเจเฉเจเจ เจฆเจพ เจจเจพเจฎ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเจฟเฉฑเจคเจพ เจนเฉ "woo"
.
เจเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจ เจคเฉ เจฐเจจ เจเจฐเฉเจ:
$ clang -g -O2 simple-map.c -o simple-map
$ sudo strace ./simple-map
execve("./simple-map", ["./simple-map"], 0x7ffd40a27070 /* 14 vars */) = 0
...
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH, key_size=4, value_size=4, max_entries=4, map_name="woo", ...}, 72) = 3
pause(
เจเฉฑเจฅเฉ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจนเฉ bpf(2)
เจธเจพเจจเฉเฉฐ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจฎเฉเจช เจจเฉฐเจฌเจฐ เจตเจพเจชเจธ เจเฉเจคเจพ 3
เจ
เจคเฉ เจซเจฟเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ, เจเจฟเจตเฉเจ เจเจฟ เจเจฎเฉเจฆ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ, เจธเจฟเจธเจเจฎ เจเจพเจฒ เจตเจฟเฉฑเจ เจนเฉเจฐ เจนเจฆเจพเจเจคเจพเจ เจฆเฉ เจเจกเฉเจ เจเจฐเจฆเจพ เจนเฉ pause(2)
.
เจนเฉเจฃ เจเจ เจเจชเจฃเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฌเฉเจเจเฉเจฐเจพเจเจเจก เจตเจฟเฉฑเจ เจญเฉเจเฉเจ เจเจพเจ เจเฉเจ เจนเฉเจฐ เจเจฐเจฎเฉเจจเจฒ เจเฉเจฒเฉเจนเฉเจ เจ
เจคเฉ เจเจชเจฏเฉเจเจคเจพ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจชเจฃเฉ เจเจฌเจเฉเจเจ เจจเฉเฉฐ เจตเฉเจเฉเจ bpftool
(เจ
เจธเฉเจ เจเจชเจฃเฉ เจจเจเจธเจผเฉ เจจเฉเฉฐ เจเจธเจฆเฉ เจจเจพเจฎ เจฆเฉเจเจฐเจพ เจฆเฉเจเจฟเจเจ เจคเฉเจ เจตเฉฑเจ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ):
$ sudo bpftool map
...
114: hash name woo flags 0x0
key 4B value 4B max_entries 4 memlock 4096B
...
เจจเฉฐเจฌเจฐ 114 เจธเจพเจกเฉ เจตเจธเจคเฉ เจฆเฉ เจเจฒเฉเจฌเจฒ เจเจเจกเฉ เจนเฉเฅค เจธเจฟเจธเจเจฎ เจคเฉ เจเฉเจ เจตเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจฎเฉเจเฉเจฆเจพ เจจเจเจธเจผเฉ เจจเฉเฉฐ เจเฉเจฒเฉเจนเจฃ เจฒเจ เจเจธ ID เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจธเจเจฆเจพ เจนเฉ BPF_MAP_GET_FD_BY_ID
เจธเจฟเจธเจเจฎ เจเจพเจฒ bpf
.
เจนเฉเจฃ เจ เจธเฉเจ เจเจชเจฃเฉ เจนเฉเจธเจผ เจเฉเจฌเจฒ เจจเจพเจฒ เจเฉเจก เจธเจเจฆเฉ เจนเจพเจเฅค เจเจ เจเจธเจฆเฉ เจธเจฎเฉฑเจเจฐเฉ เจจเฉเฉฐ เจตเฉเจเฉเจ:
$ sudo bpftool map dump id 114
Found 0 elements
เจเจพเจฒเฉเฅค เจเจ เจเจธ เจตเจฟเฉฑเจ เจเฉฑเจ เจฎเฉเฉฑเจฒ เจชเจพเจเจ hash[1] = 1
:
$ sudo bpftool map update id 114 key 1 0 0 0 value 1 0 0 0
เจเจ เจฆเฉเจฌเจพเจฐเจพ เจธเจพเจฐเจฃเฉ เจจเฉเฉฐ เจตเฉเจเฉเจ:
$ sudo bpftool map dump id 114
key: 01 00 00 00 value: 01 00 00 00
Found 1 element
เจนเฉเจฐเฉ! เจ
เจธเฉเจ เจเฉฑเจ เจคเฉฑเจค เจเฉเฉเจจ เจตเจฟเฉฑเจ เจเจพเจฎเจฏเจพเจฌ เจฐเจนเฉเฅค เจจเฉเจ เจเจฐเฉ เจเจฟ เจธเจพเจจเฉเฉฐ เจ
เจเจฟเจนเจพ เจเจฐเจจ เจฒเจ เจฌเจพเจเจ เจชเฉฑเจงเจฐ 'เจคเฉ เจเฉฐเจฎ เจเจฐเจจเจพ เจชเจตเฉเจเจพ, เจเจฟเจเจเจเจฟ bptftool
เจชเจคเจพ เจจเจนเฉเจ เจนเฉเจธเจผ เจเฉเจฌเจฒ เจตเจฟเฉฑเจ เจเจฟเจธ เจเจฟเจธเจฎ เจฆเฉ เจฎเฉเฉฑเจฒ เจนเจจเฅค (เจเจน เจเจฟเจเจจ BTF เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจธ เจจเฉเฉฐ เจเฉเจฐเจพเจเจธเจซเจฐ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ, เจชเจฐ เจนเฉเจฃ เจเจธ เจฌเจพเจฐเฉ เจนเฉเจฐเฅค)
bpftool เจคเฉฑเจค เจจเฉเฉฐ เจเจฟเจตเฉเจ เจชเฉเฉเจนเจฆเจพ เจ เจคเฉ เจเฉเฉเจฆเจพ เจนเฉ? เจเจ เจนเฉเฉฑเจก เจฆเฉ เจนเฉเจ เจพเจ เจเฉฑเจ เจจเจเจผเจฐ เจฎเจพเจฐเฉเจ:
$ sudo strace -e bpf bpftool map dump id 114
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0x55856ab65280}, 120) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0x55856ab65280, value=0x55856ab652a0}, 120) = 0
key: 01 00 00 00 value: 01 00 00 00
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0x55856ab65280, next_key=0x55856ab65280}, 120) = -1 ENOENT
เจชเจนเจฟเจฒเจพเจ เจ
เจธเฉเจ เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจจเจเจธเจผเฉ เจจเฉเฉฐ เจเจธเจฆเฉ เจเจฒเฉเจฌเจฒ ID เจฆเฉเจเจฐเจพ เจเฉเจฒเฉเจนเจฟเจ BPF_MAP_GET_FD_BY_ID
ะธ bpf(2)
เจธเจพเจจเฉเฉฐ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ 3 เจตเจพเจชเจธ เจเฉเจคเจพเฅค เจ
เฉฑเจเฉ เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ BPF_MAP_GET_NEXT_KEY
เจธเจพเจจเฉเฉฐ เจชเจพเจธ เจเจฐเจเฉ เจธเจพเจฐเจฃเฉ เจตเจฟเฉฑเจ เจชเจนเจฟเจฒเฉ เจเฉเฉฐเจเฉ เจฎเจฟเจฒเฉ NULL
"เจชเจฟเจเจฒเฉ" เจเฉเฉฐเจเฉ เจฒเจ เจชเฉเจเจเฉฐเจเจฐ เจตเจเฉเจเฅค เจเฉเจเจฐ เจธเจพเจกเฉ เจเฉเจฒ เจเฉเฉฐเจเฉ เจนเฉ เจคเจพเจ เจ
เจธเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ BPF_MAP_LOOKUP_ELEM
เจเฉ เจเฉฑเจ เจชเฉเจเจเฉฐเจเจฐ เจจเฉเฉฐ เจเฉฑเจ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจเจฐเจฆเจพ เจนเฉ value
. เจ
เจเจฒเจพ เจเจฆเจฎ เจเจน เจนเฉ เจเจฟ เจ
เจธเฉเจ เจฎเฉเจเฉเจฆเจพ เจเฉเฉฐเจเฉ เจจเฉเฉฐ เจเฉฑเจ เจชเฉเจเจเฉฐเจเจฐ เจชเจพเจธ เจเจฐเจเฉ เจ
เจเจฒเจพ เจเจฒเฉเจฎเฉเจเจ เจฒเฉฑเจญเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเฉ เจนเจพเจ, เจชเจฐ เจธเจพเจกเฉ เจธเจพเจฐเจฃเฉ เจตเจฟเฉฑเจ เจธเจฟเจฐเจซเจผ เจเฉฑเจ เจเจฒเฉเจฎเฉเจเจ เจ
เจคเฉ เจเจฎเจพเจเจก เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค BPF_MAP_GET_NEXT_KEY
เจตเจพเจชเจธเฉ ENOENT
.
เจ เฉเจ เจนเฉ, เจเจ เจเฉเฉฐเจเฉ 1 เจฆเฉเจเจฐเจพ เจฎเฉเฉฑเจฒ เจจเฉเฉฐ เจฌเจฆเจฒเฉเจ, เจฎเฉฐเจจ เจฒเจ เจเจฟ เจธเจพเจกเฉ เจตเจชเจพเจฐเจ เจคเจฐเจ เจจเฉเฉฐ เจฐเจเจฟเจธเจเจฐ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ hash[1] = 2
:
$ sudo strace -e bpf bpftool map update id 114 key 1 0 0 0 value 2 0 0 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=3, key=0x55dcd72be260, value=0x55dcd72be280, flags=BPF_ANY}, 120) = 0
เจเจฟเจตเฉเจ เจเจฟ เจเจฎเฉเจฆ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ, เจเจน เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจนเฉ: เจเจฎเจพเจเจก BPF_MAP_GET_FD_BY_ID
ID, เจ
เจคเฉ เจเจฎเจพเจเจก เจฆเฉเจเจฐเจพ เจธเจพเจกเจพ เจจเจเจธเจผเจพ เจเฉเจฒเฉเจนเจฆเจพ เจนเฉ BPF_MAP_UPDATE_ELEM
เจคเฉฑเจค เจจเฉเฉฐ เจเจตเจฐเจฐเจพเจเจ เจเจฐเจฆเจพ เจนเฉเฅค
เจเจธ เจฒเจ, เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจคเฉเจ เจนเฉเจธเจผ เจเฉเจฌเจฒ เจฌเจฃเจพเจเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ, เจ
เจธเฉเจ เจฆเฉเจเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจคเฉเจ เจเจธเจฆเฉ เจธเจฎเฉฑเจเจฐเฉ เจชเฉเฉเจน เจ
เจคเฉ เจฒเจฟเจ เจธเจเจฆเฉ เจนเจพเจเฅค เจจเฉเจ เจเจฐเฉ เจเจฟ เจเฉเจเจฐ เจ
เจธเฉเจ เจเจฎเจพเจเจก เจฒเจพเจเจจ เจคเฉเจ เจ
เจเจฟเจนเจพ เจเจฐเจจ เจฆเฉ เจฏเฉเจ เจธเฉ, เจคเจพเจ เจธเจฟเจธเจเจฎ เจคเฉ เจเฉเจ เจนเฉเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจธเจจเฉเฉฐ เจเจฐ เจธเจเจฆเจพ เจนเฉเฅค เจเฉฑเจชเจฐ เจฆเฉฑเจธเฉ เจเจ เจเจฎเจพเจเจกเจพเจ เจคเฉเจ เจเจฒเจพเจตเจพ, เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจคเฉเจ เจจเจเจธเจผเจฟเจเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ,
BPF_MAP_LOOKUP_ELEM
: เจเฉเฉฐเจเฉ เจฆเฉเจเจฐเจพ เจฎเฉเฉฑเจฒ เจฒเฉฑเจญเฉBPF_MAP_UPDATE_ELEM
: เจฎเฉเฉฑเจฒ เจ เฉฑเจชเจกเฉเจ/เจฌเจฃเจพเจBPF_MAP_DELETE_ELEM
: เจเจพเจฌเฉ เจจเฉเฉฐ เจนเจเจพเจBPF_MAP_GET_NEXT_KEY
: เจ เจเจฒเฉ (เจเจพเจ เจชเจนเจฟเจฒเฉ) เจเฉเฉฐเจเฉ เจฒเฉฑเจญเฉBPF_MAP_GET_NEXT_ID
: เจคเฉเจนเจพเจจเฉเฉฐ เจธเจพเจฐเฉ เจฎเฉเจเฉเจฆเจพ เจจเจเจธเจผเจฟเจเจ เจตเจฟเฉฑเจเฉเจ เจฒเฉฐเจเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉ, เจเจธ เจคเจฐเฉเจนเจพเจ เจเจน เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉbpftool map
BPF_MAP_GET_FD_BY_ID
: เจเจธเจฆเฉ เจเจฒเฉเจฌเจฒ เจเจเจกเฉ เจฆเฉเจเจฐเจพ เจเฉฑเจ เจฎเฉเจเฉเจฆเจพ เจจเจเจธเจผเจพ เจเฉเจฒเฉเจนเฉBPF_MAP_LOOKUP_AND_DELETE_ELEM
: เจเจฟเจธเฉ เจตเจธเจคเฉ เจฆเฉ เจฎเฉเฉฑเจฒ เจจเฉเฉฐ เจชเฉเจฐเจฎเจพเจฃเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจ เฉฑเจชเจกเฉเจ เจเจฐเฉ เจ เจคเฉ เจชเฉเจฐเจพเจฃเฉ เจจเฉเฉฐ เจตเจพเจชเจธ เจเจฐเฉBPF_MAP_FREEZE
: เจฏเฉเจเจผเจฐเจธเจชเฉเจธ เจคเฉเจ เจจเจเจธเจผเฉ เจจเฉเฉฐ เจ เจเฉฑเจฒ เจฌเจฃเจพเจ (เจเจธ เจเจพเจฐเจตเจพเจ เจจเฉเฉฐ เจ เจจเจกเฉเจจ เจจเจนเฉเจ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ)BPF_MAP_LOOKUP_BATCH
,BPF_MAP_LOOKUP_AND_DELETE_BATCH
,BPF_MAP_UPDATE_BATCH
,BPF_MAP_DELETE_BATCH
: เจชเฉเฉฐเจ เจเจชเจฐเฉเจธเจผเจจเฅค เจเจฆเจพเจนเจฐเจฃ เจฒเจ,BPF_MAP_LOOKUP_AND_DELETE_BATCH
- เจจเจเจธเจผเฉ เจคเฉเจ เจธเจพเจฐเฉ เจฎเฉเฉฑเจฒเจพเจ เจจเฉเฉฐ เจชเฉเฉเจนเจจ เจ เจคเฉ เจฐเฉเจธเฉเจ เจเจฐเจจ เจฆเจพ เจเจน เจเฉฑเจเฉ เจเฉฑเจ เจญเจฐเฉเจธเฉเจฏเฉเจ เจคเจฐเฉเจเจพ เจนเฉ
เจเจน เจธเจพเจฐเฉเจเจ เจเจฎเจพเจเจกเจพเจ เจธเจพเจฐเฉเจเจ เจจเจเจธเจผเฉ เจเจฟเจธเจฎเจพเจ เจฒเจ เจเฉฐเจฎ เจจเจนเฉเจ เจเจฐเจฆเฉเจเจ, เจชเจฐ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจคเฉเจ เจนเฉเจฐ เจเจฟเจธเจฎ เจฆเฉ เจจเจเจธเจผเจฟเจเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจเจพ เจนเฉเจธเจผ เจเฉเจฌเจฒเจพเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจตเจพเจเจ เจนเฉ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค
เจเจฐเจกเจฐ เจฆเฉ เจเจผเจพเจคเจฐ, เจเจ เจธเจพเจกเฉ เจนเฉเจธเจผ เจเฉเจฌเจฒ เจชเฉเจฐเจฏเฉเจเจพเจ เจจเฉเฉฐ เจชเฉเจฐเจพ เจเจฐเฉเจเฅค เจฏเจพเจฆ เจฐเฉฑเจเฉ เจเจฟ เจ เจธเฉเจ เจเฉฑเจ เจธเจพเจฐเจฃเฉ เจฌเจฃเจพเจ เจนเฉ เจเจฟเจธ เจตเจฟเฉฑเจ เจเจพเจฐ เจเฉเฉฐเจเฉเจเจ เจธเจผเจพเจฎเจฒ เจนเฉ เจธเจเจฆเฉเจเจ เจนเจจ? เจเจ เจเฉเจ เจนเฉเจฐ เจคเฉฑเจค เจเฉเฉเฉเจ:
$ sudo bpftool map update id 114 key 2 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 3 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 4 0 0 0 value 1 0 0 0
เจนเฉเจฃ เจคเฉฑเจ เจฌเจนเฉเจค เจตเจงเฉเจ:
$ sudo bpftool map dump id 114
key: 01 00 00 00 value: 01 00 00 00
key: 02 00 00 00 value: 01 00 00 00
key: 04 00 00 00 value: 01 00 00 00
key: 03 00 00 00 value: 01 00 00 00
Found 4 elements
เจเจ เจเฉฑเจ เจนเฉเจฐ เจเฉเฉเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจ:
$ sudo bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
Error: update failed: Argument list too long
เจเจฟเจตเฉเจ เจเจฎเฉเจฆ เจธเฉ, เจ เจธเฉเจ เจธเจซเจฒ เจจเจนเฉเจ เจนเฉเจเฅค เจเจ เจเจฒเจคเฉ เจจเฉเฉฐ เจนเฉเจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจตเฉเจเฉเจ:
$ sudo strace -e bpf bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, info_len=80, info=0x7ffe6c626da0}}, 120) = 0
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=3, key=0x56049ded5260, value=0x56049ded5280, flags=BPF_ANY}, 120) = -1 E2BIG (Argument list too long)
Error: update failed: Argument list too long
+++ exited with 255 +++
เจธเจญ เจเฉเจ เจ เฉเจ เจนเฉ: เจเจฎเฉเจฆ เจ
เจจเฉเจธเจพเจฐ, เจเฉเจฎ BPF_MAP_UPDATE_ELEM
เจเฉฑเจ เจจเจตเฉเจ, เจชเฉฐเจเจตเฉเจ, เจเฉเฉฐเจเฉ เจฌเจฃเจพเจเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเจพ เจนเฉ, เจชเจฐ เจเจฐเฉเจธเจผ เจนเฉ เจเจพเจเจฆเจพ เจนเฉ E2BIG
.
เจเจธ เจฒเจ, เจ
เจธเฉเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจฌเจฃเจพ เจ
เจคเฉ เจฒเฉเจก เจเจฐ เจธเจเจฆเฉ เจนเจพเจ, เจจเจพเจฒ เจนเฉ เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจคเฉเจ เจจเจเจธเจผเฉ เจฌเจฃเจพ เจธเจเจฆเฉ เจนเจพเจ เจ
เจคเฉ เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจเจฐ เจธเจเจฆเฉ เจนเจพเจเฅค เจนเฉเจฃ เจเจน เจฆเฉเจเจฃเจพ เจคเจฐเจเจธเฉฐเจเจค เจนเฉ เจเจฟ เจ
เจธเฉเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจคเฉเจ เจจเจเจธเจผเฉ เจเจฟเจตเฉเจ เจตเจฐเจค เจธเจเจฆเฉ เจนเจพเจเฅค เจ
เจธเฉเจ เจเจธ เจฌเจพเจฐเฉ เจฎเจธเจผเฉเจจ เจฎเฉเจเจฐเฉ เจเฉเจกเจพเจ เจตเจฟเฉฑเจ เจชเฉเฉเจนเฉ เจเจพเจฃ เจตเจพเจฒเฉ เจนเจพเจฐเจก-เจเฉ-เจชเฉเฉเจนเจจ เจตเจพเจฒเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฆเฉ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจ เจเฉฑเจฒ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ, เจชเจฐ เจ
เจธเจฒ เจตเจฟเฉฑเจ เจเจน เจฆเจฟเจเจพเจเจฃ เจฆเจพ เจธเจฎเจพเจ เจ เจเจฟเจ เจนเฉ เจเจฟ เจเจฟเจตเฉเจ เจฌเฉเจชเฉเจเจซ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจ
เจธเจฒ เจตเจฟเฉฑเจ เจฒเจฟเจเจฟเจ เจ
เจคเฉ เจธเฉฐเจญเจพเจฒเจฟเจ เจเจพเจเจฆเจพ เจนเฉ - เจตเจฐเจคเจฆเฉ เจนเฉเจ libbpf
.
(เจเจจเฉเจนเจพเจ เจชเจพเจ เจเจพเจ เจฒเจ เจเฉ เจเฉฑเจ-เจชเฉฑเจงเจฐเฉ เจเจฆเจพเจนเจฐเจจ เจฆเฉ เจเจพเจ เจคเฉเจ เจ
เจธเฉฐเจคเฉเจธเจผเจ เจนเจจ: เจ
เจธเฉเจ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฆเจพ เจตเจฟเจธเจผเจฒเฉเจธเจผเจฃ เจเจฐเจพเจเจเฉ เจเฉ เจจเจเจธเจผเฉ เจ
เจคเฉ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจฌเจฃเจพเจ เจเจ เจนเจจ. libbpf
เจ
เจคเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจฆเฉฑเจธเฉ เจเจฟ เจนเจฆเจพเจเจคเจพเจ เจฆเฉ เจชเฉฑเจงเจฐ 'เจคเฉ เจเฉ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค เจเจนเจจเจพเจ เจชเจพเจ เจเจพเจ เจฒเจ เจเฉ เจ
เจธเฉฐเจคเฉเจธเจผเจ เจนเจจ เจฌเจนเฉเจค, เจ
เจธเฉเจ เจเฉเฉเจฟเจ
libbpf เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจฒเจฟเจเจฃเจพ
เจฎเจธเจผเฉเจจ เจเฉเจกเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจฒเจฟเจเจฃเจพ เจธเจฟเจฐเจซ เจชเจนเจฟเจฒเฉ เจตเจพเจฐ เจฆเจฟเจฒเจเจธเจช เจนเฉ เจธเจเจฆเจพ เจนเฉ, เจ
เจคเฉ เจซเจฟเจฐ เจธเฉฐเจคเฉเจธเจผเจเฉ เจธเจผเฉเจฐเฉ เจนเฉ เจเจพเจเจฆเฉ เจนเฉเฅค เจเจธ เจธเจฎเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจเจชเจฃเจพ เจงเจฟเจเจจ เจเจธ เจตเฉฑเจฒ เจฎเฉเฉเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ llvm
, เจเจฟเจธ เจตเจฟเฉฑเจ BPF เจเจฐเจเฉเจเฉเจเจเจฐ เจฒเจ เจเฉเจก เจฌเจฃเจพเจเจฃ เจฒเจ เจเฉฑเจ เจฌเฉเจเจเจเจก เจนเฉ, เจจเจพเจฒ เจนเฉ เจเฉฑเจ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ libbpf
, เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ BPF เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฆเจพ เจเจชเจญเฉเจเจคเจพ เจชเจพเจธเฉ เจฒเจฟเจเจฃ เจ
เจคเฉ เจเจธเจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจคเจฟเจเจฐ เจเฉเจคเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฆเฉ เจเฉเจก เจจเฉเฉฐ เจฒเฉเจก เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉ llvm
/clang
.
เจตเจพเจธเจคเจต เจตเจฟเฉฑเจ, เจเจฟเจตเฉเจ เจเจฟ เจ
เจธเฉเจ เจเจธ เจ
เจคเฉ เจ
เจเจฒเฉ เจฒเฉเจเจพเจ เจตเจฟเฉฑเจ เจฆเฉเจเจพเจเจเฉ, libbpf
เจเจธ เจคเฉเจ เจฌเจฟเจจเจพเจ เจฌเจนเฉเจค เจธเจพเจฐเจพ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ (เจเจพเจ เจธเจฎเจพเจจ เจธเจพเจงเจจ - iproute2
, libbcc
, libbpf-go
, เจเจฆเจฟ) เจฐเจนเจฟเจฃเจพ เจ
เจธเฉฐเจญเจต เจนเฉเฅค เจชเฉเจฐเฉเจเฉเจเจ เจฆเฉเจเจ เจเจพเจคเจฒ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ libbpf
เจเฉ BPF CO-RE (เจเฉฑเจ เจตเจพเจฐ เจเฉฐเจชเจพเจเจฒ เจเจฐเฉ, เจนเจฐ เจฅเจพเจ เจเจฒเจพเจ) - เจเฉฑเจ เจชเฉเจฐเฉเจเฉเจเจ เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจฒเจฟเจเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉ เจเฉ เจเฉฑเจ เจเจฐเจจเจฒ เจคเฉเจ เจฆเฉเจเฉ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจชเฉเจฐเจเฉเจฌเจฒ เจนเจจ, เจตเฉฑเจ-เจตเฉฑเจ API 'เจคเฉ เจเฉฑเจฒเจฃ เจฆเฉ เจฏเฉเจเจคเจพ เจฆเฉ เจจเจพเจฒ (เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเจฆเฉเจ เจเจฐเจจเจฒ เจฌเจฃเจคเจฐ เจตเจฐเจเจจ เจคเฉเจ เจฌเจฆเจฒเจฆเจพ เจนเฉเฅค เจธเฉฐเจธเจเจฐเจฃ เจคเฉฑเจ). CO-RE เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฆเฉ เจฏเฉเจ เจนเฉเจฃ เจฒเจ, เจคเฉเจนเจพเจกเฉ เจเจฐเจจเจฒ เจจเฉเฉฐ BTF เจธเจนเจพเจเจคเจพ เจจเจพเจฒ เจเฉฐเจชเจพเจเจฒ เจเฉเจคเจพ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ (เจ
เจธเฉเจ เจธเฉเจเจธเจผเจจ เจตเจฟเฉฑเจ เจตเจฐเจฃเจจ เจเจฐเจฆเฉ เจนเจพเจ เจเจฟ เจเจน เจเจฟเจตเฉเจ เจเจฐเจจเจพ เจนเฉ
$ ls -lh /sys/kernel/btf/vmlinux
-r--r--r-- 1 root root 2.6M Jul 29 15:30 /sys/kernel/btf/vmlinux
เจเจน เจซเจพเจเจฒ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจตเจฐเจคเฉ เจเจ เจธเจพเจฐเฉ เจกเฉเจเจพ เจเจฟเจธเจฎเจพเจ เจฌเจพเจฐเฉ เจเจพเจฃเจเจพเจฐเฉ เจธเจเฉเจฐ เจเจฐเจฆเฉ เจนเฉ เจ
เจคเฉ เจธเจพเจกเฉเจเจ เจธเจพเจฐเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจตเจฟเฉฑเจ เจตเจฐเจคเฉ เจเจพเจเจฆเฉ เจนเฉ libbpf
. เจ
เจธเฉเจ เจ
เจเจฒเฉ เจฒเฉเจ เจตเจฟเฉฑเจ CO-RE เจฌเจพเจฐเฉ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจเฉฑเจฒ เจเจฐเจพเจเจเฉ, เจชเจฐ เจเจธ เจตเจฟเฉฑเจ - เจฌเจธ เจเจชเจฃเฉ เจเจช เจจเฉเฉฐ เจเฉฑเจ เจเจฐเจจเจฒ เจฌเจฃเจพเจ CONFIG_DEBUG_INFO_BTF
.
เจฒเจพเจเจฌเจฐเฉเจฐเฉ เจจเฉเฉฐ libbpf
เจกเจพเจเจฐเฉเจเจเจฐเฉ เจตเจฟเฉฑเจ เจฐเจนเจฟเฉฐเจฆเจพ เจนเฉ tools/lib/bpf
เจเจฐเจจเจฒ เจ
เจคเฉ เจเจธเจฆเจพ เจตเจฟเจเจพเจธ เจฎเฉเจฒเจฟเฉฐเจ เจธเฉเจเฉ เจฆเฉเจเจฐเจพ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ [email protected]
. เจนเจพเจฒเจพเจเจเจฟ, เจเจฐเจจเจฒ เจคเฉเจ เจฌเจพเจนเจฐ เจฐเจนเจฟเจฃ เจตเจพเจฒเฉเจเจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฆเฉเจเจ เจฒเฉเฉเจพเจ เจฒเจ เจเฉฑเจ เจตเฉฑเจเจฐเฉ เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจฌเจฃเจพเจ เจเจพเจเจฆเฉ เจนเฉ
เจเจธ เจญเจพเจ เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจฆเฉเจเจพเจเจเฉ เจเจฟ เจคเฉเจธเฉเจ เจเฉฑเจ เจชเฉเจฐเฉเจเฉเจเจ เจเจฟเจตเฉเจ เจฌเจฃเจพ เจธเจเจฆเฉ เจนเฉ เจเฉ เจตเจฐเจคเจฆเจพ เจนเฉ libbpf
, เจเจ เจเจ (เจตเฉฑเจง เจเจพเจ เจเฉฑเจ เจ
เจฐเจฅเจนเฉเจฃ) เจเฉเจธเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจฒเจฟเจเฉเจ เจ
เจคเฉ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจตเจฟเจธเจผเจฒเฉเจธเจผเจฃ เจเจฐเฉเจ เจเจฟ เจเจน เจธเจญ เจเจฟเจตเฉเจ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉเฅค เจเจน เจธเจพเจจเฉเฉฐ เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจญเจพเจเจพเจ เจตเจฟเฉฑเจ เจนเฉเจฐ เจเจธเจพเจจเฉ เจจเจพเจฒ เจธเจฎเจเจพเจเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจฆเฉเจตเฉเจเจพ เจเจฟ เจเจฟเจตเฉเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเจเจธเจผเจฟเจเจ, เจเจฐเจจเจฒ เจธเจนเจพเจเจ, BTF, เจเจฆเจฟ เจจเจพเจฒ เจชเจฐเจธเจชเจฐ เจชเฉเจฐเจญเจพเจต เจชเจพเจเจเจฆเฉ เจนเจจเฅค
เจเจฎ เจคเฉเจฐ 'เจคเฉ เจชเฉเจฐเฉเจเฉเจเจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ libbpf
เจเฉฑเจ GitHub เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจจเฉเฉฐ เจเฉฑเจ git เจธเจฌเจฎเฉเจกเจฟเจเจฒ เจตเจเฉเจ เจธเจผเจพเจฎเจฒ เจเจฐเฉ, เจ
เจธเฉเจ เจเจนเฉ เจเจฐเจพเจเจเฉ:
$ mkdir /tmp/libbpf-example
$ cd /tmp/libbpf-example/
$ git init-db
Initialized empty Git repository in /tmp/libbpf-example/.git/
$ git submodule add https://github.com/libbpf/libbpf.git
Cloning into '/tmp/libbpf-example/libbpf'...
remote: Enumerating objects: 200, done.
remote: Counting objects: 100% (200/200), done.
remote: Compressing objects: 100% (103/103), done.
remote: Total 3354 (delta 101), reused 118 (delta 79), pack-reused 3154
Receiving objects: 100% (3354/3354), 2.05 MiB | 10.22 MiB/s, done.
Resolving deltas: 100% (2176/2176), done.
เจจเฉเฉฐ เจเจพเจฃเจพ libbpf
เจฌเจนเฉเจค เจนเฉ เจธเจงเจพเจฐเจจ:
$ cd libbpf/src
$ mkdir build
$ OBJDIR=build DESTDIR=root make -s install
$ find root
root
root/usr
root/usr/include
root/usr/include/bpf
root/usr/include/bpf/bpf_tracing.h
root/usr/include/bpf/xsk.h
root/usr/include/bpf/libbpf_common.h
root/usr/include/bpf/bpf_endian.h
root/usr/include/bpf/bpf_helpers.h
root/usr/include/bpf/btf.h
root/usr/include/bpf/bpf_helper_defs.h
root/usr/include/bpf/bpf.h
root/usr/include/bpf/libbpf_util.h
root/usr/include/bpf/libbpf.h
root/usr/include/bpf/bpf_core_read.h
root/usr/lib64
root/usr/lib64/libbpf.so.0.1.0
root/usr/lib64/libbpf.so.0
root/usr/lib64/libbpf.a
root/usr/lib64/libbpf.so
root/usr/lib64/pkgconfig
root/usr/lib64/pkgconfig/libbpf.pc
เจเจธ เจญเจพเจ เจตเจฟเฉฑเจ เจธเจพเจกเฉ เจ
เจเจฒเฉ เจฏเฉเจเจจเจพ เจเจธ เจคเจฐเฉเจนเจพเจ เจนเฉ: เจ
เจธเฉเจ เจเฉฑเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเจฟเจเจพเจเจเฉ เจเจฟเจตเฉเจ เจเจฟ BPF_PROG_TYPE_XDP
, เจชเจฟเจเจฒเฉ เจเจฆเจพเจนเจฐเจจ เจตเจพเจเจ เจนเฉ, เจชเจฐ C เจตเจฟเฉฑเจ, เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจตเจฐเจค เจเฉ เจเฉฐเจชเจพเจเจฒ เจเจฐเจฆเฉ เจนเจพเจ clang
, เจ
เจคเฉ เจเฉฑเจ เจธเจนเจพเจเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเจฟเจเฉ เจเฉ เจเจธเจจเฉเฉฐ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเจฐเฉเจเจพเฅค เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจญเจพเจเจพเจ เจตเจฟเฉฑเจ เจ
เจธเฉเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจ
เจคเฉ เจธเจนเจพเจเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉเจตเจพเจ เจฆเฉเจเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฆเจพ เจตเจฟเจธเจคเจพเจฐ เจเจฐเจพเจเจเฉเฅค
เจเจฆเจพเจนเจฐเจจ: libbpf เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเฉฑเจ เจชเฉเจฐเฉ เจคเจฐเฉเจนเจพเจ เจฆเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฌเจฃเจพเจเจฃเจพ
เจธเจผเฉเจฐเฉ เจเจฐเจจ เจฒเจ, เจ
เจธเฉเจ เจซเจพเจเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ /sys/kernel/btf/vmlinux
, เจเจฟเจธเจฆเจพ เจเฉฑเจชเจฐ เจเจผเจฟเจเจฐ เจเฉเจคเจพ เจเจฟเจ เจธเฉ, เจ
เจคเฉ เจธเจฟเจฐเจฒเฉเจ เจซเจพเจเจฒ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจเจธเจฆเฉ เจฌเจฐเจพเจฌเจฐ เจฌเจฃเจพเจ:
$ bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
เจเจน เจซเจพเจเจฒ เจธเจพเจกเฉ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจเจชเจฒเจฌเจง เจธเจพเจฐเฉ เจกเฉเจเจพ เจขเจพเจเจเฉ เจจเฉเฉฐ เจธเจเฉเจฐ เจเจฐเฉเจเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเจฐเจจเจฒ เจตเจฟเฉฑเจ IPv4 เจธเจฟเจฐเจฒเฉเจ เจจเฉเฉฐ เจเจธ เจคเจฐเฉเจนเจพเจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉ:
$ grep -A 12 'struct iphdr {' vmlinux.h
struct iphdr {
__u8 ihl: 4;
__u8 version: 4;
__u8 tos;
__be16 tot_len;
__be16 id;
__be16 frag_off;
__u8 ttl;
__u8 protocol;
__sum16 check;
__be32 saddr;
__be32 daddr;
};
เจนเฉเจฃ เจ เจธเฉเจ เจเจชเจฃเจพ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ C เจตเจฟเฉฑเจ เจฒเจฟเจเจพเจเจเฉ:
$ cat xdp-simple.bpf.c
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
SEC("xdp/simple")
int simple(void *ctx)
{
return XDP_PASS;
}
char LICENSE[] SEC("license") = "GPL";
เจนเจพเจฒเจพเจเจเจฟ เจธเจพเจกเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฌเจนเฉเจค เจธเจพเจฆเจพ เจธเฉ, เจซเจฟเจฐ เจตเฉ เจธเจพเจจเฉเฉฐ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจตเฉเจฐเจตเจฟเจเจ 'เจคเฉ เจงเจฟเจเจจ เจฆเฉเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค เจชเจนเจฟเจฒเจพเจ, เจชเจนเจฟเจฒเฉ เจนเฉเจกเจฐ เจซเจพเจเจฒ เจเฉ เจ
เจธเฉเจ เจธเจผเจพเจฎเจฒ เจเจฐเจฆเฉ เจนเจพเจ vmlinux.h
, เจเฉ เจ
เจธเฉเจ เจตเจฐเจค เจเฉ เจคเจฟเจเจฐ เจเฉเจคเจพ เจนเฉ bpftool btf dump
- เจนเฉเจฃ เจธเจพเจจเฉเฉฐ เจเจน เจชเจคเจพ เจเจฐเจจ เจฒเจ เจเจฐเจจเจฒ-เจนเฉเจกเจฐ เจชเฉเจเฉเจ เจจเฉเฉฐ เจเฉฐเจธเจเจพเจฒ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉ เจเจฟ เจเจฐเจจเจฒ เจฌเจฃเจคเจฐ เจเจฟเจธ เจคเจฐเฉเจนเจพเจ เจฆเฉ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเฉ เจนเจจเฅค เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจนเฉเจกเจฐ เจซเจพเจเจฒ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจคเฉเจ เจธเจพเจกเฉ เจเฉเจฒ เจเจเจเจฆเฉ เจนเฉ libbpf
. เจนเฉเจฃ เจธเจพเจจเฉเฉฐ เจธเจฟเจฐเจซ เจฎเฉเจเจฐเฉ เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจจ เจฒเจ เจเจธเจฆเฉ เจฒเฉเฉ เจนเฉ SEC
, เจเฉ เจ
เฉฑเจเจฐ เจจเฉเฉฐ ELF เจเจฌเจเฉเจเจ เจซเจพเจเจฒ เจฆเฉ เจเจเจฟเจค เจญเจพเจ เจตเจฟเฉฑเจ เจญเฉเจเจฆเจพ เจนเฉเฅค เจธเจพเจกเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจญเจพเจ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจนเฉ xdp/simple
, เจเจฟเฉฑเจฅเฉ เจธเจฒเฉเจธเจผ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจ
เจธเฉเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจเจฟเจธเจฎ BPF เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจฆเฉ เจนเจพเจ - เจเจน เจเจธ เจตเจฟเฉฑเจ เจตเจฐเจคเจฟเจ เจเจพเจฃ เจตเจพเจฒเจพ เจธเฉฐเจฎเฉเจฒเจจ เจนเฉ libbpf
, เจธเฉเจเจธเจผเจจ เจจเจพเจฎ เจฆเฉ เจเจงเจพเจฐ 'เจคเฉ เจเจน เจธเจเจพเจฐเจเจ
เฉฑเจช 'เจคเฉ เจธเจนเฉ เจเจฟเจธเจฎ เจจเฉเฉฐ เจฌเจฆเจฒ เจฆเฉเจตเฉเจเจพ bpf(2)
. เจฌเฉเจชเฉเจเจซ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจชเจฃเฉ เจเจช เจนเฉ C
- เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจ
เจคเฉ เจเฉฑเจ เจฒเจพเจเจจ เจฆเฉ เจธเจผเจพเจฎเจฒ เจนเจจ return XDP_PASS
. เจ
เฉฐเจค เจตเจฟเฉฑเจ, เจเฉฑเจ เจตเฉฑเจเจฐเจพ เจญเจพเจ "license"
เจฒเจพเจเจธเฉฐเจธ เจฆเจพ เจจเจพเจฎ เจธเจผเจพเจฎเจฟเจฒ เจนเฉ.
เจ
เจธเฉเจ เจเจชเจฃเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ llvm/clang, เจธเฉฐเจธเจเจฐเจฃ >= 10.0.0, เจเจพเจ เจเจธ เจคเฉเจ เจตเจงเฉเจ, เจเจธ เจคเฉเจ เจตเฉฑเจง เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเฉฐเจชเจพเจเจฒ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ (เจธเฉเจเจธเจผเจจ เจตเฉเจเฉ
$ clang --version
clang version 11.0.0 (https://github.com/llvm/llvm-project.git afc287e0abec710398465ee1f86237513f2b5091)
...
$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
เจฆเจฟเจฒเจเจธเจช เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจตเจฟเฉฑเจเฉเจ: เจ
เจธเฉเจ เจจเจฟเจธเจผเจพเจจเจพ เจเจฐเจเฉเจเฉเจเจเจฐ เจจเฉเฉฐ เจฆเจฐเจธเจพเจเจเจฆเฉ เจนเจพเจ -target bpf
เจ
เจคเฉ เจธเจฟเจฐเจฒเฉเจเจพเจ เจฆเจพ เจฎเจพเจฐเจ libbpf
, เจเฉ เจ
เจธเฉเจ เจนเจพเจฒ เจนเฉ เจตเจฟเฉฑเจ เจธเจฅเจพเจชเจฟเจค เจเฉเจคเจพ เจนเฉเฅค เจจเจพเจฒ เจนเฉ, เจฌเจพเจฐเฉ เจจเจพ เจญเฉเฉฑเจฒเฉ -O2
, เจเจธ เจตเจฟเจเจฒเจช เจคเฉเจ เจฌเจฟเจจเจพเจ เจคเฉเจธเฉเจ เจญเจตเจฟเฉฑเจ เจตเจฟเฉฑเจ เจนเฉเจฐเจพเจจเฉ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค เจเจ เจเจชเจฃเฉ เจเฉเจก เจจเฉเฉฐ เจตเฉเจเฉเจ, เจเฉ เจ
เจธเฉเจ เจเจน เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเจฟเจเจฃ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจง เจเฉเจคเจพ เจเฉ เจ
เจธเฉเจ เจเจพเจนเฉเฉฐเจฆเฉ เจธเฉ?
$ llvm-objdump --section=xdp/simple --no-show-raw-insn -D xdp-simple.bpf.o
xdp-simple.bpf.o: file format elf64-bpf
Disassembly of section xdp/simple:
0000000000000000 <simple>:
0: r0 = 2
1: exit
เจนเจพเจ, เจเจน เจเฉฐเจฎ เจเฉเจคเจพ! เจนเฉเจฃ, เจธเจพเจกเฉ เจเฉเจฒ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจฌเจพเจเจจเจฐเฉ เจซเจพเจเจฒ เจนเฉ, เจ
เจคเฉ เจ
เจธเฉเจ เจเฉฑเจ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฌเจฃเจพเจเจฃเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจพเจ เจเฉ เจเจธเจจเฉเฉฐ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเจฐเฉเจเฉเฅค เจเจธ เจฎเฉฐเจคเจต เจฒเจ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ libbpf
เจธเจพเจจเฉเฉฐ เจฆเฉ เจตเจฟเจเจฒเจช เจชเฉเจธเจผ เจเจฐเจฆเจพ เจนเฉ - เจเฉฑเจ เจนเฉเจ เจฒเฉ-เจชเฉฑเจงเจฐ เจฆเจพ API เจเจพเจ เจเฉฑเจ-เจชเฉฑเจงเจฐเฉ API เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเฉเฅค เจ
เจธเฉเจ เจฆเฉเจเฉ เจคเจฐเฉเจเฉ เจจเจพเจฒ เจเจพเจตเจพเจเจเฉ, เจเจฟเจเจเจเจฟ เจ
เจธเฉเจ เจธเจฟเฉฑเจเจฃเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจพเจ เจเจฟ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจเจนเจจเจพเจ เจฆเฉ เจ
เจเจฒเฉ เจ
เจงเจฟเจเจจ เจฒเจ เจเฉฑเจ เจคเฉเจ เจเฉฑเจ เจฎเจฟเจนเจจเจค เจจเจพเจฒ เจเจฟเจตเฉเจ เจฒเจฟเจเจฃเจพ, เจฒเฉเจก เจเจฐเจจเจพ เจ
เจคเฉ เจเจนเจจเจพเจ เจจเจพเจฒ เจเฉเฉเจจเจพ เจนเฉเฅค
เจชเจนเจฟเจฒเจพเจ, เจธเจพเจจเฉเฉฐ เจเจธเฉ เจเจชเจฏเฉเจเจคเจพ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจเจธเจฆเฉ เจฌเจพเจเจจเจฐเฉ เจคเฉเจ เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเจพ "เจธเจเจฒเฉเจเจจ" เจฌเจฃเจพเจเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค bpftool
- BPF เจธเฉฐเจธเจพเจฐ เจฆเจพ เจธเจตเจฟเจธ เจเจพเจเฉ (เจเจฟเจธ เจจเฉเฉฐ เจธเจผเจพเจฌเจฆเจฟเจ เจคเฉเจฐ 'เจคเฉ เจฒเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉ, เจเจฟเจเจเจเจฟ เจกเฉเจจเฉเจ
เจฒ เจฌเฉเจฐเจเจฎเฉเจจ, BPF เจฆเฉ เจธเจฟเจฐเจเจฃเจนเจพเจฐเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ, เจธเจตเจฟเจธ เจนเฉ):
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
เจซเจพเจเจฒ เจตเจฟเฉฑเจ xdp-simple.skel.h
เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเจพ เจฌเจพเจเจจเจฐเฉ เจเฉเจก เจ
เจคเฉ เจชเฉเจฐเจฌเฉฐเจงเจจ เจฒเจ เจซเฉฐเจเจธเจผเจจเจพเจ เจธเจผเจพเจฎเจฒ เจเจฐเจฆเจพ เจนเฉ - เจธเจพเจกเฉ เจเจฌเจเฉเจเจ เจจเฉเฉฐ เจฒเฉเจก เจเจฐเจจเจพ, เจ
เจเฉเจ เจเจฐเจจเจพ, เจฎเจฟเจเจพเจเจฃเจพเฅค เจธเจพเจกเฉ เจธเจงเจพเจฐเจจ เจเฉเจธ เจตเจฟเฉฑเจ เจเจน เจเจตเจฐเจเจฟเฉฑเจฒ เจตเจฐเจเจพ เจฒเฉฑเจเจฆเจพ เจนเฉ, เจชเจฐ เจเจน เจเจธ เจเฉเจธ เจตเจฟเฉฑเจ เจตเฉ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ เจเจฟเฉฑเจฅเฉ เจเจฌเจเฉเจเจ เจซเจพเจเจฒ เจตเจฟเฉฑเจ เจฌเจนเฉเจค เจธเจพเจฐเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจ
เจคเฉ เจจเจเจธเจผเฉ เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเฉ เจนเจจ เจ
เจคเฉ เจเจธ เจตเจฟเจธเจผเจพเจฒ ELF เจจเฉเฉฐ เจฒเฉเจก เจเจฐเจจ เจฒเจ เจธเจพเจจเฉเฉฐ เจธเจฟเจฐเจซเจผ เจชเจฟเฉฐเจเจฐ เจคเจฟเจเจฐ เจเจฐเจจ เจ
เจคเฉ เจเจธเจเจฎ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจคเฉเจ เจเฉฑเจ เจเจพเจ เจฆเฉ เจซเฉฐเจเจธเจผเจจเจพเจ เจจเฉเฉฐ เจเจพเจฒ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค เจฒเจฟเจ เจฐเจนเฉ เจนเจจ เจเจฒเฉ เจนเฉเจฃ เจ
เฉฑเจเฉ เจตเจงเจฆเฉ เจนเจพเจเฅค
เจธเจเจคเฉ เจจเจพเจฒ เจฌเฉเจฒเจฆเฉ เจนเฉเจ, เจธเจพเจกเจพ เจฒเฉเจกเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฎเจพเจฎเฉเจฒเฉ เจนเฉ:
#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"
int main(int argc, char **argv)
{
struct xdp_simple_bpf *obj;
obj = xdp_simple_bpf__open_and_load();
if (!obj)
err(1, "failed to open and/or load BPF objectn");
pause();
xdp_simple_bpf__destroy(obj);
}
เจเจน เจเจธ เจฒเจ เจนเฉ struct xdp_simple_bpf
เจซเจพเจเจฒ เจตเจฟเฉฑเจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉ xdp-simple.skel.h
เจ
เจคเฉ เจธเจพเจกเฉ เจเจฌเจเฉเจเจ เจซเจพเจเจฒ เจฆเจพ เจตเจฐเจฃเจจ เจเจฐเจฆเจพ เจนเฉ:
struct xdp_simple_bpf {
struct bpf_object_skeleton *skeleton;
struct bpf_object *obj;
struct {
struct bpf_program *simple;
} progs;
struct {
struct bpf_link *simple;
} links;
};
เจ
เจธเฉเจ เจเฉฑเจฅเฉ เจเฉฑเจ เจจเฉเจตเฉเจ-เจชเฉฑเจงเจฐ เจฆเฉ API เจฆเฉ เจจเจฟเจธเจผเจพเจจ เจฆเฉเจ เจธเจเจฆเฉ เจนเจพเจ: เจขเจพเจเจเจพ struct bpf_program *simple
ะธ struct bpf_link *simple
. เจชเจนเจฟเจฒเจพ เจขเจพเจเจเจพ เจตเจฟเจธเจผเฉเจธเจผ เจคเฉเจฐ 'เจคเฉ เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเจพ เจตเจฐเจฃเจจ เจเจฐเจฆเจพ เจนเฉ, เจธเฉเจเจธเจผเจจ เจตเจฟเฉฑเจ เจฒเจฟเจเจฟเจ เจเจฟเจ เจนเฉ xdp/simple
, เจ
เจคเฉ เจฆเฉเจเจพ เจตเจฐเจฃเจจ เจเจฐเจฆเจพ เจนเฉ เจเจฟ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจตเฉเจเจ เจธเจฐเฉเจค เจจเจพเจฒ เจเจฟเจตเฉเจ เจเฉเฉเจฆเจพ เจนเฉเฅค
เจซเฉฐเจเจธเจผเจจ xdp_simple_bpf__open_and_load
, เจเฉฑเจ ELF เจเจฌเจเฉเจเจ เจเฉเจฒเฉเจนเจฆเจพ เจนเฉ, เจเจธเจจเฉเฉฐ เจชเจพเจฐเจธ เจเจฐเจฆเจพ เจนเฉ, เจธเจพเจฐเฉ เจขเจพเจเจเฉ เจ
เจคเฉ เจธเจฌเจธเจเจฐเจเจเจฐ เจฌเจฃเจพเจเจเจฆเจพ เจนเฉ (เจชเฉเจฐเฉเจเจฐเจพเจฎ เจคเฉเจ เจเจฒเจพเจตเจพ, ELF เจตเจฟเฉฑเจ เจนเฉเจฐ เจญเจพเจ เจตเฉ เจนเฉเฉฐเจฆเฉ เจนเจจ - เจกเฉเจเจพ, เจธเจฟเจฐเจซเจผ เจชเฉเฉเจนเจจ เจฒเจ เจกเจพเจเจพ, เจกเฉเจฌเฉฑเจเจฟเฉฐเจ เจเจพเจฃเจเจพเจฐเฉ, เจฒเจพเจเจธเฉเจเจธ, เจเจฆเจฟ), เจ
เจคเฉ เจซเจฟเจฐ เจเจธเจจเฉเฉฐ เจธเจฟเจธเจเจฎ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเจฐเจฆเจพ เจนเฉเฅค เจเจพเจฒ เจเจฐเฉ bpf
, เจเจฟเจธ เจจเฉเฉฐ เจ
เจธเฉเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจ
เจคเฉ เจเจฒเจพ เจเฉ เจเฉเฉฑเจ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ:
$ clang -O2 -I ./libbpf/src/root/usr/include/ xdp-simple.c -o xdp-simple ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo strace -e bpf ./xdp-simple
...
bpf(BPF_BTF_LOAD, 0x7ffdb8fd9670, 120) = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0xdfd580, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(5, 8, 0), prog_flags=0, prog_name="simple", prog_ifindex=0, expected_attach_type=0x25 /* BPF_??? */, ...}, 120) = 4
เจเจ เจนเฉเจฃ เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจตเฉเจเฉเจ bpftool
. เจเจ เจเจธเจฆเฉ เจเจเจกเฉ เจฒเฉฑเจญเฉเจ:
# bpftool p | grep -A4 simple
463: xdp name simple tag 3b185187f1855c4c gpl
loaded_at 2020-08-01T01:59:49+0000 uid 0
xlated 16B jited 40B memlock 4096B
btf_id 185
pids xdp-simple(16498)
เจ
เจคเฉ เจกเฉฐเจช (เจ
เจธเฉเจ เจเจฎเจพเจเจก เจฆเจพ เจเฉเจเจพ เจฐเฉเจช เจตเจฐเจคเจฆเฉ เจนเจพเจ bpftool prog dump xlated
):
# bpftool p d x id 463
int simple(void *ctx):
; return XDP_PASS;
0: (b7) r0 = 2
1: (95) exit
เจเฉเจ เจจเจตเจพเจ! เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉ เจธเจพเจกเฉ C เจธเจฐเฉเจค เจซเจพเจเจฒ เจฆเฉ เจเฉเจเฉเฉ เจเจพเจชเฉเฅค เจเจน เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจฆเฉเจเจฐเจพ เจเฉเจคเจพ เจเจฟเจ เจธเฉ libbpf
, เจเจฟเจธ เจจเฉ เจฌเจพเจเจจเจฐเฉ เจตเจฟเฉฑเจ เจกเฉเจฌเฉฑเจ เจธเฉเจเจธเจผเจจ เจฒเฉฑเจญเจฟเจ, เจเจธเจจเฉเฉฐ เจเฉฑเจ BTF เจเจฌเจเฉเจเจ เจตเจฟเฉฑเจ เจเฉฐเจชเจพเจเจฒ เจเฉเจคเจพ, เจเจธเจจเฉเฉฐ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเฉเจคเจพ BPF_BTF_LOAD
, เจ
เจคเฉ เจซเจฟเจฐ เจเจฎเจพเจเจก เจจเจพเจฒ เจชเจฐเฉเจเจฐเจพเจฎ เจฒเฉเจก เจเจฐเจจ เจตเฉเจฒเฉ เจจเจคเฉเจเจพ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจจเจฟเจฐเจงเจพเจฐเจค เจเจฐเฉ BPG_PROG_LOAD
.
เจเจฐเจจเจฒ เจธเจนเจพเจเจ
BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ "เจฌเจพเจนเจฐเฉ" เจซเฉฐเจเจธเจผเจจ เจเจฒเจพ เจธเจเจฆเฉ เจนเจจ - เจเจฐเจจเจฒ เจธเจนเจพเจเจเฅค เจเจน เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจเจฐเจจเจฒ เจขเจพเจเจเฉ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจเจฐเจจ, เจจเจเจธเจผเจฟเจเจ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจเจฐเจจ, เจ เจคเฉ "เจ เจธเจฒ เจธเฉฐเจธเจพเจฐ" เจจเจพเจฒ เจธเฉฐเจเจพเจฐ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเฉ เจนเจจ - เจชเจฐเจซ เจเจตเฉเจเจเจธ เจฌเจฃเจพเจเจฃ, เจนเจพเจฐเจกเจตเฉเจ เจฐ เจจเฉเฉฐ เจเฉฐเจเจฐเฉเจฒ เจเจฐเจจ (เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจฐเฉเจกเจพเจเจฐเฉเจเจ เจชเฉเจเฉเจ), เจเจฆเจฟเฅค
เจเจฆเจพเจนเจฐเจจ: bpf_get_smp_processor_id
"เจเจฆเจพเจนเจฐเจฃ เจฆเฉเจเจฐเจพ เจธเจฟเฉฑเจเจฃเจพ" เจชเฉเจฐเจพเจกเจพเจเจฎ เจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจ
เฉฐเจฆเจฐ, เจเจ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ 'เจคเฉ เจตเจฟเจเจพเจฐ เจเจฐเฉเจ, bpf_get_smp_processor_id()
, kernel/bpf/helpers.c
. เจเจน เจชเฉเจฐเฉเจธเฉเจธเจฐ เจฆเจพ เจจเฉฐเจฌเจฐ เจตเจพเจชเจธ เจเจฐเจฆเจพ เจนเฉ เจเจฟเจธ 'เจคเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฟเจธ เจจเฉ เจเจธเจจเฉเฉฐ เจฌเฉเจฒเจพเจเจ เจนเฉ เจเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉเฅค เจชเจฐ เจ
เจธเฉเจ เจเจธเจฆเฉ เจ
เจฐเจฅ เจตเจฟเจเจฟเจเจจ เจตเจฟเฉฑเจ เจเฉฐเจจเฉ เจฆเจฟเจฒเจเจธเจชเฉ เจจเจนเฉเจ เจฐเฉฑเจเจฆเฉ เจเจฟเฉฐเจจเจพ เจเจธ เจคเฉฑเจฅ เจตเจฟเฉฑเจ เจเจฟ เจเจธเจฆเฉ เจฒเจพเจเฉ เจเจฐเจจ เจตเจฟเฉฑเจ เจเฉฑเจ เจฒเจพเจเจจ เจฒเฉฑเจเจฆเฉ เจนเฉ:
BPF_CALL_0(bpf_get_smp_processor_id)
{
return smp_processor_id();
}
BPF เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจ เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ เจฒเฉเจจเจเจธ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ เจฆเฉ เจธเจฎเจพเจจ เจนเจจเฅค เจเฉฑเจฅเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉฑเจ เจซเฉฐเจเจธเจผเจจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉ เจเจฟเจธเจฆเจพ เจเฉเจ เจเจฐเจเฉเจฎเฉเจเจ เจจเจนเฉเจ เจนเฉเฅค (เจเฉฑเจ เจซเฉฐเจเจธเจผเจจ เจเฉ เจฒเฉเจเจฆเฉ เจนเฉ, เจเจนเฉ, เจคเจฟเฉฐเจจ เจเจฐเจเฉเจฎเฉเจเจเจพเจ เจจเฉเฉฐ เจฎเฉเจเจฐเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉ BPF_CALL_3
. เจเจฐเจเฉเจฎเฉเจเจเจพเจ เจฆเฉ เจตเฉฑเจง เจคเฉเจ เจตเฉฑเจง เจเจฟเจฃเจคเฉ เจชเฉฐเจ เจนเฉเฅค) เจนเจพเจฒเจพเจเจเจฟ, เจเจน เจชเจฐเจฟเจญเจพเจธเจผเจพ เจฆเจพ เจธเจฟเจฐเจซ เจชเจนเจฟเจฒเจพ เจนเจฟเฉฑเจธเจพ เจนเฉเฅค เจฆเฉเจเจพ เจนเจฟเฉฑเจธเจพ เจเจฟเจธเจฎ เจฆเฉ เจฌเจฃเจคเจฐ เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจจเจพ เจนเฉ struct bpf_func_proto
, เจเจฟเจธ เจตเจฟเฉฑเจ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจ เจฆเจพ เจตเฉเจฐเจตเจพ เจนเฉเฉฐเจฆเจพ เจนเฉ เจเจฟเจธเจจเฉเฉฐ เจชเฉเจฐเจฎเจพเจฃเจ เจธเจฎเจเจฆเจพ เจนเฉ:
const struct bpf_func_proto bpf_get_smp_processor_id_proto = {
.func = bpf_get_smp_processor_id,
.gpl_only = false,
.ret_type = RET_INTEGER,
};
เจนเฉเจฒเจชเจฐ เจซเฉฐเจเจธเจผเจจเจพเจ เจจเฉเฉฐ เจฐเจเจฟเจธเจเจฐ เจเจฐเจจเจพ
เจเจฟเจธเฉ เจเจพเจธ เจเจฟเจธเจฎ เจฆเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจเจธ เจซเฉฐเจเจธเจผเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฒเจ, เจเจนเจจเจพเจ เจจเฉเฉฐ เจเจธ เจจเฉเฉฐ เจฐเจเจฟเจธเจเจฐ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ เจเจฟเจธเจฎ เจฒเจ BPF_PROG_TYPE_XDP
เจเฉฑเจ เจซเฉฐเจเจธเจผเจจ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉ xdp_func_proto
, เจเฉ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจ ID เจคเฉเจ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจเจฐเจฆเจพ เจนเฉ เจเจฟ XDP เจเจธ เจซเฉฐเจเจธเจผเจจ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจฆเจพ เจนเฉ เจเจพเจ เจจเจนเฉเจเฅค เจธเจพเจกเจพ เจเจพเจฐเจ เจนเฉ
static const struct bpf_func_proto *
xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
{
switch (func_id) {
...
case BPF_FUNC_get_smp_processor_id:
return &bpf_get_smp_processor_id_proto;
...
}
}
เจจเจตเฉเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฟเจธเจฎเจพเจ เจจเฉเฉฐ เจซเจพเจเจฒ เจตเจฟเฉฑเจ "เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค" เจเฉเจคเจพ เจเจฟเจ เจนเฉ include/linux/bpf_types.h
BPF_PROG_TYPE
. เจเฉเจเจธ เจตเจฟเฉฑเจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฟเจเจเจเจฟ เจเจน เจเฉฑเจ เจฒเจพเจเจผเฉเจเจฒ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจนเฉ, เจ
เจคเฉ C เจญเจพเจธเจผเจพ เจฆเฉ เจธเจผเจฌเจฆเจพเจ เจตเจฟเฉฑเจ เจเฉฐเจเจฐเฉเจ เจฌเจฃเจคเจฐเจพเจ เจฆเฉ เจเฉฑเจ เจชเฉเจฐเฉ เจธเจฎเฉเจน เจฆเฉ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจนเฉเจฐ เจธเจฅเจพเจจเจพเจ เจตเจฟเฉฑเจ เจตเจพเจชเจฐเจฆเฉ เจนเฉเฅค เจเจพเจธ เจคเฉเจฐ 'เจคเฉ, เจซเจพเจเจฒ เจตเจฟเฉฑเจ kernel/bpf/verifier.c
เจซเจพเจเจฒ เจคเฉเจ เจธเจพเจฐเฉเจเจ เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ bpf_types.h
เจขเจพเจเจเฉ เจฆเฉ เจเฉฑเจ เจฒเฉเฉ เจฌเจฃเจพเจเจฃ เจฒเจ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉ bpf_verifier_ops[]
:
static const struct bpf_verifier_ops *const bpf_verifier_ops[] = {
#define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type)
[_id] = & _name ## _verifier_ops,
#include <linux/bpf_types.h>
#undef BPF_PROG_TYPE
};
เจญเจพเจต, เจนเจฐเฉเจ เจเจฟเจธเจฎ เจฆเฉ เจฌเฉเจชเฉเจเจซ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเจ, เจเจฟเจธเจฎ เจฆเฉ เจกเฉเจเจพ เจขเจพเจเจเฉ เจฒเจ เจเฉฑเจ เจชเฉเจเจเฉฐเจเจฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉ struct bpf_verifier_ops
, เจเฉ เจเจฟ เจฎเฉเฉฑเจฒ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจเฉเจคเจพ เจเจฟเจ เจนเฉ _name ## _verifier_ops
, เจญเจพเจต, xdp_verifier_ops
เจจเฉเฉฐ xdp
... เจฌเจฃเจคเจฐ xdp_verifier_ops
net/core/filter.c
เจนเฉเจ เจฒเจฟเจเฉ เจ
เจจเฉเจธเจพเจฐ:
const struct bpf_verifier_ops xdp_verifier_ops = {
.get_func_proto = xdp_func_proto,
.is_valid_access = xdp_is_valid_access,
.convert_ctx_access = xdp_convert_ctx_access,
.gen_prologue = bpf_noop_prologue,
};
เจเฉฑเจฅเฉ เจ
เจธเฉเจ เจเจชเจฃเจพ เจเจพเจฃเจฟเจ เจซเฉฐเจเจธเจผเจจ เจฆเฉเจเจฆเฉ เจนเจพเจ xdp_func_proto
, เจเฉ เจนเจฐ เจตเจพเจฐ เจเจฟเจธเฉ เจเฉเจฃเฉเจคเฉ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจเจฐเจจ 'เจคเฉ เจคเจธเจฆเฉเจเจเจฐเจคเจพ เจจเฉเฉฐ เจเจฒเจพเจเจเจพ เจเฉเจ เจเจฟเจธเจฎ เจฆเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจ
เฉฐเจฆเจฐ เจซเฉฐเจเจธเจผเจจ, เจตเฉเจเฉ verifier.c
เจเจ เจฆเฉเจเฉเจ เจเจฟ เจเฉฑเจ เจเจพเจฒเจชเจจเจฟเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจซเฉฐเจเจธเจผเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฟเจตเฉเจ เจเจฐเจฆเจพ เจนเฉ bpf_get_smp_processor_id
. เจ
เจเจฟเจนเจพ เจเจฐเจจ เจฒเจ, เจ
เจธเฉเจ เจเจชเจฃเฉ เจชเจฟเจเจฒเฉ เจญเจพเจ เจคเฉเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจเจฆเฉ เจนเจพเจ:
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
SEC("xdp/simple")
int simple(void *ctx)
{
if (bpf_get_smp_processor_id() != 0)
return XDP_DROP;
return XDP_PASS;
}
char LICENSE[] SEC("license") = "GPL";
เจจเจฟเจธเจผเจพเจจ bpf_get_smp_processor_id
<bpf/bpf_helper_defs.h>
เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉเจเจ libbpf
เจจเฉเฉฐ
static u32 (*bpf_get_smp_processor_id)(void) = (void *) 8;
เจเฉ เจเจฟ เจนเฉ, bpf_get_smp_processor_id
เจเฉฑเจ เจซเฉฐเจเจธเจผเจจ เจชเฉเจเจเฉฐเจเจฐ เจนเฉ เจเจฟเจธเจฆเจพ เจฎเฉเฉฑเจฒ 8 เจนเฉ, เจเจฟเฉฑเจฅเฉ 8 เจฎเฉเฉฑเจฒ เจนเฉ BPF_FUNC_get_smp_processor_id
เจเจพเจเจช เจเจฐเฉ enum bpf_fun_id
, เจเฉ เจธเจพเจกเฉ เจฒเจ เจซเจพเจเจฒ เจตเจฟเฉฑเจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉ vmlinux.h
(เจซเจพเจเจฒ bpf_helper_defs.h
เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจเฉฑเจ เจธเจเฉเจฐเจฟเจชเจ เจฆเฉเจเจฐเจพ เจคเจฟเจเจฐ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจเจธเจฒเจ "เจฎเฉเจเจฟเจ" เจจเฉฐเจฌเจฐ เจ เฉเจ เจนเจจ)เฅค เจเจน เจซเฉฐเจเจธเจผเจจ เจเฉเจ เจเจฐเจเฉเจฎเฉเจเจ เจจเจนเฉเจ เจฒเฉเจเจฆเจพ เจ
เจคเฉ เจเจฟเจธเจฎ เจฆเจพ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจเจฐเจฆเจพ เจนเฉ __u32
. เจเจฆเฉเจ เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจเจชเจฃเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจเจฒเจพเจเจเจฆเฉ เจนเจพเจ, clang
เจเฉฑเจ เจนเจฆเจพเจเจค เจคเจฟเจเจฐ เจเจฐเจฆเจพ เจนเฉ BPF_CALL
"เจธเจนเฉ เจเจฟเจธเจฎ" เจเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจเจฐเฉเจ เจ
เจคเฉ เจญเจพเจ เจจเฉเฉฐ เจตเฉเจเฉเจ xdp/simple
:
$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
$ llvm-objdump -D --section=xdp/simple xdp-simple.bpf.o
xdp-simple.bpf.o: file format elf64-bpf
Disassembly of section xdp/simple:
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: bf 01 00 00 00 00 00 00 r1 = r0
2: 67 01 00 00 20 00 00 00 r1 <<= 32
3: 77 01 00 00 20 00 00 00 r1 >>= 32
4: b7 00 00 00 02 00 00 00 r0 = 2
5: 15 01 01 00 00 00 00 00 if r1 == 0 goto +1 <LBB0_2>
6: b7 00 00 00 01 00 00 00 r0 = 1
0000000000000038 <LBB0_2>:
7: 95 00 00 00 00 00 00 00 exit
เจชเจนเจฟเจฒเฉ เจฒเจพเจเจจ เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจจเจฟเจฐเจฆเฉเจธเจผ เจฆเฉเจเจฆเฉ เจนเจพเจ call
, เจชเฉเจฐเจพเจฎเฉเจเจฐ IMM
เจเฉ เจเจฟ 8 เจฆเฉ เจฌเจฐเจพเจฌเจฐ เจนเฉ, เจ
เจคเฉ SRC_REG
- เจเจผเฉเจฐเฉเฅค เจตเฉเจฐเฉเจซเจพเจเจฐ เจฆเฉเจเจฐเจพ เจตเจฐเจคเฉ เจเจ ABI เจธเจฎเจเฉเจคเฉ เจฆเฉ เจ
เจจเฉเจธเจพเจฐ, เจเจน เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจ เจจเฉฐเจฌเจฐ เจ
เฉฑเจ เจฒเจ เจเฉฑเจ เจเจพเจฒ เจนเฉเฅค เจเฉฑเจ เจตเจพเจฐ เจเจธเจจเฉเฉฐ เจฒเจพเจเจ เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ, เจคเจฐเจ เจธเจงเจพเจฐเจจ เจนเฉเฅค เจฐเจเจฟเจธเจเจฐ เจคเฉเจ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจเจฐเฉ r0
เจจเฉเฉฐ เจเจพเจชเฉ เจเฉเจคเจพ r1
เจ
เจคเฉ เจฒเจพเจเจจเจพเจ 2,3 โโ'เจคเฉ เจเจธ เจจเฉเฉฐ เจเจพเจเจช เจตเจฟเฉฑเจ เจฌเจฆเจฒเจฟเจ เจเจพเจเจฆเจพ เจนเฉ u32
- เจเฉฑเจชเจฐเจฒเฉ 32 เจฌเจฟเฉฑเจ เจธเจพเจซเจผ เจเฉเจคเฉ เจเจ เจนเจจเฅค เจฒเจพเจเจจเจพเจ 4,5,6,7 'เจคเฉ เจ
เจธเฉเจ 2 เจตเจพเจชเจธ เจเจฐเจฆเฉ เจนเจพเจ (XDP_PASS
) เจเจพเจ 1 (XDP_DROP
) เจเจธ เจเฉฑเจฒ 'เจคเฉ เจจเจฟเจฐเจญเจฐ เจเจฐเจฆเจพ เจนเฉ เจเจฟ เจเฉ เจฒเจพเจเจจ 0 เจคเฉเจ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจ เจจเฉ เจเจผเฉเจฐเฉ เจเจพเจ เจเฉเจฐ-เจเจผเฉเจฐเฉ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจเฉเจคเจพ เจนเฉเฅค
เจเจ เจเจชเจฃเฉ เจเจช เจฆเฉ เจเจพเจเจ เจเจฐเฉเจ: เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฒเฉเจก เจเจฐเฉ เจ
เจคเฉ เจเจเจเจชเฉเฉฑเจ เจจเฉเฉฐ เจฆเฉเจเฉ bpftool prog dump xlated
:
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
$ clang -O2 -g -I ./libbpf/src/root/usr/include/ -o xdp-simple xdp-simple.c ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo ./xdp-simple &
[2] 10914
$ sudo bpftool p | grep simple
523: xdp name simple tag 44c38a10c657e1b0 gpl
pids xdp-simple(10915)
$ sudo bpftool p d x id 523
int simple(void *ctx):
; if (bpf_get_smp_processor_id() != 0)
0: (85) call bpf_get_smp_processor_id#114128
1: (bf) r1 = r0
2: (67) r1 <<= 32
3: (77) r1 >>= 32
4: (b7) r0 = 2
; }
5: (15) if r1 == 0x0 goto pc+1
6: (b7) r0 = 1
7: (95) exit
เจ เฉเจ เจนเฉ, เจคเจธเจฆเฉเจเจเจฐเจคเจพ เจจเฉเฉฐ เจธเจนเฉ เจเจฐเจจเจฒ-เจธเจนเจพเจเจ เจฒเฉฑเจญเจฟเจ เจนเฉเฅค
เจเจฆเจพเจนเจฐเจจ: เจเจฐเจเฉเจฎเฉเจเจเจพเจ เจจเฉเฉฐ เจชเจพเจธ เจเจฐเจจเจพ เจ เจคเฉ เจ เฉฐเจค เจตเจฟเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจฒเจพเจเจฃเจพ!
เจธเจพเจฐเฉ เจฐเจจ-เจฒเฉเจตเจฒ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจเจพเจ เจฆเจพ เจเฉฑเจ เจชเฉเจฐเฉเจเฉเจเจพเจเจช เจนเฉเฉฐเจฆเจพ เจนเฉ
u64 fn(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5)
เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจเจพเจ เจฆเฉ เจฎเจพเจชเจฆเฉฐเจก เจฐเจเจฟเจธเจเจฐเจพเจ เจตเจฟเฉฑเจ เจชเจพเจธ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเจจ r1
-r5
, เจ
เจคเฉ เจฎเฉเฉฑเจฒ เจฐเจเจฟเจธเจเจฐ เจตเจฟเฉฑเจ เจตเจพเจชเจธ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ r0
. เจเฉฑเจฅเฉ เจเฉเจ เจซเฉฐเจเจธเจผเจจ เจจเจนเฉเจ เจนเจจ เจเฉ เจชเฉฐเจ เจคเฉเจ เจตเฉฑเจง เจเจฐเจเฉเจฎเฉเจเจ เจฒเฉเจเจฆเฉ เจนเจจ, เจ
เจคเฉ เจเจนเจจเจพเจ เจฒเจ เจธเจฎเจฐเจฅเจจ เจญเจตเจฟเฉฑเจ เจตเจฟเฉฑเจ เจเฉเฉเจจ เจฆเฉ เจเจฎเฉเจฆ เจจเจนเฉเจ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉเฅค
เจเจ เจจเจตเฉเจ เจเจฐเจจเจฒ เจธเจนเจพเจเจ เจคเฉ เจเฉฑเจ เจจเจเจผเจฐ เจฎเจพเจฐเฉเจ เจ
เจคเฉ BPF เจชเฉเจฐเจพเจฎเฉเจเจฐเจพเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจชเจพเจธ เจเจฐเจฆเจพ เจนเฉเฅค เจเจ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจเฉเจ xdp-simple.bpf.c
เจนเฉเจ เจฒเจฟเจเฉ เจ
เจจเฉเจธเจพเจฐ (เจฌเจพเจเฉ เจฒเจพเจเจจเจพเจ เจจเจนเฉเจ เจฌเจฆเจฒเฉเจเจ เจนเจจ):
SEC("xdp/simple")
int simple(void *ctx)
{
bpf_printk("running on CPU%un", bpf_get_smp_processor_id());
return XDP_PASS;
}
เจธเจพเจกเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ CPU เจฆเจพ เจจเฉฐเจฌเจฐ เจชเฉเจฐเจฟเฉฐเจ เจเจฐเจฆเจพ เจนเฉ เจเจฟเจธ 'เจคเฉ เจเจน เจเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉเฅค เจเจ เจเจธเจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจเจฐเฉเจ เจ เจคเฉ เจเฉเจก เจจเฉเฉฐ เจตเฉเจเฉเจ:
$ llvm-objdump -D --section=xdp/simple --no-show-raw-insn xdp-simple.bpf.o
0000000000000000 <simple>:
0: r1 = 10
1: *(u16 *)(r10 - 8) = r1
2: r1 = 8441246879787806319 ll
4: *(u64 *)(r10 - 16) = r1
5: r1 = 2334956330918245746 ll
7: *(u64 *)(r10 - 24) = r1
8: call 8
9: r1 = r10
10: r1 += -24
11: r2 = 18
12: r3 = r0
13: call 6
14: r0 = 2
15: exit
เจฒเจพเจเจจเจพเจ 0-7 เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจธเจคเจฐ เจฒเจฟเจเจฆเฉ เจนเจพเจ running on CPU%un
, เจ
เจคเฉ เจซเจฟเจฐ เจฒเจพเจเจจ 8 'เจคเฉ เจ
เจธเฉเจ เจเจพเจฃเฉ-เจชเจเจพเจฃเฉ เจจเฉเฉฐ เจเจฒเจพเจเจเจฆเฉ เจนเจพเจ bpf_get_smp_processor_id
. เจฒเจพเจเจจเจพเจ 9-12 'เจคเฉ เจ
เจธเฉเจ เจธเจนเจพเจเจ เจเจฐเจเฉเจฎเฉเจเจ เจคเจฟเจเจฐ เจเจฐเจฆเฉ เจนเจพเจ bpf_printk
- เจฐเจเจฟเจธเจเจฐ r1
, r2
, r3
. เจเจจเฉเจนเจพเจ เจตเจฟเฉฑเจเฉเจ เจคเจฟเฉฐเจจ เจเจฟเจเจ เจนเจจ เจ
เจคเฉ เจฆเฉ เจจเจนเฉเจ? เจเจฟเจเจเจเจฟ bpf_printk
- bpf_trace_printk
, เจเจฟเจธ เจจเฉเฉฐ เจซเจพเจฐเจฎเฉเจ เจธเจคเจฐ เจฆเฉ เจเจเจพเจฐ เจจเฉเฉฐ เจชเจพเจธ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค
เจเจฒเฉ เจนเฉเจฃ เจเจธ เจตเจฟเฉฑเจ เจเฉเจ เจฒเจพเจเจจเจพเจ เจเฉเฉเจฆเฉ เจนเจพเจ xdp-simple.c
เจคเจพเจ เจเฉ เจธเจพเจกเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเฉฐเจเจฐเจซเฉเจธ เจจเจพเจฒ เจเฉเฉ เจเจพเจตเฉ lo
เจ
เจคเฉ เจ
เจธเจฒ เจตเจฟเฉฑเจ เจธเจผเฉเจฐเฉ เจเฉเจคเจพ!
$ cat xdp-simple.c
#include <linux/if_link.h>
#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"
int main(int argc, char **argv)
{
__u32 flags = XDP_FLAGS_SKB_MODE;
struct xdp_simple_bpf *obj;
obj = xdp_simple_bpf__open_and_load();
if (!obj)
err(1, "failed to open and/or load BPF objectn");
bpf_set_link_xdp_fd(1, -1, flags);
bpf_set_link_xdp_fd(1, bpf_program__fd(obj->progs.simple), flags);
cleanup:
xdp_simple_bpf__destroy(obj);
}
เจเฉฑเจฅเฉ เจ
เจธเฉเจ เจซเฉฐเจเจธเจผเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ bpf_set_link_xdp_fd
, เจเฉ เจเจฟ XDP-เจเจฟเจธเจฎ เจฆเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจจเฉเฉฑเจเจตเจฐเจ เจเฉฐเจเจฐเจซเฉเจธเจพเจ เจจเจพเจฒ เจเฉเฉเจฆเจพ เจนเฉเฅค เจ
เจธเฉเจ เจเฉฐเจเจฐเจซเฉเจธ เจจเฉฐเจฌเจฐ เจจเฉเฉฐ เจนเจพเจฐเจกเจเฉเจก เจเฉเจคเจพ เจนเฉ lo
, เจเฉ เจเจฟ เจนเจฎเฉเจธเจผเจพ 1 เจนเฉเฉฐเจฆเจพ เจนเฉเฅค เจ
เจธเฉเจ เจชเฉเจฐเจพเจฃเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจ
เจเฉเจ เจเจฐเจจ เจฒเจ เจฆเฉ เจตเจพเจฐ เจซเฉฐเจเจธเจผเจจ เจเจฒเจพเจเจเจฆเฉ เจนเจพเจ เจเฉเจเจฐ เจเจน เจเฉเฉเจฟเจ เจนเฉเจเจ เจธเฉเฅค เจงเจฟเจเจจ เจฆเจฟเจ เจเจฟ เจนเฉเจฃ เจธเจพเจจเฉเฉฐ เจเจฟเจธเฉ เจเฉเจฃเฉเจคเฉ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉ pause
เจเจพเจ เจเฉฑเจ เจ
เจจเฉฐเจค เจฒเฉเจช: เจธเจพเจกเจพ เจฒเฉเจกเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฌเฉฐเจฆ เจนเฉ เจเจพเจตเฉเจเจพ, เจชเจฐ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจคเจฎ เจจเจนเฉเจ เจเฉเจคเจพ เจเจพเจตเฉเจเจพ เจเจฟเจเจเจเจฟ เจเจน เจเจเจจเจพ เจธเจฐเฉเจค เจจเจพเจฒ เจเฉเฉเจฟเจ เจนเฉเจเจ เจนเฉเฅค เจธเจซเจฒ เจกเจพเจเจจเจฒเฉเจก เจ
เจคเฉ เจเฉเจจเฉเจเจธเจผเจจ เจคเฉเจ เจฌเจพเจ
เจฆ, เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจเจฃ เจตเจพเจฒเฉ เจนเจฐเฉเจ เจจเฉเจเจตเจฐเจ เจชเฉเจเฉเจ เจฒเจ เจฒเจพเจเจ เจเฉเจคเจพ เจเจพเจตเฉเจเจพ lo
.
เจเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจกเจพเจเจจเจฒเฉเจก เจเจฐเฉเจ เจ
เจคเฉ เจเฉฐเจเจฐเจซเฉเจธ เจจเฉเฉฐ เจตเฉเจเฉเจ lo
:
$ sudo ./xdp-simple
$ sudo bpftool p | grep simple
669: xdp name simple tag 4fca62e77ccb43d6 gpl
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 669
เจธเจพเจกเฉ เจฆเฉเจเจฐเจพ เจกเจพเจเจจเจฒเฉเจก เจเฉเจคเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ ID 669 เจนเฉ เจ
เจคเฉ เจ
เจธเฉเจ เจเฉฐเจเจฐเจซเฉเจธ 'เจคเฉ เจเจนเฉ ID เจฆเฉเจเจฆเฉ เจนเจพเจ lo
. เจ
เจธเฉเจ เจจเฉเฉฐ เจเฉเจ เจชเฉเจเฉเจ เจญเฉเจเจพเจเจเฉ 127.0.0.1
(เจฌเฉเจจเจคเฉ + เจเจตเจพเจฌ):
$ ping -c1 localhost
เจ
เจคเฉ เจนเฉเจฃ เจเจ เจกเฉเจฌเฉฑเจ เจตเจฐเจเฉเจ
เจฒ เจซเจพเจเจฒ เจฆเฉ เจธเจฎเฉฑเจเจฐเฉ เจจเฉเฉฐ เจตเฉเจเฉเจ /sys/kernel/debug/tracing/trace_pipe
, เจเจฟเจธ เจตเจฟเฉฑเจ bpf_printk
เจเจชเจฃเฉ เจธเฉฐเจฆเฉเจธเจผ เจฒเจฟเจเจฆเจพ เจนเฉ:
# cat /sys/kernel/debug/tracing/trace_pipe
ping-13937 [000] d.s1 442015.377014: bpf_trace_printk: running on CPU0
ping-13937 [000] d.s1 442015.377027: bpf_trace_printk: running on CPU0
'เจคเฉ เจฆเฉ เจชเฉเจเฉเจ เจฆเฉเจเฉ เจเจ lo
เจ
เจคเฉ CPU0 'เจคเฉ เจธเฉฐเจธเจพเจงเจฟเจค เจเฉเจคเจพ เจเจฟเจ - เจธเจพเจกเฉ เจชเจนเจฟเจฒเฉ เจชเฉเจฐเฉ เจ
เจฐเจฅเจนเฉเจฃ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉ เจเฉฐเจฎ เจเฉเจคเจพ!
เจเจน เจงเจฟเจเจจ เจฆเฉเจฃ เจฏเฉเจ เจนเฉ bpf_printk
เจเจน เจเฉเจ เจตเฉ เจจเจนเฉเจ เจนเฉ เจเจฟ เจเจน เจกเฉเจฌเฉฑเจ เจซเจพเจเจฒ เจจเฉเฉฐ เจฒเจฟเจเจฆเจพ เจนเฉ: เจเจน เจเจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจ เจตเจฐเจคเฉเจ เจฒเจ เจธเจญ เจคเฉเจ เจธเจซเจฒ เจธเจนเจพเจเจ เจจเจนเฉเจ เจนเฉ, เจชเจฐ เจธเจพเจกเจพ เจเฉเจเจพ เจเฉเจ เจธเจงเจพเจฐเจจ เจฆเจฟเจเจพเจเจฃเจพ เจธเฉเฅค
BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจคเฉเจ เจจเจเจธเจผเจฟเจเจ เจคเฉฑเจ เจชเจนเฉเฉฐเจเจฃเจพ
เจเจฆเจพเจนเจฐเจจ: BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจคเฉเจ เจจเจเจธเจผเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ
เจชเจฟเจเจฒเฉ เจญเจพเจเจพเจ เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจธเจฟเฉฑเจเจฟเจ เจเจฟ เจฏเฉเจเจผเจฐ เจธเจชเฉเจธ เจคเฉเจ เจฎเฉเจช เจเจฟเจตเฉเจ เจฌเจฃเจพเจเจฃเจพ เจ
เจคเฉ เจตเจฐเจคเจฃเจพ เจนเฉ, เจ
เจคเฉ เจนเฉเจฃ เจเจฐเจจเจฒ เจญเจพเจ เจจเฉเฉฐ เจตเฉเจเจฆเฉ เจนเจพเจเฅค เจเจฒเฉ, เจเจฎ เจตเจพเจเจ, เจเฉฑเจ เจเจฆเจพเจนเจฐเจฃ เจฆเฉ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจเจฐเฉเจเฅค เจเจ เจเจชเจฃเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจเจฆเฉ เจนเจพเจ xdp-simple.bpf.c
เจนเฉเจ เจฒเจฟเจเฉ เจ
เจจเฉเจธเจพเจฐ:
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__uint(max_entries, 8);
__type(key, u32);
__type(value, u64);
} woo SEC(".maps");
SEC("xdp/simple")
int simple(void *ctx)
{
u32 key = bpf_get_smp_processor_id();
u32 *val;
val = bpf_map_lookup_elem(&woo, &key);
if (!val)
return XDP_ABORTED;
*val += 1;
return XDP_PASS;
}
char LICENSE[] SEC("license") = "GPL";
เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจธเจผเฉเจฐเฉเจเจค เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจเฉฑเจ เจจเจเจธเจผเฉ เจฆเฉ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจเฉเฉเฉ woo
: เจเจน เจเฉฑเจ 8-เจเจฒเฉเจฎเฉเจเจ เจเจฐเฉ เจนเฉ เจเฉ เจเจฟ เจฎเฉเฉฑเจฒเจพเจ เจจเฉเฉฐ เจธเจเฉเจฐ เจเจฐเจฆเจพ เจนเฉ u64
(C เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจ
เจเจฟเจนเฉ เจเจฐเฉ เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเจพเจเจเฉ เจเจฟเจตเฉเจ เจเจฟ u64 woo[8]
). เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ "xdp/simple"
เจ
เจธเฉเจ เจฎเฉเจเฉเจฆเจพ เจชเฉเจฐเฉเจธเฉเจธเจฐ เจจเฉฐเจฌเจฐ เจจเฉเฉฐ เจเฉฑเจ เจตเฉเจฐเฉเจเจฌเจฒ เจตเจฟเฉฑเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจฆเฉ เจนเจพเจ key
เจ
เจคเฉ เจซเจฟเจฐ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ bpf_map_lookup_element
เจธเจพเจจเฉเฉฐ เจเจฐเฉ เจตเจฟเฉฑเจ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจเจเจเจฐเฉ เจฒเจ เจเฉฑเจ เจชเฉเจเจเฉฐเจเจฐ เจฎเจฟเจฒเจฆเจพ เจนเฉ, เจเจฟเจธเจจเฉเฉฐ เจ
เจธเฉเจ เจเฉฑเจ เจจเจพเจฒ เจตเจงเจพเจเจเจฆเฉ เจนเจพเจเฅค เจฐเฉเจธเฉ เจตเจฟเฉฑเจ เจ
เจจเฉเจตเจพเจฆ เจเฉเจคเจพ เจเจฟเจ: เจ
เจธเฉเจ เจเจนเจจเจพเจ เจ
เฉฐเจเฉเจฟเจเจ เจฆเฉ เจเจฃเจจเจพ เจเจฐเจฆเฉ เจนเจพเจ เจเจฟเจจเฉเจนเจพเจ 'เจคเฉ CPU เจจเฉ เจเจเจฃ เจตเจพเจฒเฉ เจชเฉเจเฉเจเจพเจ เจฆเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจเฉเจคเฉ เจนเฉเฅค เจเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจ:
$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
$ clang -O2 -g -I ./libbpf/src/root/usr/include/ -o xdp-simple xdp-simple.c ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo ./xdp-simple
เจเจ เจเจพเจเจ เจเจฐเฉเจ เจเจฟ เจเจน เจเจธ เจจเจพเจฒ เจเฉเฉเฉ เจนเฉเจ เจนเฉ lo
เจ
เจคเฉ เจเฉเจ เจชเฉเจเฉเจ เจญเฉเจเฉ:
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 108
$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done
เจเจ เจนเฉเจฃ เจเจฐเฉ เจฆเฉ เจธเจฎเฉฑเจเจฐเฉ เจจเฉเฉฐ เจตเฉเจเฉเจ:
$ sudo bpftool map dump name woo
[
{ "key": 0, "value": 0 },
{ "key": 1, "value": 400 },
{ "key": 2, "value": 0 },
{ "key": 3, "value": 0 },
{ "key": 4, "value": 0 },
{ "key": 5, "value": 0 },
{ "key": 6, "value": 0 },
{ "key": 7, "value": 46400 }
]
เจฒเจเจญเจ เจธเจพเจฐเฉเจเจ เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ CPU7 'เจคเฉ เจธเฉฐเจธเจพเจงเจฟเจค เจเฉเจคเฉเจเจ เจเจเจเจ เจธเจจเฅค เจเจน เจธเจพเจกเฉ เจฒเจ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจจเจนเฉเจ เจนเฉ, เจฎเฉเฉฑเจ เจเฉฑเจฒ เจเจน เจนเฉ เจเจฟ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ เจ
เจคเฉ เจ
เจธเฉเจ เจธเจฎเจเจฆเฉ เจนเจพเจ เจเจฟ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจคเฉเจ เจจเจเจธเจผเจฟเจเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจเจเจธเฉเจธ เจเจฐเจจเจพ เจนเฉ - เจตเจฐเจคเจฆเฉ เจนเฉเจ ั
ะตะปะฟะตัะพะฒ bpf_mp_*
เจฐเจนเฉฑเจธเจฎเจ เจธเฉเจเจเจพเจเจ
เจเจธ เจฒเจ, เจ เจธเฉเจ เจเจพเจฒเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจฌเฉเจชเฉเจเจซ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจคเฉเจ เจจเจเจธเจผเฉ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ
val = bpf_map_lookup_elem(&woo, &key);
เจเจฟเฉฑเจฅเฉ เจธเจนเจพเจเจ เจซเฉฐเจเจธเจผเจจ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ
void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)
เจชเจฐ เจ
เจธเฉเจ เจเฉฑเจ เจชเฉเจเจเฉฐเจเจฐ เจชเจพเจธ เจเจฐ เจฐเจนเฉ เจนเจพเจ &woo
เจเฉฑเจ เจฌเฉเจจเจพเจฎ เจขเจพเจเจเฉ เจจเฉเฉฐ struct { ... }
...
เจเฉ เจ
เจธเฉเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจ
เจธเฉเจเจฌเจฒเจฐ เจจเฉเฉฐ เจตเฉเจเจฆเฉ เจนเจพเจ, เจคเจพเจ เจ
เจธเฉเจ เจฆเฉเจเจฆเฉ เจนเจพเจ เจเจฟ เจฎเฉเฉฑเจฒ &woo
เจ
เจธเจฒ เจตเจฟเฉฑเจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจจเจนเฉเจ เจนเฉ (เจฒเจพเจเจจ 4):
llvm-objdump -D --section xdp/simple xdp-simple.bpf.o
xdp-simple.bpf.o: file format elf64-bpf
Disassembly of section xdp/simple:
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
2: bf a2 00 00 00 00 00 00 r2 = r10
3: 07 02 00 00 fc ff ff ff r2 += -4
4: 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
6: 85 00 00 00 01 00 00 00 call 1
...
เจ เจคเฉ เจชเฉเจจเจฐ-เจธเจฅเจพเจจ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจนเฉ:
$ llvm-readelf -r xdp-simple.bpf.o | head -4
Relocation section '.relxdp/simple' at offset 0xe18 contains 1 entries:
Offset Info Type Symbol's Value Symbol's Name
0000000000000020 0000002700000001 R_BPF_64_64 0000000000000000 woo
เจชเจฐ เจเฉ เจ เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจคเฉเจ เจฒเฉเจก เจเฉเจคเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจตเฉเจเจฆเฉ เจนเจพเจ, เจคเจพเจ เจ เจธเฉเจ เจธเจนเฉ เจจเจเจธเจผเฉ (เจฒเจพเจเจจ 4) เจฒเจ เจเฉฑเจ เจชเฉเจเจเฉฐเจเจฐ เจฆเฉเจเจฆเฉ เจนเจพเจ:
$ sudo bpftool prog dump x name simple
int simple(void *ctx):
0: (85) call bpf_get_smp_processor_id#114128
1: (63) *(u32 *)(r10 -4) = r0
2: (bf) r2 = r10
3: (07) r2 += -4
4: (18) r1 = map[id:64]
...
เจเจธ เจคเจฐเฉเจนเจพเจ, เจ
เจธเฉเจ เจเจน เจธเจฟเฉฑเจเจพ เจเฉฑเจข เจธเจเจฆเฉ เจนเจพเจ เจเจฟ เจธเจพเจกเฉ เจฒเฉเจกเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจธเจผเฉเจฐเฉ เจเจฐเจจ เจฆเฉ เจธเจฎเฉเจ, เจฒเจฟเฉฐเจ &woo
เจเฉฑเจ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจจเจพเจฒ เจเจฟเจธเฉ เจเฉเจเจผ เจฆเฉเจเจฐเจพ เจคเจฌเจฆเฉเจฒ เจเฉเจคเจพ เจเจฟเจ เจธเฉ libbpf
. เจชเจนเจฟเจฒเจพเจ เจ
เจธเฉเจ เจเจเจเจชเฉเฉฑเจ เจจเฉเฉฐ เจตเฉเจเจพเจเจเฉ strace
:
$ sudo strace -e bpf ./xdp-simple
...
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, key_size=4, value_size=8, max_entries=8, map_name="woo", ...}, 120) = 4
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, prog_name="simple", ...}, 120) = 5
เจ
เจธเฉเจ เจเจน เจฆเฉเจเจฆเฉ เจนเจพเจ libbpf
เจเฉฑเจ เจจเจเจธเจผเจพ เจฌเจฃเจพเจเจ woo
เจ
เจคเฉ เจซเจฟเจฐ เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจกเจพเจเจจเจฒเฉเจก เจเฉเจคเจพ simple
. เจเจ เจเจธ เจเฉฑเจฒ 'เจคเฉ เจกเฉเฉฐเจเจพเจ เจจเจพเจฒ เจตเจฟเจเจพเจฐ เจเจฐเฉเจ เจเจฟ เจ
เจธเฉเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจฒเฉเจก เจเจฐเจฆเฉ เจนเจพเจ:
- เจเจพเจฒ เจเจฐเฉ
xdp_simple_bpf__open_and_load
เจซเจพเจเจฒ เจคเฉเจxdp-simple.skel.h
- เจเจฟเจธ เจฆเจพ เจเจพเจฐเจจ เจฌเจฃเจฆเจพ เจนเฉ
xdp_simple_bpf__load
เจซเจพเจเจฒ เจคเฉเจxdp-simple.skel.h
- เจเจฟเจธ เจฆเจพ เจเจพเจฐเจจ เจฌเจฃเจฆเจพ เจนเฉ
bpf_object__load_skeleton
เจซเจพเจเจฒ เจคเฉเจlibbpf/src/libbpf.c
- เจเจฟเจธ เจฆเจพ เจเจพเจฐเจจ เจฌเจฃเจฆเจพ เจนเฉ
bpf_object__load_xattr
เจคเฉฑเจlibbpf/src/libbpf.c
เจเจเจฐเฉ เจซเฉฐเจเจธเจผเจจ, เจนเฉเจฐ เจเฉเจเจผเจพเจ เจฆเฉ เจจเจพเจฒ, เจเจพเจฒ เจเจฐเฉเจเจพ bpf_object__create_maps
, เจเฉ เจฎเฉเจเฉเจฆเจพ เจจเจเจธเจผเฉ เจฌเจฃเจพเจเจเจฆเจพ เจเจพเจ เจเฉเจฒเฉเจนเจฆเจพ เจนเฉ, เจเจนเจจเจพเจ เจจเฉเฉฐ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐเจพเจ เจตเจฟเฉฑเจ เจฌเจฆเจฒเจฆเจพ เจนเฉเฅค (เจเจน เจเจน เจฅเจพเจ เจนเฉ เจเจฟเฉฑเจฅเฉ เจ
เจธเฉเจ เจฆเฉเจเจฆเฉ เจนเจพเจ BPF_MAP_CREATE
เจเจเจเจชเฉเฉฑเจ เจตเจฟเฉฑเจ strace
.) เจ
เฉฑเจเฉ เจซเฉฐเจเจธเจผเจจ เจจเฉเฉฐ เจฌเฉเจฒเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ bpf_object__relocate
เจ
เจคเฉ เจเจน เจเจน เจนเฉ เจเฉ เจธเจพเจกเฉ เจฆเจฟเจฒเจเจธเจชเฉ เจฐเฉฑเจเจฆเฉ เจนเฉ, เจเจฟเจเจเจเจฟ เจธเจพเจจเฉเฉฐ เจฏเจพเจฆ เจนเฉ เจเจฟ เจ
เจธเฉเจ เจเฉ เจฆเฉเจเจฟเจ เจนเฉ woo
เจฐเฉเจฒเฉเจเฉเจธเจผเจจ เจเฉเจฌเจฒ เจตเจฟเฉฑเจ. เจเจธเจฆเฉ เจชเฉเจเฉเจฒ เจเจฐเจฆเฉ เจนเฉเจ, เจ
เจธเฉเจ เจ
เฉฐเจค เจตเจฟเฉฑเจ เจเจชเจฃเฉ เจเจช เจจเฉเฉฐ เจซเฉฐเจเจธเจผเจจ เจตเจฟเฉฑเจ เจฒเฉฑเจญ เจฒเฉเจเจฆเฉ เจนเจพเจ bpf_program__relocate
, เจเฉ
case RELO_LD64:
insn[0].src_reg = BPF_PSEUDO_MAP_FD;
insn[0].imm = obj->maps[relo->map_idx].fd;
break;
เจเจธ เจฒเจ เจ เจธเฉเจ เจเจชเจฃเฉเจเจ เจนเจฆเจพเจเจคเจพเจ เจฒเฉเจเจฆเฉ เจนเจพเจ
18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
เจ
เจคเฉ เจเจธ เจตเจฟเฉฑเจ เจธเจฐเฉเจค เจฐเจเจฟเจธเจเจฐ เจจเฉเฉฐ เจจเจพเจฒ เจฌเจฆเจฒเฉ BPF_PSEUDO_MAP_FD
, เจ
เจคเฉ เจธเจพเจกเฉ เจจเจเจธเจผเฉ เจฆเฉ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจฆเจพ เจชเจนเจฟเจฒเจพ IMM เจ
เจคเฉ, เจเฉเจเจฐ เจเจน เจฌเจฐเจพเจฌเจฐ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, 0xdeadbeef
, เจซเจฟเจฐ เจจเจคเฉเจเฉ เจตเจเฉเจ เจ
เจธเฉเจ เจจเจฟเจฐเจฆเฉเจธเจผ เจชเฉเจฐเจพเจชเจค เจเจฐเจพเจเจเฉ
18 11 00 00 ef eb ad de 00 00 00 00 00 00 00 00 r1 = 0 ll
เจเจธ เจคเจฐเฉเจนเจพเจ เจฎเฉเจช เจเจพเจฃเจเจพเจฐเฉ เจจเฉเฉฐ เจเฉฑเจ เจเจพเจธ เจฒเฉเจก เจเฉเจคเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจเฉเจฐเจพเจเจธเจซเจฐ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅค เจเจธ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ, เจจเจเจธเจผเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจฌเจฃเจพเจเจ เจเจพ เจธเจเจฆเจพ เจนเฉ BPF_MAP_CREATE
, เจ
เจคเฉ ID เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเฉเจฒเฉเจนเจฟเจ เจเจฟเจ BPF_MAP_GET_FD_BY_ID
.
เจเฉเฉฑเจฒ, เจตเจฐเจคเจฃ เจตเฉเจฒเฉ libbpf
เจเจฒเจเฉเจฐเจฟเจฆเจฎ เจนเฉเจ เจฒเจฟเจเฉ เจ
เจจเฉเจธเจพเจฐ เจนเฉ:
- เจธเฉฐเจเจฒเจจ เจฆเฉ เจฆเฉเจฐเจพเจจ, เจจเจเจธเจผเจฟเจเจ เจฆเฉ เจฒเจฟเฉฐเจเจพเจ เจฒเจ เจฐเฉเจฒเฉเจเฉเจธเจผเจจ เจเฉเจฌเจฒ เจตเจฟเฉฑเจ เจฐเจฟเจเจพเจฐเจก เจฌเจฃเจพเจ เจเจพเจเจฆเฉ เจนเจจ
libbpf
ELF เจเจฌเจเฉเจเจ เจฌเฉเฉฑเจ เจเฉเจฒเฉเจนเจฆเจพ เจนเฉ, เจธเจพเจฐเฉ เจตเจฐเจคเฉ เจเจ เจจเจเจธเจผเฉ เจฒเฉฑเจญเจฆเจพ เจนเฉ เจ เจคเฉ เจเจนเจจเจพเจ เจฒเจ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจฌเจฃเจพเจเจเจฆเจพ เจนเฉ- เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐเจพเจ เจจเฉเฉฐ เจนเจฆเจพเจเจค เจฆเฉ เจนเจฟเฉฑเจธเฉ เจตเจเฉเจ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจฒเฉเจก เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ
LD64
เจเจฟเจตเฉเจ เจเจฟ เจคเฉเจธเฉเจ เจเจฒเจชเจจเจพ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเฉฑเจฅเฉ เจนเฉเจฐ เจฌเจนเฉเจค เจเฉเจ เจเจเจฃเจพ เจนเฉ เจ
เจคเฉ เจธเจพเจจเฉเฉฐ เจเฉเจฐ เจตเจฟเฉฑเจ เจตเฉเจเจฃเจพ เจชเจเจเจพ. เจเฉเจธเจผเจเจฟเจธเจฎเจคเฉ เจจเจพเจฒ, เจธเจพเจกเฉ เจเฉเจฒ เจเฉฑเจ เจธเฉเจฐเจพเจ เจนเฉ - เจ
เจธเฉเจ เจ
เจฐเจฅ เจฒเจฟเจ เจฒเจฟเจ เจนเฉ BPF_PSEUDO_MAP_FD
เจธเจฐเฉเจค เจฐเจเจฟเจธเจเจฐ เจตเจฟเฉฑเจ เจ
เจคเฉ เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจฆเจซเจจ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ, เจเฉ เจธเจพเจจเฉเฉฐ เจธเจพเจฐเฉ เจธเฉฐเจคเจพเจ เจฆเฉ เจชเจตเจฟเฉฑเจคเจฐเจคเจพ เจตเฉฑเจฒ เจฒเฉ เจเจพเจตเฉเจเจพ - kernel/bpf/verifier.c
, เจเจฟเฉฑเจฅเฉ เจเฉฑเจ เจตเจฟเจธเจผเฉเจธเจผ เจจเจพเจฎ เจตเจพเจฒเจพ เจเฉฑเจ เจซเฉฐเจเจธเจผเจจ เจเฉฑเจ เจเจฟเจธเจฎ เจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจชเจคเฉ เจจเจพเจฒ เจเฉฑเจ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจจเฉเฉฐ เจฌเจฆเจฒเจฆเจพ เจนเฉ struct bpf_map
:
static int replace_map_fd_with_map_ptr(struct bpf_verifier_env *env) {
...
f = fdget(insn[0].imm);
map = __bpf_map_get(f);
if (insn->src_reg == BPF_PSEUDO_MAP_FD) {
addr = (unsigned long)map;
}
insn[0].imm = (u32)addr;
insn[1].imm = addr >> 32;
(เจชเฉเจฐเจพ เจเฉเจก เจฒเฉฑเจญเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉ
- เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฒเฉเจก เจเจฐเจฆเฉ เจธเจฎเฉเจ, เจตเฉเจฐเฉเจซเจพเจเจฐ เจจเจเจธเจผเฉ เจฆเฉ เจธเจนเฉ เจตเจฐเจคเฉเจ เจฆเฉ เจเจพเจเจ เจเจฐเจฆเจพ เจนเฉ เจ
เจคเฉ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจขเจพเจเจเฉ เจฆเจพ เจชเจคเจพ เจฒเจฟเจเจฆเจพ เจนเฉ
struct bpf_map
เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ ELF เจฌเจพเจเจจเจฐเฉ เจจเฉเฉฐ เจกเจพเจเจจเจฒเฉเจก เจเจฐเจฆเฉ เจธเจฎเฉเจ libbpf
เจเฉฑเจฅเฉ เจฌเจนเฉเจค เจเฉเจ เจเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉ, เจชเจฐ เจ
เจธเฉเจ เจเจธ เจฌเจพเจฐเฉ เจนเฉเจฐ เจฒเฉเจเจพเจ เจตเจฟเฉฑเจ เจเจฐเจเจพ เจเจฐเจพเจเจเฉเฅค
libbpf เจคเฉเจ เจฌเจฟเจจเจพเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจ เจคเฉ เจจเจเจธเจผเฉ เจฒเฉเจก เจเฉเจคเฉ เจเจพ เจฐเจนเฉ เจนเจจ
เจเจฟเจตเฉเจ เจตเจพเจ
เจฆเจพ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจเฉฑเจฅเฉ เจเจนเจจเจพเจ เจชเจพเจ เจเจพเจ เจฒเจ เจเฉฑเจ เจเจฆเจพเจนเจฐเจจ เจนเฉ เจเฉ เจเจน เจเจพเจฃเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจจ เจเจฟ เจฌเจฟเจจเจพเจ เจฎเจฆเจฆ เจฆเฉ เจจเจเจธเจผเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจตเจพเจฒเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจฌเจฃเจพเจเจฃเจพ เจ
เจคเฉ เจฒเฉเจก เจเจฐเจจเจพ เจนเฉเฅค libbpf
. เจเจน เจเจฆเฉเจ เจฒเจพเจญเจฆเจพเจเจ เจนเฉ เจธเจเจฆเจพ เจนเฉ เจเจฆเฉเจ เจคเฉเจธเฉเจ เจ
เจเจฟเจนเฉ เจฎเจพเจนเฉเจฒ เจตเจฟเฉฑเจ เจเฉฐเจฎ เจเจฐ เจฐเจนเฉ เจนเฉ เจเจฟเจธ เจฒเจ เจคเฉเจธเฉเจ เจจเจฟเจฐเจญเจฐเจคเจพ เจจเจนเฉเจ เจฌเจฃเจพ เจธเจเจฆเฉ เจนเฉ, เจเจพเจ เจนเจฐ เจเฉฑเจ เจฌเจฟเฉฑเจ เจฆเฉ เจฌเจเจค เจจเจนเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเจพเจ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเจฟเจ เจธเจเจฆเฉ เจนเฉ เจเจฟเจตเฉเจ เจเจฟ ply
เจคเจฐเจ เจฆเฉ เจชเจพเจฒเจฃเจพ เจเจฐเจจเจพ เจเจธเจพเจจ เจฌเจฃเจพเจเจฃ เจฒเจ, เจ
เจธเฉเจ เจเจนเจจเจพเจ เจเจฆเฉเจธเจผเจพเจ เจฒเจ เจเจชเจฃเฉ เจเจฆเจพเจนเจฐเจฃ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจเจพเจเจเฉ xdp-simple
. เจเจธ เจเจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจ เจตเจฟเจเจพเจฐเฉ เจเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเจพ เจชเฉเจฐเจพ เจ
เจคเฉ เจฅเฉเฉเฉเจนเจพ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจเฉเจก เจเจธ เจตเจฟเฉฑเจ เจชเจพเจเจ เจเจพ เจธเจเจฆเจพ เจนเฉ
เจธเจพเจกเฉ เจ เจฐเจเจผเฉ เจฆเจพ เจคเจฐเจ เจนเฉเจ เจฒเจฟเจเฉ เจ เจจเฉเจธเจพเจฐ เจนเฉ:
- เจเฉฑเจ เจเจฟเจธเจฎ เจฆเจพ เจจเจเจธเจผเจพ เจฌเจฃเจพเจ
BPF_MAP_TYPE_ARRAY
เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจBPF_MAP_CREATE
, - เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฌเจฃเจพเจ เจเฉ เจเจธ เจจเจเจธเจผเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเจพ เจนเฉ,
- เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเฉฐเจเจฐเจซเฉเจธ เจจเจพเจฒ เจเจจเฉเจเจ เจเจฐเฉ
lo
,
เจเฉ เจฎเจจเฉเฉฑเจ เจตเจฟเฉฑเจ เจ เจจเฉเจตเจพเจฆ เจเจฐเจฆเจพ เจนเฉ
int main(void)
{
int map_fd, prog_fd;
map_fd = map_create();
if (map_fd < 0)
err(1, "bpf: BPF_MAP_CREATE");
prog_fd = prog_load(map_fd);
if (prog_fd < 0)
err(1, "bpf: BPF_PROG_LOAD");
xdp_attach(1, prog_fd);
}
เจเจน เจเจธ เจฒเจ เจนเฉ map_create
เจเฉฑเจ เจจเจเจธเจผเจพ เจเจธเฉ เจคเจฐเฉเจนเจพเจ เจฌเจฃเจพเจเจเจฆเจพ เจนเฉ เจเจฟเจตเฉเจ เจ
เจธเฉเจ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฌเจพเจฐเฉ เจชเจนเจฟเจฒเฉ เจเจฆเจพเจนเจฐเจฃ เจตเจฟเฉฑเจ เจเฉเจคเจพ เจธเฉ bpf
- โเจเจฐเจจเจฒ, เจเจฟเจฐเจชเจพ เจเจฐเจเฉ เจฎเฉเจจเฉเฉฐ 8 เจคเฉฑเจคเจพเจ เจฆเฉ เจเฉฑเจ เจเจฐเฉ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจเฉฑเจ เจจเจตเจพเจ เจจเจเจธเจผเจพ เจฌเจฃเจพเจ __u64
เจ
เจคเฉ เจฎเฉเจจเฉเฉฐ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจตเจพเจชเจธ เจฆเจฟเจ":
static int map_create()
{
union bpf_attr attr;
memset(&attr, 0, sizeof(attr));
attr.map_type = BPF_MAP_TYPE_ARRAY,
attr.key_size = sizeof(__u32),
attr.value_size = sizeof(__u64),
attr.max_entries = 8,
strncpy(attr.map_name, "woo", sizeof(attr.map_name));
return syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
}
เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจฒเฉเจก เจเจฐเจจเจพ เจตเฉ เจเจธเจพเจจ เจนเฉ:
static int prog_load(int map_fd)
{
union bpf_attr attr;
struct bpf_insn insns[] = {
...
};
memset(&attr, 0, sizeof(attr));
attr.prog_type = BPF_PROG_TYPE_XDP;
attr.insns = ptr_to_u64(insns);
attr.insn_cnt = sizeof(insns)/sizeof(insns[0]);
attr.license = ptr_to_u64("GPL");
strncpy(attr.prog_name, "woo", sizeof(attr.prog_name));
return syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
}
เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจนเจฟเฉฑเจธเจพ prog_load
เจธเจพเจกเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจฌเจฃเจคเจฐเจพเจ เจฆเฉ เจเฉฑเจ เจฒเฉเฉ เจตเจเฉเจ เจนเฉ struct bpf_insn insns[]
. เจชเจฐ เจเจฟเจเจเจเจฟ เจ
เจธเฉเจ เจเฉฑเจ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจฐเจนเฉ เจนเจพเจ เจเฉ เจธเจพเจกเฉ เจเฉเจฒ C เจตเจฟเฉฑเจ เจนเฉ, เจ
เจธเฉเจ เจฅเฉเฉเจพ เจเจฟเจนเจพ เจงเฉเจเจพ เจฆเฉ เจธเจเจฆเฉ เจนเจพเจ:
$ llvm-objdump -D --section xdp/simple xdp-simple.bpf.o
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
2: bf a2 00 00 00 00 00 00 r2 = r10
3: 07 02 00 00 fc ff ff ff r2 += -4
4: 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
6: 85 00 00 00 01 00 00 00 call 1
7: b7 01 00 00 00 00 00 00 r1 = 0
8: 15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2>
9: 61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0)
10: 07 01 00 00 01 00 00 00 r1 += 1
11: 63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1
12: b7 01 00 00 02 00 00 00 r1 = 2
0000000000000068 <LBB0_2>:
13: bf 10 00 00 00 00 00 00 r0 = r1
14: 95 00 00 00 00 00 00 00 exit
เจเฉเฉฑเจฒ เจฎเจฟเจฒเจพ เจเฉ เจธเจพเจจเฉเฉฐ 14 เจนเจฆเจพเจเจคเจพเจ เจจเฉเฉฐ เจขเจพเจเจเจฟเจเจ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจฒเจฟเจเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉ struct bpf_insn
(เจธเจฒเจพเจน: เจเฉฑเจชเจฐเฉเจ เจกเฉฐเจช เจฒเจ, เจจเจฟเจฐเจฆเฉเจธเจผ เจญเจพเจ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจชเฉเฉเจนเฉ, เจเฉเจฒเฉเจนเฉ linux/bpf.h
linux/bpf_common.h
struct bpf_insn insns[]
เจเจชเจฃเฉ เจเจช):
struct bpf_insn insns[] = {
/* 85 00 00 00 08 00 00 00 call 8 */
{
.code = BPF_JMP | BPF_CALL,
.imm = 8,
},
/* 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0 */
{
.code = BPF_MEM | BPF_STX,
.off = -4,
.src_reg = BPF_REG_0,
.dst_reg = BPF_REG_10,
},
/* bf a2 00 00 00 00 00 00 r2 = r10 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_X,
.src_reg = BPF_REG_10,
.dst_reg = BPF_REG_2,
},
/* 07 02 00 00 fc ff ff ff r2 += -4 */
{
.code = BPF_ALU64 | BPF_ADD | BPF_K,
.dst_reg = BPF_REG_2,
.imm = -4,
},
/* 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll */
{
.code = BPF_LD | BPF_DW | BPF_IMM,
.src_reg = BPF_PSEUDO_MAP_FD,
.dst_reg = BPF_REG_1,
.imm = map_fd,
},
{ }, /* placeholder */
/* 85 00 00 00 01 00 00 00 call 1 */
{
.code = BPF_JMP | BPF_CALL,
.imm = 1,
},
/* b7 01 00 00 00 00 00 00 r1 = 0 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 0,
},
/* 15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2> */
{
.code = BPF_JMP | BPF_JEQ | BPF_K,
.off = 4,
.src_reg = BPF_REG_0,
.imm = 0,
},
/* 61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0) */
{
.code = BPF_MEM | BPF_LDX,
.off = 0,
.src_reg = BPF_REG_0,
.dst_reg = BPF_REG_1,
},
/* 07 01 00 00 01 00 00 00 r1 += 1 */
{
.code = BPF_ALU64 | BPF_ADD | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 1,
},
/* 63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1 */
{
.code = BPF_MEM | BPF_STX,
.src_reg = BPF_REG_1,
.dst_reg = BPF_REG_0,
},
/* b7 01 00 00 02 00 00 00 r1 = 2 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 2,
},
/* <LBB0_2>: bf 10 00 00 00 00 00 00 r0 = r1 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_X,
.src_reg = BPF_REG_1,
.dst_reg = BPF_REG_0,
},
/* 95 00 00 00 00 00 00 00 exit */
{
.code = BPF_JMP | BPF_EXIT
},
};
เจเจนเจจเจพเจ เจฒเจ เจเฉฑเจ เจ
เจญเจฟเจเจธ เจเจฟเจจเฉเจนเจพเจ เจจเฉ เจเจน เจเฉเจฆ เจจเจนเฉเจ เจฒเจฟเจเจฟเจ - เจฒเฉฑเจญเฉ map_fd
.
เจธเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจเฉฑเจ เจนเฉเจฐ เจ
เจฃเจฆเฉฑเจธเจฟเจ เจนเจฟเฉฑเจธเจพ เจฌเจพเจเฉ เจนเฉ - xdp_attach
. เจฌเจฆเจเจฟเจธเจฎเจคเฉ เจจเจพเจฒ, XDP เจตเจฐเจเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจธเจฟเจธเจเจฎ เจเจพเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจจเฉเจเจ เจจเจนเฉเจ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ bpf
. BPF เจ
เจคเฉ XDP เจฌเจฃเจพเจเจฃ เจตเจพเจฒเฉ เจฒเฉเจ เจเจจเจฒเจพเจเจจ เจฒเฉเจจเจเจธ เจเจฎเจฟเจเจจเจฟเจเฉ เจคเฉเจ เจธเจจ, เจเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉ เจเจฟ เจเจนเจจเจพเจ เจจเฉ เจเจนเจจเจพเจ เจฒเจ เจธเจญ เจคเฉเจ เจเจพเจฃเฉ เจเฉฑเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ (เจชเจฐ เจจเจนเฉเจ เจเจฎ เจฒเฉเจ) เจเจฐเจจเจฒ เจจเจพเจฒ เจเฉฐเจเจฐเจซเฉเจธ เจเจฐเจจ เจฒเจ เจเฉฐเจเจฐเจซเฉเจธ: xdp_attach
เจคเฉเจ เจเฉเจก เจฆเฉ เจจเจเจฒ เจเจฐ เจฐเจฟเจนเจพ เจนเฉ libbpf
, เจ
เจฐเจฅเจพเจค, เจซเจพเจเจฒ เจคเฉเจ netlink.c
เจจเฉเฉฑเจเจฒเจฟเฉฐเจ เจธเจพเจเจ เจฆเฉ เจฆเฉเจจเฉเจ เจตเจฟเฉฑเจ เจคเฉเจนเจพเจกเจพ เจธเฉเจเจเจค เจนเฉ
เจเฉฑเจ เจจเฉเฉฑเจเจฒเจฟเฉฐเจ เจธเจพเจเจ เจเจฟเจธเจฎ เจเฉเจฒเฉเจนเฉ NETLINK_ROUTE
:
int netlink_open(__u32 *nl_pid)
{
struct sockaddr_nl sa;
socklen_t addrlen;
int one = 1, ret;
int sock;
memset(&sa, 0, sizeof(sa));
sa.nl_family = AF_NETLINK;
sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sock < 0)
err(1, "socket");
if (setsockopt(sock, SOL_NETLINK, NETLINK_EXT_ACK, &one, sizeof(one)) < 0)
warnx("netlink error reporting not supported");
if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0)
err(1, "bind");
addrlen = sizeof(sa);
if (getsockname(sock, (struct sockaddr *)&sa, &addrlen) < 0)
err(1, "getsockname");
*nl_pid = sa.nl_pid;
return sock;
}
เจ เจธเฉเจ เจเจธ เจธเจพเจเจ เจคเฉเจ เจชเฉเฉเจนเจฆเฉ เจนเจพเจ:
static int bpf_netlink_recv(int sock, __u32 nl_pid, int seq)
{
bool multipart = true;
struct nlmsgerr *errm;
struct nlmsghdr *nh;
char buf[4096];
int len, ret;
while (multipart) {
multipart = false;
len = recv(sock, buf, sizeof(buf), 0);
if (len < 0)
err(1, "recv");
if (len == 0)
break;
for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, len);
nh = NLMSG_NEXT(nh, len)) {
if (nh->nlmsg_pid != nl_pid)
errx(1, "wrong pid");
if (nh->nlmsg_seq != seq)
errx(1, "INVSEQ");
if (nh->nlmsg_flags & NLM_F_MULTI)
multipart = true;
switch (nh->nlmsg_type) {
case NLMSG_ERROR:
errm = (struct nlmsgerr *)NLMSG_DATA(nh);
if (!errm->error)
continue;
ret = errm->error;
// libbpf_nla_dump_errormsg(nh); too many code to copy...
goto done;
case NLMSG_DONE:
return 0;
default:
break;
}
}
}
ret = 0;
done:
return ret;
}
เจ เฉฐเจค เจตเจฟเฉฑเจ, เจเฉฑเจฅเฉ เจธเจพเจกเจพ เจซเฉฐเจเจธเจผเจจ เจนเฉ เจเฉ เจเฉฑเจ เจธเจพเจเจ เจเฉเจฒเฉเจนเจฆเจพ เจนเฉ เจ เจคเฉ เจเฉฑเจ เจตเจฟเจธเจผเฉเจธเจผ เจธเฉเจจเฉเจนเจพ เจญเฉเจเจฆเจพ เจนเฉ เจเจฟเจธ เจตเจฟเฉฑเจ เจเฉฑเจ เจซเจพเจเจฒ เจกเจฟเจธเจเฉเจฐเจฟเจชเจเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉ:
static int xdp_attach(int ifindex, int prog_fd)
{
int sock, seq = 0, ret;
struct nlattr *nla, *nla_xdp;
struct {
struct nlmsghdr nh;
struct ifinfomsg ifinfo;
char attrbuf[64];
} req;
__u32 nl_pid = 0;
sock = netlink_open(&nl_pid);
if (sock < 0)
return sock;
memset(&req, 0, sizeof(req));
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
req.nh.nlmsg_type = RTM_SETLINK;
req.nh.nlmsg_pid = 0;
req.nh.nlmsg_seq = ++seq;
req.ifinfo.ifi_family = AF_UNSPEC;
req.ifinfo.ifi_index = ifindex;
/* started nested attribute for XDP */
nla = (struct nlattr *)(((char *)&req)
+ NLMSG_ALIGN(req.nh.nlmsg_len));
nla->nla_type = NLA_F_NESTED | IFLA_XDP;
nla->nla_len = NLA_HDRLEN;
/* add XDP fd */
nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
nla_xdp->nla_type = IFLA_XDP_FD;
nla_xdp->nla_len = NLA_HDRLEN + sizeof(int);
memcpy((char *)nla_xdp + NLA_HDRLEN, &prog_fd, sizeof(prog_fd));
nla->nla_len += nla_xdp->nla_len;
/* if user passed in any flags, add those too */
__u32 flags = XDP_FLAGS_SKB_MODE;
nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
nla_xdp->nla_type = IFLA_XDP_FLAGS;
nla_xdp->nla_len = NLA_HDRLEN + sizeof(flags);
memcpy((char *)nla_xdp + NLA_HDRLEN, &flags, sizeof(flags));
nla->nla_len += nla_xdp->nla_len;
req.nh.nlmsg_len += NLA_ALIGN(nla->nla_len);
if (send(sock, &req, req.nh.nlmsg_len, 0) < 0)
err(1, "send");
ret = bpf_netlink_recv(sock, nl_pid, seq);
cleanup:
close(sock);
return ret;
}
เจเจธ เจฒเจ, เจธเจญ เจเฉเจ เจเฉเจธเจ เจฒเจ เจคเจฟเจเจฐ เจนเฉ:
$ cc nolibbpf.c -o nolibbpf
$ sudo strace -e bpf ./nolibbpf
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, map_name="woo", ...}, 72) = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=15, prog_name="woo", ...}, 72) = 4
+++ exited with 0 +++
เจเจ เจฆเฉเจเฉเจ เจเจฟ เจเฉ เจธเจพเจกเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเฉเฉ เจเจฟเจ เจนเฉ lo
:
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 160
เจเจฒเฉ เจชเจฟเฉฐเจ เจญเฉเจเฉเจ เจ เจคเฉ เจจเจเจธเจผเฉ เจจเฉเฉฐ เจตเฉเจเฉเจ:
$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done
$ sudo bpftool m dump name woo
key: 00 00 00 00 value: 90 01 00 00 00 00 00 00
key: 01 00 00 00 value: 00 00 00 00 00 00 00 00
key: 02 00 00 00 value: 00 00 00 00 00 00 00 00
key: 03 00 00 00 value: 00 00 00 00 00 00 00 00
key: 04 00 00 00 value: 00 00 00 00 00 00 00 00
key: 05 00 00 00 value: 00 00 00 00 00 00 00 00
key: 06 00 00 00 value: 40 b5 00 00 00 00 00 00
key: 07 00 00 00 value: 00 00 00 00 00 00 00 00
Found 8 elements
เจนเฉเจฐเฉ, เจธเจญ เจเฉเจ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ. เจจเฉเจ เจเจฐเฉ, เจคเจฐเฉเจเฉ เจจเจพเจฒ, เจเจฟ เจธเจพเจกเจพ เจจเจเจธเจผเจพ เจฆเฉเจฌเจพเจฐเจพ เจฌเจพเจเจเจธ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจนเฉเฉฐเจฆเจพ เจนเฉ. เจเจน เจเจธ เจคเฉฑเจฅ เจฆเฉ เจเจพเจฐเจจ เจนเฉ เจเจฟ, เจเจฒเจ libbpf
เจ
เจธเฉเจ เจเจพเจเจช เจเจพเจฃเจเจพเจฐเฉ (BTF) เจฒเฉเจก เจจเจนเฉเจ เจเฉเจคเฉเฅค เจชเจฐ เจ
เจธเฉเจ เจ
เจเจฒเฉ เจตเจพเจฐ เจเจธ เจฌเจพเจฐเฉ เจนเฉเจฐ เจเฉฑเจฒ เจเจฐเจพเจเจเฉเฅค
เจตเจฟเจเจพเจธ เจธเจพเจงเจจ
เจเจธ เจญเจพเจ เจตเจฟเฉฑเจ, เจ เจธเฉเจ เจเฉฑเจเฉ-เจเฉฑเจ BPF เจกเจฟเจตเฉเจฒเจชเจฐ เจเฉเจฒเจเจฟเฉฑเจ เจจเฉเฉฐ เจฆเฉเจเจพเจเจเฉเฅค
เจเจฎ เจคเฉเจฐ 'เจคเฉ, เจคเฉเจนเจพเจจเฉเฉฐ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจตเจฟเจเจธเจค เจเจฐเจจ เจฒเจ เจเจฟเจธเฉ เจเจพเจธ เจเฉเจเจผ เจฆเฉ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉ - BPF เจเจฟเจธเฉ เจตเฉ เจตเจงเฉเจ เจกเจฟเจธเจเจฐเฉเจฌเจฟเจเจธเจผเจจ เจเจฐเจจเจฒ 'เจคเฉ เจเฉฑเจฒเจฆเจพ เจนเฉ, เจ
เจคเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจฌเจฃเจพเจ เจเจพเจเจฆเฉ เจนเจจ clang
, เจเฉ เจเจฟ เจชเฉเจเฉเจ เจคเฉเจ เจธเจชเจฒเจพเจ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉเฅค เจนเจพเจฒเจพเจเจเจฟ, เจเจธ เจคเฉฑเจฅ เจฆเฉ เจเจพเจฐเจจ เจเจฟ เจฌเฉเจชเฉเจเจซ เจตเจฟเจเจพเจธ เจ
เจงเฉเจจ เจนเฉ, เจเจฐเจจเจฒ เจ
เจคเฉ เจเฉเจฒ เจฒเจเจพเจคเจพเจฐ เจฌเจฆเจฒ เจฐเจนเฉ เจนเจจ, เจเฉเจเจฐ เจคเฉเจธเฉเจ 2019 เจคเฉเจ เจชเฉเจฐเจพเจฃเฉ เจเจผเจฎเจพเจจเฉ เจฆเฉ เจคเจฐเฉเจเจฟเจเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจฌเฉเจชเฉเจเจซ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจจเจนเฉเจ เจฒเจฟเจเจฃเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉ, เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจเจฐเจจเจพ เจนเฉเจตเฉเจเจพเฅค
llvm
/clang
pahole
- เจเจธ เจฆเจพ เจเฉเจฐ
bpftool
(เจนเจตเจพเจฒเฉ เจฒเจ, เจเจน เจญเจพเจ เจ เจคเฉ เจฒเฉเจ เจตเจฟเจเจฒเฉเจเจ เจธเจพเจฐเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจกเฉเจฌเฉเจ เจจ 10 'เจคเฉ เจเจฒเจพเจเจเจ เจเจเจเจ เจธเจจเฅค)
llvm/clang
BPF LLVM เจจเจพเจฒ เจฆเฉเจธเจคเจพเจจเจพ เจนเฉ เจ
เจคเฉ, เจนเจพเจฒเจพเจเจเจฟ เจนเจพเจฒ เจนเฉ เจตเจฟเฉฑเจ BPF เจฒเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ gcc เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเฉฐเจชเจพเจเจฒ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ, เจธเจพเจฐเฉ เจฎเฉเจเฉเจฆเจพ เจตเจฟเจเจพเจธ LLVM เจฒเจ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเจจเฅค เจเจธ เจฒเจ, เจธเจญ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ, เจ
เจธเฉเจ เจฎเฉเจเฉเจฆเจพ เจธเฉฐเจธเจเจฐเจฃ เจฌเจฃเจพเจตเจพเจเจเฉ clang
git เจคเฉเจ:
$ sudo apt install ninja-build
$ git clone --depth 1 https://github.com/llvm/llvm-project.git
$ mkdir -p llvm-project/llvm/build/install
$ cd llvm-project/llvm/build
$ cmake .. -G "Ninja" -DLLVM_TARGETS_TO_BUILD="BPF;X86"
-DLLVM_ENABLE_PROJECTS="clang"
-DBUILD_SHARED_LIBS=OFF
-DCMAKE_BUILD_TYPE=Release
-DLLVM_BUILD_RUNTIME=OFF
$ time ninja
... ะผะฝะพะณะพ ะฒัะตะผะตะฝะธ ัะฟัััั
$
เจนเฉเจฃ เจ เจธเฉเจ เจเจพเจเจ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ เจเจฟ เจเฉ เจธเจญ เจเฉเจ เจธเจนเฉ เจคเจฐเฉเจนเจพเจ เจเจเฉฑเจ เจพ เจนเฉเจเจ เจนเฉ:
$ ./bin/llc --version
LLVM (http://llvm.org/):
LLVM version 11.0.0git
Optimized build.
Default target: x86_64-unknown-linux-gnu
Host CPU: znver1
Registered Targets:
bpf - BPF (host endian)
bpfeb - BPF (big endian)
bpfel - BPF (little endian)
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
(เจ
เจธเฉเจเจฌเจฒเฉ เจจเจฟเจฐเจฆเฉเจธเจผ clang
เจฎเฉเจฐเฉ เจฆเฉเจเจฐเจพ เจฒเจฟเจ เจเจฟเจ
เจ
เจธเฉเจ เจเจนเจจเจพเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจธเจฅเจพเจชเจฟเจค เจจเจนเฉเจ เจเจฐเจพเจเจเฉ เจเฉ เจ
เจธเฉเจ เจนเฉเจฃเฉ เจฌเจฃเจพเจ เจนเจจ, เจชเจฐ เจเจธเจฆเฉ เจฌเจเจพเจ เจเจนเจจเจพเจ เจจเฉเฉฐ เจเจนเจจเจพเจ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเจฐเจพเจเจเฉ PATH
, เจเจฆเจพเจนเจฐเจจ เจฒเจ:
export PATH="`pwd`/bin:$PATH"
(เจเจธ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ .bashrc
เจเจพเจ เจเฉฑเจ เจตเฉฑเจเจฐเฉ เจซเจพเจเจฒ เจตเจฟเฉฑเจ. เจจเจฟเฉฑเจเฉ เจคเฉเจฐ 'เจคเฉ, เจฎเฉเจ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเฉเจเจ เจเฉเจเจผเจพเจ เจจเฉเฉฐ เจธเจผเจพเจฎเจฒ เจเจฐเจฆเจพ เจนเจพเจ ~/bin/activate-llvm.sh
เจ
เจคเฉ เจเจฆเฉเจ เจฒเฉเฉ เจนเฉเจตเฉ เจฎเฉเจ เจเจฐเจฆเจพ เจนเจพเจ . activate-llvm.sh
.)
เจชเจนเฉเจฒ เจ เจคเฉ เจฌเฉ.เจเฉ.เจเฉฑเจซ
เจเจชเจฏเฉเจเจคเจพ pahole
BTF เจซเจพเจฐเจฎเฉเจ เจตเจฟเฉฑเจ เจกเฉเจฌเฉฑเจเจฟเฉฐเจ เจเจพเจฃเจเจพเจฐเฉ เจฌเจฃเจพเจเจฃ เจฒเจ เจเจฐเจจเจฒ เจฌเจฃเจพเจเจฃ เจตเฉเจฒเฉ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉเฅค เจ
เจธเฉเจ เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ เจฌเฉเจเฉเจเจซ เจคเจเจจเจพเจฒเฉเจเฉ เจฆเฉ เจตเฉเจฐเจตเจฟเจเจ เจฌเจพเจฐเฉ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจจเจนเฉเจ เจเจพเจตเจพเจเจเฉ, เจเจธ เจคเฉฑเจฅ เจคเฉเจ เจเจฒเจพเจตเจพ เจเจฟ เจเจน เจธเฉเจตเจฟเจงเจพเจเจจเจ เจนเฉ เจ
เจคเฉ เจ
เจธเฉเจ เจเจธเจจเฉเฉฐ เจตเจฐเจคเจฃเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจพเจเฅค เจเจธ เจฒเจ เจเฉเจเจฐ เจคเฉเจธเฉเจ เจเจชเจฃเจพ เจเจฐเจจเจฒ เจฌเจฃเจพเจเจฃ เจเจพ เจฐเจนเฉ เจนเฉ, เจคเจพเจ เจชเจนเจฟเจฒเจพเจ เจฌเจฃเจพเจ pahole
(เจฌเจฟเจจเจพ pahole
เจคเฉเจธเฉเจ เจตเจฟเจเจฒเจช เจจเจพเจฒ เจเจฐเจจเจฒ เจฌเจฃเจพเจเจฃ เจฆเฉ เจฏเฉเจ เจจเจนเฉเจ เจนเฉเจตเฉเจเฉ CONFIG_DEBUG_INFO_BTF
:
$ git clone https://git.kernel.org/pub/scm/devel/pahole/pahole.git
$ cd pahole/
$ sudo apt install cmake
$ mkdir build
$ cd build/
$ cmake -D__LIB=lib ..
$ make
$ sudo make install
$ which pahole
/usr/local/bin/pahole
BPF เจจเจพเจฒ เจชเฉเจฐเจฏเฉเจ เจเจฐเจจ เจฒเจ เจเจฐเจจเจฒ
BPF เจฆเฉเจเจ เจธเฉฐเจญเจพเจตเจจเจพเจตเจพเจ เจฆเฉ เจชเฉเจเฉเจฒ เจเจฐเจฆเฉ เจธเจฎเฉเจ, เจฎเฉเจ เจเจชเจฃเฉ เจเฉเจฆ เจฆเฉ เจเฉเจฐ เจจเฉเฉฐ เจเจเฉฑเจ เจพ เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจเฅค เจเจน, เจเจฎ เจคเฉเจฐ 'เจคเฉ เจฌเฉเจฒเจฃ เจฒเจ, เจเจน เจเจผเจฐเฉเจฐเฉ เจจเจนเฉเจ เจนเฉ, เจเจฟเจเจเจเจฟ เจคเฉเจธเฉเจ เจตเฉฐเจก เจเจฐเจจเจฒ 'เจคเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจ เจคเฉ เจฒเฉเจก เจเจฐเจจ เจฆเฉ เจฏเฉเจ เจนเฉเจตเฉเจเฉ, เจนเจพเจฒเจพเจเจเจฟ, เจคเฉเจนเจพเจกเฉ เจเจชเจฃเฉ เจเจฐเจจเจฒ เจนเฉเจฃ เจจเจพเจฒ เจคเฉเจธเฉเจ เจจเจตเฉเจจเจคเจฎ BPF เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเฉ เจฎเจนเฉเจจเจฟเจเจ เจตเจฟเฉฑเจ เจคเฉเจนเจพเจกเฉ เจตเฉฐเจก เจตเจฟเฉฑเจ เจธเจญ เจคเฉเจ เจตเจงเฉเจ เจฆเจฟเจเจพเจ เจฆเฉเจฃเจเฉเจเจเฅค , เจเจพเจ, เจเจฟเจตเฉเจ เจเจฟ เจเฉเจ เจกเฉเจฌเฉฑเจเจฟเฉฐเจ เจเฉเจฒเจธ เจฆเฉ เจฎเจพเจฎเจฒเฉ เจตเจฟเฉฑเจ เจเจเจฃ เจตเจพเจฒเฉ เจญเจตเจฟเฉฑเจ เจตเจฟเฉฑเจ เจฌเจฟเจฒเจเฉเจฒ เจตเฉ เจชเฉเจ เจจเจนเฉเจ เจเฉเจคเจพ เจเจพเจตเฉเจเจพเฅค เจจเจพเจฒ เจนเฉ, เจเจธเจฆเจพ เจเจชเจฃเจพ เจเฉเจฐ เจเฉเจก เจจเจพเจฒ เจชเฉเจฐเจฏเฉเจ เจเจฐเจจเจพ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจฎเจนเจฟเจธเฉเจธ เจเจฐเจฆเจพ เจนเฉเฅค
เจเฉฑเจ เจเจฐเจจเจฒ เจฌเจฃเจพเจเจฃ เจฒเจ เจคเฉเจนเจพเจจเฉเฉฐ เจธเจญ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ, เจเจฐเจจเจฒ เจเฉเจฆ, เจ
เจคเฉ เจฆเฉเจเจพ, เจเฉฑเจ เจเจฐเจจเจฒ เจธเฉฐเจฐเจเจจเจพ เจซเจพเจเจฒ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค BPF เจจเจพเจฒ เจชเฉเจฐเจฏเฉเจ เจเจฐเจจ เจฒเจ เจ
เจธเฉเจ เจเจฎ เจตเจฐเจค เจธเจเจฆเฉ เจนเจพเจ net
net-next
bpf
bpf-next
*-next
เจธเฉเจเฉเจฌเฉฑเจง เจฒเฉเจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเจฐเจจเจฒ เจธเจญ เจคเฉเจ เจ
เจธเจฅเจฟเจฐ เจนเจจ)เฅค
เจเจฐเจจเจฒ เจธเฉฐเจฐเจเจจเจพ เจซเจพเจเจฒเจพเจ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจเจฟเจตเฉเจ เจเจฐเจจเจพ เจนเฉ เจเจธ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเจจเจพ เจเจธ เจฒเฉเจ เจฆเฉ เจฆเจพเจเจฐเฉ เจคเฉเจ เจฌเจพเจนเจฐ เจนเฉ - เจเจน เจฎเฉฐเจจเจฟเจ เจเจพเจเจฆเจพ เจนเฉ เจเจฟ เจคเฉเจธเฉเจ เจเจพเจ เจคเจพเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจเจพเจฃเจฆเฉ เจนเฉ เจเจฟ เจเจน เจเจฟเจตเฉเจ เจเจฐเจจเจพ เจนเฉ, เจเจพเจ
เจเจชเจฐเฉเจเจค เจเจฐเจจเจฒ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจจเฉเฉฐ เจกเจพเจเจจเจฒเฉเจก เจเจฐเฉ:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
$ cd bpf-next
เจเฉฑเจ เจเฉฑเจเฉ-เจเฉฑเจ เจเจพเจฐเจเจธเจผเฉเจฒ เจเจฐเจจเจฒ เจธเฉฐเจฐเจเจจเจพ เจฌเจฃเจพเจ:
$ cp /boot/config-`uname -r` .config
$ make localmodconfig
เจซเจพเจเจฒ เจตเจฟเฉฑเจ BPF เจตเจฟเจเจฒเจชเจพเจ เจจเฉเฉฐ เจธเจฎเจฐเฉฑเจฅ เจฌเจฃเจพเจ .config
เจคเฉเจนเจพเจกเฉ เจเจชเจฃเฉ เจเฉเจฃ (เจเจผเจฟเจเจฆเจพเจคเจฐ CONFIG_BPF
เจชเจนเจฟเจฒเจพเจ เจนเฉ เจธเจฎเจฐเฉฑเจฅ เจนเฉ เจเจพเจตเฉเจเจพ เจเจฟเจเจเจเจฟ systemd เจเจธเจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเจพ เจนเฉ)เฅค เจเฉฑเจฅเฉ เจเจธ เจฒเฉเจ เจฒเจ เจตเจฐเจคเฉ เจเจ เจเจฐเจจเจฒ เจคเฉเจ เจตเจฟเจเจฒเจชเจพเจ เจฆเฉ เจธเฉเจเฉ เจนเฉ:
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_LSM=y
CONFIG_BPF_SYSCALL=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_IPV6_SEG6_BPF=y
# CONFIG_NETFILTER_XT_MATCH_BPF is not set
# CONFIG_BPFILTER is not set
CONFIG_NET_CLS_BPF=y
CONFIG_NET_ACT_BPF=y
CONFIG_BPF_JIT=y
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_BPF_KPROBE_OVERRIDE=y
CONFIG_DEBUG_INFO_BTF=y
เจซเจฟเจฐ เจ
เจธเฉเจ เจเจธเจพเจจเฉ เจจเจพเจฒ เจฎเฉเจกเจฟเจเจฒ เจ
เจคเฉ เจเจฐเจจเจฒ เจจเฉเฉฐ เจ
เจธเฉเจเจฌเจฒ เจ
เจคเฉ เจเฉฐเจธเจเจพเจฒ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ (เจตเฉเจธเฉ, เจคเฉเจธเฉเจ เจจเจตเฉเจ เจ
เจธเฉเจเจฌเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจฐเจจเจฒ เจจเฉเฉฐ เจ
เจธเฉเจเจฌเจฒ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค clang
เจเฉเฉ เจเฉ CC=clang
):
$ make -s -j $(getconf _NPROCESSORS_ONLN)
$ sudo make modules_install
$ sudo make install
เจ
เจคเฉ เจจเจตเฉเจ เจเจฐเจจเจฒ เจจเจพเจฒ เจฐเฉเจฌเฉเจ เจเจฐเฉ (เจฎเฉเจ เจเจธ เจฒเจ เจตเจฐเจคเจฆเจพ เจนเจพเจ kexec
เจชเฉเจเฉเจ เจคเฉเจ kexec-tools
):
v=5.8.0-rc6+ # ะตัะปะธ ะฒั ะฟะตัะตัะพะฑะธัะฐะตัะต ัะตะบััะตะต ัะดัะพ, ัะพ ะผะพะถะฝะพ ะดะตะปะฐัั v=`uname -r`
sudo kexec -l -t bzImage /boot/vmlinuz-$v --initrd=/boot/initrd.img-$v --reuse-cmdline &&
sudo kexec -e
bpftool
เจฒเฉเจ เจตเจฟเฉฑเจ เจธเจญ เจคเฉเจ เจตเฉฑเจง เจตเจฐเจคเฉ เจเจพเจฃ เจตเจพเจฒเฉ เจเจชเจฏเฉเจเจคเจพ เจเจชเจฏเฉเจเจคเจพ เจนเฉเจตเฉเจเฉ bpftool
, เจฒเฉเจจเจเจธ เจเจฐเจจเจฒ เจฆเฉ เจนเจฟเฉฑเจธเฉ เจตเจเฉเจ เจธเจชเจฒเจพเจ เจเฉเจคเจพ เจเจฟเจเฅค เจเจน BPF เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจฒเจ BPF เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจฆเฉเจเจฐเจพ เจฒเจฟเจเจฟเจ เจ
เจคเฉ เจธเฉฐเจญเจพเจฒเจฟเจ เจเจพเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจธเจฆเฉ เจตเจฐเจคเฉเจ เจธเจพเจฐเฉเจเจ เจเจฟเจธเจฎเจพเจ เจฆเฉเจเจ BPF เจตเจธเจคเฉเจเจ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจเจฐเจจ เจฒเจ เจเฉเจคเฉ เจเจพ เจธเจเจฆเฉ เจนเฉ - เจชเฉเจฐเฉเจเจฐเจพเจฎ เจฒเฉเจก เจเจฐเจจ, เจจเจเจธเจผเฉ เจฌเจฃเจพเจเจฃ เจ
เจคเฉ เจธเฉฐเจชเจพเจฆเจฟเจค เจเจฐเจจ, BPF เจเจเฉเจธเจฟเจธเจเจฎ เจฆเฉ เจเฉเจตเจจ เจฆเฉ เจชเฉเจเฉเจฒ เจเจฐเจจ เจเจฆเจฟเฅค เจฎเฉเจจ เจชเฉเจเจพเจ เจฒเจ เจธเจฐเฉเจค เจเฉเจก เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจฆเจธเจคเจพเจตเฉเจเจผ เจฒเฉฑเจญเฉ เจเจพ เจธเจเจฆเฉ เจนเจจ
เจเจธ เจฒเจฟเจเจค เจฆเฉ เจธเจฎเฉเจ bpftool
เจธเจฟเจฐเจซเจผ RHEL, Fedora เจ
เจคเฉ Ubuntu เจฒเจ เจคเจฟเจเจฐ-เจฌเจฃเจพเจเจ เจเจเจเจฆเจพ เจนเฉ (เจฆเฉเจเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, bpftool
เจกเฉเจฌเฉเจ
เจจ เจตเจฟเฉฑเจ). เจชเจฐ เจเฉ เจคเฉเจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจเจชเจฃเจพ เจเจฐเจจเจฒ เจฌเจฃเจพเจเจ เจนเฉ, เจคเจพเจ เจฌเจฃเจพเจ bpftool
เจชเจพเจ เจตเจพเจเจ เจเจธเจพเจจ:
$ cd ${linux}/tools/bpf/bpftool
# ... ะฟัะพะฟะธัะธัะต ะฟััะธ ะบ ะฟะพัะปะตะดะฝะตะผั clang, ะบะฐะบ ัะฐััะบะฐะทะฐะฝะพ ะฒััะต
$ make -s
Auto-detecting system features:
... libbfd: [ on ]
... disassembler-four-args: [ on ]
... zlib: [ on ]
... libcap: [ on ]
... clang-bpf-co-re: [ on ]
Auto-detecting system features:
... libelf: [ on ]
... zlib: [ on ]
... bpf: [ on ]
$
(เจเจฅเฉ ${linux}
- เจเจน เจคเฉเจนเจพเจกเฉ เจเจฐเจจเจฒ เจกเจพเจเจฐเฉเจเจเจฐเฉ เจนเฉเฅค) เจเจนเจจเจพเจ เจเจฎเจพเจเจกเจพเจ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ bpftool
เจเฉฑเจ เจกเจพเจเจฐเฉเจเจเจฐเฉ เจตเจฟเฉฑเจ เจเจเฉฑเจ เฉ เจเฉเจคเฉ เจเจพเจตเฉเจเฉ ${linux}/tools/bpf/bpftool
เจ
เจคเฉ เจเจธเจจเฉเฉฐ เจฎเจพเจฐเจ เจตเจฟเฉฑเจ เจเฉเฉเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉ (เจธเจญ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจเจชเจญเฉเจเจคเจพ เจฒเจ root
) เจเจพเจ เจธเจฟเจฐเจซเจผ เจเจพเจชเฉ เจเจฐเฉ /usr/local/sbin
.
เจเจเฉฑเจ เจพ เจเจฐเฉ bpftool
เจฌเจพเจ
เจฆ เจตเจพเจฒเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ เจธเจญ เจคเฉเจ เจตเจงเฉเจ เจนเฉ clang
, เจเฉฑเจชเจฐ เจฆเฉฑเจธเฉ เจ
เจจเฉเจธเจพเจฐ เจ
เจธเฉเจเจฌเจฒ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจ
เจคเฉ เจเจพเจเจ เจเจฐเฉ เจเจฟ เจเฉ เจเจน เจธเจนเฉ เจขเฉฐเจ เจจเจพเจฒ เจ
เจธเฉเจเจฌเจฒ เจเฉเจคเจพ เจเจฟเจ เจนเฉ - เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ
$ sudo bpftool feature probe kernel
Scanning system configuration...
bpf() syscall for unprivileged users is enabled
JIT compiler is enabled
JIT compiler hardening is disabled
JIT compiler kallsyms exports are enabled for root
...
เจเฉ เจฆเจฟเจเจพเจเจเจพ เจเจฟ เจคเฉเจนเจพเจกเฉ เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจเจฟเจนเฉเฉเจเจ BPF เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจฏเฉเจ เจนเจจเฅค
เจคเจฐเฉเจเฉ เจจเจพเจฒ, เจชเจฟเจเจฒเฉ เจเจฎเจพเจเจก เจจเฉเฉฐ เจเจธ เจคเจฐเฉเจนเจพเจ เจเจฒเจพเจเจ เจเจพ เจธเจเจฆเจพ เจนเฉ
# bpftool f p k
เจเจน เจชเฉเจเฉเจ เจคเฉเจ เจเจชเจฏเฉเจเจคเจพเจตเจพเจ เจจเจพเจฒ เจธเจฎเจพเจจเจคเจพ เจฆเฉเจเจฐเจพ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ iproute2
, เจเจฟเฉฑเจฅเฉ เจ
เจธเฉเจ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเจนเจฟ เจธเจเจฆเฉ เจนเจพเจ ip a s eth0
เจฆเฉ เจฌเจเจพเจ ip addr show dev eth0
.
เจธเจฟเฉฑเจเจพ
BPF เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเจฐ เจฆเฉ เจเจพเจฐเจเจเฉเจธเจผเจฒเจคเจพ เจจเฉเฉฐ เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ เจขเฉฐเจ เจจเจพเจฒ เจฎเจพเจชเจฃ เจ เจคเฉ เจเฉฑเจกเจฆเฉ-เจซเจฟเจฐเจฆเฉ เจฌเจฆเจฒเจฃ เจฒเจ เจเฉฑเจ เจชเจฟเฉฑเจธเฉ เจจเฉเฉฐ เจเฉเฉฑเจคเฉ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค UNIX เจฆเฉเจเจ เจธเจญ เจคเฉเจ เจตเจงเฉเจ เจชเจฐเฉฐเจชเจฐเจพเจตเจพเจ เจตเจฟเฉฑเจ, เจธเจฟเจธเจเจฎ เจฌเจนเฉเจค เจธเจซเจฒ เจธเจพเจฌเจค เจนเฉเจเจ: เจเฉฑเจ เจธเจงเจพเจฐเจจ เจตเจฟเจงเฉ เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจเจฐเจจเจฒ เจจเฉเฉฐ เจชเฉเจฐเฉเจเจฐเจพเจฎ (เจฎเฉเฉ) เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเฉ เจนเฉ, เจเจฟเจธ เจจเฉ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจฒเฉเจเจพเจ เจ เจคเฉ เจธเฉฐเจธเจฅเจพเจตเจพเจ เจจเฉเฉฐ เจชเฉเจฐเจฏเฉเจ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฑเจคเฉเฅค เจ เจคเฉ, เจนเจพเจฒเจพเจเจเจฟ เจชเฉเจฐเจฏเฉเจ, เจ เจคเฉ เจจเจพเจฒ เจนเฉ BPF เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเจพ เจตเจฟเจเจพเจธ เจเจชเจฃเฉ เจเจช เจตเจฟเฉฑเจ, เจเจคเจฎ เจนเฉเจฃ เจคเฉเจ เจฌเจนเฉเจค เจฆเฉเจฐ เจนเจจ, เจธเจฟเจธเจเจฎ เจตเจฟเฉฑเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจเฉฑเจ เจธเจฅเจฟเจฐ ABI เจนเฉ เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจญเจฐเฉเจธเฉเจฏเฉเจ, เจ เจคเฉ เจธเจญ เจคเฉเจ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ, เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ เจตเจชเจพเจฐเจ เจคเจฐเจ เจฌเจฃเจพเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค
เจฎเฉเจ เจเจน เจจเฉเจ เจเจฐเจจเจพ เจเจพเจนเจพเจเจเจพ เจเจฟ, เจฎเฉเจฐเฉ เจฐเจพเจ เจตเจฟเฉฑเจ, เจคเจเจจเจพเจฒเฉเจเฉ เจเฉฐเจจเฉ เจฎเจธเจผเจนเฉเจฐ เจนเฉ เจเจ เจนเฉ เจเจฟเจเจเจเจฟ, เจเฉฑเจ เจชเจพเจธเฉ, เจเจน เจเจฐ เจธเจเจฆเจพ เจนเฉ เจเฉเจกเจฃ เจฒเจ (เจเฉฑเจ เจฎเจธเจผเฉเจจ เจฆเฉ เจเจฐเจเฉเจเฉเจเจเจฐ เจจเฉเฉฐ เจเฉฑเจ เจธเจผเจพเจฎ เจตเจฟเฉฑเจ เจเฉฑเจ เจเจพเจ เจเฉฑเจ เจธเจฎเจเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉ), เจ เจคเฉ เจฆเฉเจเฉ เจชเจพเจธเฉ, เจเจนเจจเจพเจ เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ เจจเฉเฉฐ เจนเฉฑเจฒ เจเจฐเจจ เจฒเจ เจเฉ เจเจธเจฆเฉ เจฆเจฟเฉฑเจ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ (เจธเฉเฉฐเจฆเจฐเจคเจพ เจจเจพเจฒ) เจนเฉฑเจฒ เจจเจนเฉเจ เจเฉเจคเฉเจเจ เจเจพ เจธเจเจฆเฉเจเจ เจธเจจเฅค เจเจน เจฆเฉ เจญเจพเจ เจเจเฉฑเจ เฉ เจฒเฉเจเจพเจ เจจเฉเฉฐ เจชเฉเจฐเจฏเฉเจ เจเจฐเจจ เจ เจคเฉ เจธเฉเจชเจจเฉ เจฆเฉเจเจฃ เจฒเจ เจฎเจเจผเจฌเฉเจฐ เจเจฐเจฆเฉ เจนเจจ, เจเฉ เจเจฟ เจตเฉฑเจง เจคเฉเจ เจตเฉฑเจง เจจเจตเฉเจจเจคเจพเจเจพเจฐเฉ เจนเฉฑเจฒเจพเจ เจฆเฉ เจเจญเจพเจฐ เจตเฉฑเจฒ เจเฉเจฆเจพ เจนเฉเฅค
เจเจน เจฒเฉเจ, เจนเจพเจฒเจพเจเจเจฟ เจเจพเจธ เจคเฉเจฐ 'เจคเฉ เจเฉเจเจพ เจจเจนเฉเจ เจนเฉ, เจธเจฟเจฐเจซ BPF เจฆเฉ เจฆเฉเจจเฉเจ เจฆเฉ เจเฉฑเจ เจเจพเจฃ-เจชเจเจพเจฃ เจนเฉ เจ เจคเฉ "เจเจจเจค" เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจ เจคเฉ เจเจฐเจเฉเจเฉเจเจเจฐ เจฆเฉ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจนเจฟเฉฑเจธเจฟเจเจ เจฆเจพ เจตเจฐเจฃเจจ เจจเจนเฉเจ เจเจฐเจฆเจพ เจนเฉเฅค เจ เฉฑเจเฉ เจเจพ เจฐเจนเฉ เจฏเฉเจเจจเจพ เจเฉเจ เจเจธ เจคเจฐเฉเจนเจพเจ เจนเฉ: เจ เจเจฒเจพ เจฒเฉเจ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฟเจธเจฎเจพเจ (5.8 เจเจฐเจจเจฒ เจตเจฟเฉฑเจ เจธเจฎเจฐเจฅเจฟเจค 30 เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฟเจธเจฎเจพเจ เจนเจจ) เจฆเฉ เจเฉฑเจ เจธเฉฐเจเฉเจช เจเจพเจฃเจเจพเจฐเฉ เจนเฉเจตเฉเจเฉ, เจซเจฟเจฐ เจ เจธเฉเจ เจ เฉฐเจค เจตเจฟเฉฑเจ เจเจน เจฆเฉเจเจพเจเจเฉ เจเจฟ เจเจฐเจจเจฒ เจเจฐเฉเจธเจฟเฉฐเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจ เจธเจฒ BPF เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจฒเจฟเจเจฃเจพ เจนเฉเฅค เจเฉฑเจ เจเจฆเจพเจนเจฐเจจ เจฆเฉ เจคเฉเจฐ 'เจคเฉ, เจซเจฟเจฐ BPF เจเจฐเจเฉเจเฉเจเจเจฐ 'เจคเฉ เจเฉฑเจ เจนเฉเจฐ เจกเฉเฉฐเจเจพเจ เจตเจพเจฒเฉ เจเฉเจฐเจธ เจฆเจพ เจธเจฎเจพเจ เจ เจเจฟเจ เจนเฉ, เจเจฟเจธ เจคเฉเจ เจฌเจพเจ เจฆ BPF เจจเฉเฉฑเจเจตเจฐเจเจฟเฉฐเจ เจ เจคเฉ เจธเฉเจฐเฉฑเจเจฟเจ เจเจชเจฒเฉเจเฉเจธเจผเจจเจพเจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจฆเจฟเฉฑเจคเฉเจเจ เจเจพเจฃเจเฉเจเจเฅค
เจเจธ เจฒเฉเฉ เจตเจฟเฉฑเจ เจชเจฟเจเจฒเฉ เจฒเฉเจ
เจฒเจฟเฉฐเจ
-
BPF เจ เจคเฉ XDP เจธเฉฐเจฆเจฐเจญ เจเจพเจเจก โ เจธเฉเจฒเฉเจ เจฎ เจคเฉเจ BPF 'เจคเฉ เจฆเจธเจคเจพเจตเฉเจเจผ, เจเจพเจ BPF เจฆเฉ เจธเจฟเจฐเจเจฃเจนเจพเจฐเจพเจ เจ เจคเฉ เจฐเฉฑเจ-เจฐเจเจพเจต เจเจฐเจจ เจตเจพเจฒเจฟเจเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจกเฉเจจเฉเจ เจฒ เจฌเฉเจฐเจเจฎเฉเจจ เจคเฉเจเฅค เจเจน เจชเจนเจฟเจฒเฉ เจเฉฐเจญเฉเจฐ เจตเจฐเจฃเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจนเฉ, เจเฉ เจเจฟ เจฆเฉเจเจฟเจเจ เจคเฉเจ เจตเฉฑเจเจฐเจพ เจนเฉ เจเจฟ เจกเฉเจจเฉเจ เจฒ เจฌเจฟเจฒเจเฉเจฒ เจเจพเจฃเจฆเจพ เจนเฉ เจเจฟ เจเจน เจเจฟเจธ เจฌเจพเจฐเฉ เจฒเจฟเจ เจฐเจฟเจนเจพ เจนเฉ เจ เจคเฉ เจเฉฑเจฅเฉ เจเฉเจ เจเจฒเจคเฉเจเจ เจจเจนเฉเจ เจนเจจเฅค เจเจพเจธ เจคเฉเจฐ 'เจคเฉ, เจเจน เจฆเจธเจคเจพเจตเฉเจเจผ เจฆเฉฑเจธเจฆเจพ เจนเฉ เจเจฟ เจฎเจธเจผเจนเฉเจฐ เจเจชเจฏเฉเจเจคเจพ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ XDP เจ เจคเฉ TC เจเจฟเจธเจฎเจพเจ เจฆเฉ BPF เจชเฉเจฐเฉเจเจฐเจพเจฎเจพเจ เจจเจพเจฒ เจเจฟเจตเฉเจ เจเฉฐเจฎ เจเจฐเจจเจพ เจนเฉip
เจชเฉเจเฉเจ เจคเฉเจiproute2
. -
Documentation/networking/filter.txt - เจเจฒเจพเจธเจฟเจ เจ เจคเฉ เจซเจฟเจฐ เจตเจฟเจธเจคเฉเจฐเจฟเจค BPF เจฒเจ เจฆเจธเจคเจพเจตเฉเจเจผเจพเจ เจตเจพเจฒเฉ เจ เจธเจฒ เจซเจพเจเจฒเฅค เจเฉ เจคเฉเจธเฉเจ เจ เจธเฉเจเจฌเจฒเฉ เจญเจพเจธเจผเจพ เจ เจคเฉ เจคเจเจจเฉเจเฉ เจเจฐเจเฉเจเฉเจเจเจฐเจฒ เจตเฉเจฐเจตเจฟเจเจ เจตเจฟเฉฑเจ เจเจพเจฃเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจนเฉ เจคเจพเจ เจเฉฑเจ เจเฉฐเจเจพ เจชเฉเฉเจนเจจเจพเฅค -
เจซเฉเจธเจฌเฉเฉฑเจ เจคเฉเจ BPF เจฌเจพเจฐเฉ เจฌเจฒเฉเจ . เจเจน เจฌเจนเฉเจค เจเฉฑเจ เจนเฉ เจ เฉฑเจชเจกเฉเจ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ, เจชเจฐ เจขเฉเจเจตเฉเจ เจคเฉเจฐ 'เจคเฉ, เจเจฟเจตเฉเจ เจเจฟ เจ เจฒเฉเจเจธเฉ เจธเจเจพเจฐเฉเจตเฉเจเจเฉเจต (เจเจฌเฉเจชเฉเจเจซ เจฆเฉ เจฒเฉเจเจ) เจ เจคเฉ เจเจเจกเจฐเฉ เจจเจเจฐเฉเจเฉ - (เจฐเฉฑเจ-เจฐเจเจพเจ เจเจฐเจจ เจตเจพเจฒเจพ) เจเฉฑเจฅเฉ เจฒเจฟเจเจฆเฉ เจนเจจเฅคlibbpf
). -
bpftool เจฆเฉ เจฐเจพเจเจผ . bpftool เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉ เจเจฆเจพเจนเจฐเจจเจพเจ เจ เจคเฉ เจฐเจพเจเจผเจพเจ เจฆเฉ เจจเจพเจฒ Quentin Monnet เจคเฉเจ เจเฉฑเจ เจฎเจจเฉเจฐเฉฐเจเจ เจเจตเจฟเฉฑเจเจฐ เจฅเฉเจฐเฉเจกเฅค -
BPF เจตเจฟเฉฑเจ เจกเฉเจฌเจเฉ: เจชเฉเฉเจนเจจ เจธเจฎเฉฑเจเจฐเฉ เจฆเฉ เจเฉฑเจ เจธเฉเจเฉ . Quentin Monnet เจคเฉเจ BPF เจฆเจธเจคเจพเจตเฉเจเจผเจพเจ เจฆเฉ เจฒเจฟเฉฐเจเจพเจ เจฆเฉ เจเฉฑเจ เจตเจฟเจธเจผเจพเจฒ (เจ เจคเฉ เจ เจเฉ เจตเฉ เจฌเจฃเจพเจ เจฐเฉฑเจเฉ เจเจ) เจธเฉเจเฉเฅค
เจธเจฐเฉเจค: www.habr.com