เชถเชฐเซเชเชคเชฎเชพเช เชเช เชเซเชเซเชจเซเชฒเซเชเซ เชนเชคเซ เช
เชจเซ เชคเซเชจเซ BPF เชเชนเซเชตเชพเชฎเชพเช เชเชตเชคเซเช เชนเชคเซเช. เช
เชฎเซ เชคเซเชจเชพ เชคเชฐเชซ เชเซเชฏเซเช
เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชเชนเซเช เชคเซ, BPF เชคเชฎเชจเซ Linux เชเชฐเซเชจเชฒ เชธเซเชชเซเชธเชฎเชพเช เชฎเชจเชธเซเชตเซ เชฐเซเชคเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชพ เชชเชพเชกเชตเชพเชฎเชพเช เชเชตเซเชฒ เชเซเชก เชเชฒเชพเชตเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ, เช เชจเซ เชจเชตเซเช เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เชเชเชฒเซเช เชธเชซเชณ เชฌเชจเซเชฏเซเช เชเซ เชเซ เชคเซเชจเซ เชฌเชงเซ เชเชชเซเชฒเชฟเชเซเชถเชจเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเชตเชพ เชฎเชพเชเซ เช เชฎเชจเซ เชตเชงเซ เชกเชเชจ เชฒเซเชเซเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ. (เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเช เชฎเชพเชคเซเชฐ เชเช เช เชตเชธเซเชคเซ เชธเชพเชฐเซ เชฐเซเชคเซ เชเชฐเซ เชจ เชนเชคเซ, เชเซเชฎ เชเซ เชคเชฎเซ เชจเซเชเซเชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจ เชเซเชกเชฎเชพเช เชเซเช เชถเชเซ เชเซ, เชคเซ เชฏเซเชเซเชฏ เชฒเซเชเซ เชฌเชจเชพเชตเชคเซ เชนเชคเซ.)
เช เชฒเซเช BPF เชตเชฐเซเชเซเชฏเซเช
เชฒ เชฎเชถเซเชจเชจเซเช เชฎเชพเชณเชเซเช, BPF เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซเชจเชพ เชเชฐเซเชจเชฒ เชเชจเซเชเชฐเชซเซเชธ, เชตเชฟเชเชพเชธ เชธเชพเชงเชจเซ, เชคเซเชฎเช เชนเชพเชฒเชจเซ เชเซเชทเชฎเชคเชพเชเชจเซ เชเซเชเชเซ, เชเซเชฌ เช เชธเชเชเซเชทเชฟเชชเซเชค เชเชพเชเชเซเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ, เชเชเชฒเซ เชเซ. BPF เชจเชพ เชตเซเชฏเชตเชนเชพเชฐเซ เชเชพเชฐเซเชฏเชเซเชฐเชฎเซเชจเชพ เชเชเชกเชพ เช
เชญเซเชฏเชพเชธ เชฎเชพเชเซ เชเชชเชฃเชจเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เชเชฐเซเชฐ เชชเชกเชถเซ เชคเซ เชฌเชงเซเช.
เชฒเซเชเชจเซ เชธเชพเชฐเชพเชเชถ
bpf(2)
.
ะะธัะตะผ ะฟัะพะณัะฐะผะผั BPF ั ะฟะพะผะพััั libbpf
.libbpf
. เช
เชฎเซ เชเช เชฎเซเชณเชญเซเชค BPF เชเชชเซเชฒเชฟเชเซเชถเชจ เชนเชพเชกเชชเชฟเชเชเชฐ เชฌเชจเชพเชตเซเชถเซเช เชเซเชจเซ เช
เชฎเซ เช
เชจเซเชเชพเชฎเซ เชเชฆเชพเชนเชฐเชฃเซเชฎเชพเช เชเชชเชฏเซเช เชเชฐเซเชถเซเช.
BPF เชเชฐเซเชเชฟเชเซเชเซเชเชฐเชจเซ เชชเชฐเชฟเชเชฏ
เช
เชฎเซ BPF เชเชฐเซเชเชฟเชเซเชเซเชเชฐเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเช เชคเซ เชชเชนเซเชฒเชพเช, เช
เชฎเซ เชเช เชเซเชฒเซเชฒเซ เชตเชพเชฐ (เชเชน) เชจเซ เชธเชเชฆเชฐเซเชญ เชฒเชเชถเซเช
เชจเชตเซเช BPF 64-เชฌเซเช เชฎเชถเซเชจเซเชจเซ เชธเชฐเซเชตเชตเซเชฏเชพเชชเชเชคเชพ, เชเซเชฒเชพเชเชก เชธเซเชตเชพเช เช เชจเซ SDN (Sเชเชซเชตเซเชฐ-dเชถเซเชฆเซเชง nเชเชพเชฎ เชเชฐเชตเซเช). เชเซเชฒเชพเชธเชฟเช BPF เชฎเชพเชเซ เชธเซเชงเชพเชฐเซเชฒ เชฐเชฟเชชเซเชฒเซเชธเชฎเซเชจเซเช เชคเชฐเซเชเซ เชเชฐเซเชจเชฒ เชจเซเชเชตเชฐเซเช เชเชเชจเซเชฐเซ เชฆเซเชตเชพเชฐเชพ เชตเชฟเชเชธเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฒ, เชจเชตเชพ BPFเชจเซ เชถเชพเชฌเซเชฆเชฟเช เชฐเซเชคเซ เช เชฎเชนเชฟเชจเชพ เชชเชเซ Linux เชธเชฟเชธเซเชเชฎเซเชธเชจเซ เชเซเชฐเซเชธ เชเชฐเชตเชพเชจเชพ เชฎเซเชถเซเชเซเชฒ เชเชพเชฐเซเชฏเชฎเชพเช เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเชณเซ, เช เชจเซ เชนเชตเซ, เชคเซเชจเชพ เชฆเซเชเชพเชตเชจเชพ เช เชตเชฐเซเชท เชชเชเซ, เช เชฎเชจเซ เชเชเชพ เชเชเชพเชฎเซ เชฒเซเชเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ. เชตเชฟเชตเชฟเชง เชชเซเชฐเชเชพเชฐเชจเชพ เชเชพเชฐเซเชฏเชเซเชฐเชฎเซเชจเซ เชฏเชพเชฆเซ เชฌเชจเชพเชตเซ.
เชฐเชฎเซเชเซ เชเชฟเชคเซเชฐเซ
เชคเซเชจเชพ เชฎเซเชณเชฎเชพเช, 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 เชเซเชฒเชพเชธเชฟเช BPF เชจเซ เชธเชฐเชเชพเชฎเชฃเซเชฎเชพเช เชเชฟเชคเซเชฐเชจเซ เชฎเซเชณเชญเซเชค เชฐเซเชคเซ เชฌเชฆเชฒเซ เชเซ. เชฌเซ เชจเชตเซเชจเชคเชพเช เชเซ เชเซ เชจเซเชเชงเชชเชพเชคเซเชฐ เชฐเซเชคเซ เชฒเชพเชเซ เชฅเชตเชพเชจเชพ เช เชตเชเชพเชถเชจเซ เชตเชฟเชธเซเชคเซเชค เชเชฐเซ เชเซ เชคเซ เชถเซเชฐเซเชก เชฎเซเชฎเชฐเซ เช เชจเซ เชเชฐเซเชจเชฒ เชนเซเชฒเซเชชเชฐ เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชเซ. BPF เชฎเชพเช, เชถเซเชฐเซเชก เชฎเซเชฎเชฐเซเชจเซ เชเชนเซเชตเชพเชคเชพ เชจเชเชถเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฒเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ - เชเซเชเซเชเชธ API เชธเชพเชฅเซ เชถเซเชฐ เชเชฐเซเชฒ เชกเซเชเชพ เชธเซเชเซเชฐเชเซเชเชฐเซเชธ. เชคเซเชฎเชจเซ เชเชฆเชพเช เช เชจเชพเชฎ เชฎเชณเซเชฏเซเช เชเชพเชฐเชฃ เชเซ เชฆเซเชเชพเชตเชพเชจเซ เชชเซเชฐเชฅเชฎ เชชเซเชฐเชเชพเชฐเชจเซ เชจเชเชถเซ เชนเซเชถ เชเซเชฌเชฒ เชนเชคเซ. เชชเชเซ เชเชฐเซ เชฆเซเชเชพเชฏเชพ, เชธเซเชฅเชพเชจเชฟเช (เชธเซเชชเซเชฏเซ เชฆเซเช ) เชนเซเชถ เชเซเชทเซเชเชเซ เช เชจเซ เชธเซเชฅเชพเชจเชฟเช เชเชฐเซ, เชธเชฐเซเช เชเซเชฐเซ, เชฌเซเชชเซเชเชซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเชพ เชจเชฟเชฐเซเชฆเซเชถเช เชงเชฐเชพเชตเชคเชพ เชจเชเชถเชพ เช เชจเซ เชเชฃเซเช เชฌเชงเซเช. เชนเชตเซ เช เชฎเชพเชฐเชพ เชฎเชพเชเซ เชฐเชธเชชเซเชฐเชฆ เชฌเชพเชฌเชค เช เชเซ เชเซ BPF เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชนเชตเซ เชเซเชฒเซเชธ เชตเชเซเชเซ เชธเซเชเซเชเชฎเซเชจเซเช เชเชพเชฒเซ เชฐเชพเชเชตเชพเชจเซ เช เชจเซ เชคเซเชจเซ เช เชจเซเชฏ เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เช เชจเซ เชฏเซเชเชฐ เชธเซเชชเซเชธ เชธเชพเชฅเซ เชถเซเชฐ เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชงเชฐเชพเชตเซ เชเซ.
เชธเชฟเชธเซเชเชฎ เชเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชฎเชพเชเชฅเซ เชจเชเชถเชพเชจเซ เชเชเซเชธเซเชธ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ bpf(2)
, เช
เชจเซ เชธเชนเชพเชฏเช เชเชพเชฐเซเชฏเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชฐเซเชจเชฒเชฎเชพเช เชเชพเชฒเชคเชพ BPF เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธเชฎเชพเชเชฅเซ. เชตเชงเซเชฎเชพเช, เชธเชนเชพเชฏเชเซ เชฎเชพเชคเซเชฐ เชจเชเชถเชพ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เช เชจเชนเซเช, เชชเชฃ เช
เชจเซเชฏ เชเชฐเซเชจเชฒ เชเซเชทเชฎเชคเชพเชเชจเซ เชเชเซเชธเซเชธ เชเชฐเชตเชพ เชฎเชพเชเซ เชชเชฃ เช
เชธเซเชคเชฟเชคเซเชต เชงเชฐเชพเชตเซ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชฌเซเชชเซเชเชซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชชเซเชเซเชเซเชจเซ เช
เชจเซเชฏ เชเชจเซเชเชฐเชซเซเชธ เชชเชฐ เชซเซเชฐเชตเชฐเซเชก เชเชฐเชตเชพ, เชชเชฐเซเชซ เชเชตเซเชจเซเชเซเชธ เชเชจเชฐเซเช เชเชฐเชตเชพ, เชเชฐเซเชจเชฒ เชธเซเชเซเชฐเชเซเชเชฐเซเชธเชจเซ เชเชเซเชธเซเชธ เชเชฐเชตเชพ เชตเชเซเชฐเซ เชฎเชพเชเซ เชนเซเชฒเซเชชเชฐ เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ.
เชธเชพเชฐเชพเชเชถเชฎเชพเช, BPF เชเชฐเซเชจเชฒ เชธเซเชชเซเชธเชฎเชพเช เชเชฐเซเชฌเชฟเชเชฐเซ, เชเชเชฒเซ เชเซ เชตเซเชฐเชฟเชซเชพเชฏเชฐ-เชเซเชธเซเชเซเชก, เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเซเชกเชจเซ เชฒเซเชก เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ. เช เชเซเชก เชเซเชฒเซเชธ เชตเชเซเชเซเชจเซ เชธเซเชฅเชฟเชคเชฟเชจเซ เชฌเชเชพเชตเซ เชถเชเซ เชเซ เช เชจเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชธเซเชชเซเชธ เชธเชพเชฅเซ เชกเซเชเชพเชจเซเช เชตเชฟเชจเชฟเชฎเชฏ เชเชฐเซ เชถเชเซ เชเซ, เช เชจเซ เช เชชเซเชฐเชเชพเชฐเชจเชพ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชฎเชเชเซเชฐ เชเชฐเชพเชฏเซเชฒ เชเชฐเซเชจเชฒ เชธเชฌเชธเชฟเชธเซเชเชฎเซเชธเชจเซ เชเชเซเชธเซเชธ เชชเชฃ เชงเชฐเชพเชตเซ เชเซ.
เช เชชเชนเซเชฒเซเชฅเซ เช เชเชฐเซเชจเชฒ เชฎเซเชกเซเชฏเซเชฒเซ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเซ เชชเชพเชกเชตเชพเชฎเชพเช เชเชตเซเชฒ เชเซเชทเชฎเชคเชพเช เชเซเชตเซเช เช เชเซ, เชเซเชจเซ เชคเซเชฒเชจเชพเชฎเชพเช BPF เชจเชพ เชเซเชเชฒเชพเช เชซเชพเชฏเชฆเชพ เชเซ (เช เชฒเชฌเชคเซเชค, เชคเชฎเซ เชซเชเซเชค เชธเชฎเชพเชจ เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธเชจเซ เชคเซเชฒเชจเชพ เชเชฐเซ เชถเชเซ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชธเชฟเชธเซเชเชฎ เชเซเชฐเซเชธเชฟเชเช - เชคเชฎเซ BPF เชธเชพเชฅเซ เชฎเชจเชธเซเชตเซ เชกเซเชฐเชพเชเชตเชฐ เชฒเชเซ เชถเชเชคเชพ เชจเชฅเซ). เชคเชฎเซ เชจเซเชเซ เชเชจเซเชเซเชฐเซ เชฅเซเชฐเซเชถเซเชฒเซเชก เชจเซเชเชงเซ เชถเชเซ เชเซ (เชเซเชเชฒเซเช เชเชชเชฏเซเชเชฟเชคเชพเช เชเซ เชเซ BPF เชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ เชคเซเชฎเชพเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชเชฐเซเชจเชฒ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชเซเชถเชฒเซเชฏ เช เชฅเชตเชพ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชเซเชถเชฒเซเชฏ เชนเซเชตเซเช เชเชฐเซเชฐเซ เชจเชฅเซ), เชฐเชจเชเชพเชเชฎ เชธเชฒเชพเชฎเชคเซ (เชเซเช เชฒเชเชคเซ เชตเชเชคเซ เชธเชฟเชธเซเชเชฎ เชคเซเชกเซ เชจเชฅเซ เชคเซเชฎเชจเชพ เชฎเชพเชเซ เชเชฟเชชเซเชชเชฃเซเชเชฎเชพเช เชคเชฎเชพเชฐเซ เชนเชพเชฅ เชเชเชเซ เชเชฐเซ. เช เชฅเชตเชพ เชฎเซเชกเซเชฏเซเชฒเซเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเซ), เชเชเซเชฎเซเชธเซเชเซ - เชฎเซเชกเซเชฏเซเชฒเซเชจเซ เชซเชฐเซเชฅเซ เชฒเซเชก เชเชฐเชคเซ เชตเชเชคเซ เชกเชพเชเชจเชเชพเชเชฎ เชนเซเชฏ เชเซ, เช เชจเซ BPF เชธเชฌเชธเชฟเชธเซเชเชฎ เชเชพเชคเชฐเซ เชเชฐเซ เชเซ เชเซ เชเซเช เชเชตเซเชจเซเช เชเซเชเซ เชจ เชเชพเชฏ (เชเชเชฟเชค เชเชนเซเช เชคเซ, เช เชคเชฎเชพเชฎ เชชเซเชฐเชเชพเชฐเชจเชพ BPF เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชฎเชพเชเซ เชธเชพเชเซเช เชจเชฅเซ).
เชเชตเซ เชเซเชทเชฎเชคเชพเชเชจเซ เชนเชพเชเชฐเซ BPF เชจเซ เชเชฐเซเชจเชฒเชจเชพ เชตเชฟเชธเซเชคเชฐเชฃ เชฎเชพเชเซ เชเช เชธเชพเชฐเซเชตเชคเซเชฐเชฟเช เชธเชพเชงเชจ เชฌเชจเชพเชตเซ เชเซ, เชเซ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช เชชเซเชทเซเชเชฟ เชฅเชฏเซเชฒ เชเซ: BPF เชฎเชพเช เชตเชงเซ เช เชจเซ เชตเชงเซ เชจเชตเชพ เชชเซเชฐเชเชพเชฐเชจเชพ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชตเชงเซ เช เชจเซ เชตเชงเซ เชฎเซเชเซ เชเชเชชเชจเซเช เชฒเชกเชพเชฏเช เชธเชฐเซเชตเชฐ 24ร7 เชชเชฐ BPF เชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ. เชธเซเชเชพเชฐเซเชเช เชชเซเชธ เชฌเซเชชเซเชเชซ เชชเชฐ เชเชงเชพเชฐเชฟเชค เชเชตเชพ เชธเซเชฒเซเชฏเซเชถเชจเซเชธ เชชเชฐ เชคเซเชฎเชจเซ เชตเซเชฏเชตเชธเชพเชฏ เชฌเชจเชพเชตเซ เชเซ. BPF เชจเซ เชเชชเชฏเซเช เชฆเชฐเซเช เชเชเซเชฏเชพเช เชฅเชพเชฏ เชเซ: DDoS เชนเซเชฎเชฒเชพเช เชธเชพเชฎเซ เชฐเชเซเชทเชฃ เชเชฐเชตเชพ, SDN เชฌเชจเชพเชตเชตเชพ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, kubernetes เชฎเชพเชเซ เชจเซเชเชตเชฐเซเช เชฒเชพเชเซ เชเชฐเชตเชพ), เชฎเซเชเซเชฏ เชธเชฟเชธเซเชเชฎ เชเซเชฐเซเชธเชฟเชเช เชเซเชฒ เช เชจเซ เชเชเชเชกเชพ เชเชฒเซเชเซเชเชฐ เชคเชฐเซเชเซ, เชเชจเซเชเซเชฐเซเชเชจ เชกเชฟเชเซเชเซเชถเชจ เชธเชฟเชธเซเชเชฎเซเชธ เช เชจเซ เชธเซเชจเซเชกเชฌเซเชเซเชธ เชธเชฟเชธเซเชเชฎเซเชธ เชตเชเซเชฐเซเชฎเชพเช.
เชเชพเชฒเซ เชฒเซเชเชจเชพ เชตเชฟเชนเชเชเชพเชตเชฒเซเชเชจ เชญเชพเชเชจเซ เช เชนเซเช เชธเชฎเชพเชชเซเชค เชเชฐเซเช เช เชจเซ เชตเชฐเซเชเซเชฏเซเช เชฒ เชฎเชถเซเชจ เช เชจเซ BPF เชเชเซเชธเชฟเชธเซเชเชฎเชจเซ เชตเชงเซ เชตเชฟเชเชคเชตเชพเชฐ เชเซเชเช.
เชตเชฟเชทเชฏเชพเชเชคเชฐ: เชเชชเชฏเซเชเชฟเชคเชพเช
เชจเซเชเซเชจเชพ เชตเชฟเชญเชพเชเซเชฎเชพเช เชเชฆเชพเชนเชฐเชฃเซ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชธเชเซเชทเชฎ เชฅเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชเชเชพเชฎเชพเช เชเชเซ เชธเชเชเซเชฏเชพเชฌเชเชง เชเชชเชฏเซเชเชฟเชคเชพเชเชจเซ เชเชฐเซเชฐ เชชเชกเซ เชถเชเซ เชเซ. llvm
/clang
bpf เชเชงเชพเชฐ เชธเชพเชฅเซ เช
เชจเซ bpftool
. เชตเชฟเชญเชพเชเชฎเชพเช
BPF เชตเชฐเซเชเซเชฏเซเช เชฒ เชฎเชถเซเชจ เชฐเชเชฟเชธเซเชเชฐ เช เชจเซ เชธเซเชเชจเชพ เชธเชฟเชธเซเชเชฎ
BPF เชจเซ เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เช เชจเซ เชเชฎเชพเชจเซเชก เชธเชฟเชธเซเชเชฎ เช เชนเชเซเชเชคเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฐเชพเชเซเชจเซ เชตเชฟเชเชธเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ เชเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ C เชญเชพเชทเชพเชฎเชพเช เชฒเชเชตเชพเชฎเชพเช เชเชตเชถเซ เช เชจเซ, เชเชฐเซเชจเชฒเชฎเชพเช เชฒเซเชก เชฅเชฏเชพ เชชเชเซ, เชฎเซเชณ เชเซเชกเชฎเชพเช เช เชจเซเชตเชพเชฆเชฟเชค เชฅเชถเซ. เชคเซเชฅเซ, เชเชพเชฃเชฟเชคเชฟเช เช เชฐเซเชฅเชฎเชพเช, เชเชงเซเชจเชฟเช เชฎเชถเซเชจเซเชจเซ เชเซเชทเชฎเชคเชพเชเชจเชพ เชเชเชคเชฐเชเซเชฆ เชชเชฐ เชจเชเชฐ เชฐเชพเชเซเชจเซ เชฐเชเชฟเชธเซเชเชฐเชจเซ เชธเชเชเซเชฏเชพ เช เชจเซ เชเชฆเซเชถเซเชจเซ เชธเชฎเซเชน เชชเชธเชเชฆ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ. เชตเชงเซเชฎเชพเช, เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชชเชฐ เชตเชฟเชตเชฟเชง เชจเชฟเชฏเชเชคเซเชฐเชฃเซ เชฒเชพเชฆเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชคเชพเชเซเชคเชฐเชฎเชพเช เชธเซเชงเซ เชฒเซเชชเซเชธ เช เชจเซ เชธเชฌเชฐเซเชเชฟเชจ เชฒเชเชตเชพเชจเซเช เชถเชเซเชฏ เชจ เชนเชคเซเช, เช เชจเซ เชธเซเชเชจเชพเชเชจเซ เชธเชเชเซเชฏเชพ 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 เชฎเชพเชเซ เชเซเชเชชเชฃ เชฌเชพเชเชจเชฐเซ เชซเชพเชเชฒเชจเซ เชฎเซเชจเซเชฏเซเช เชฒเซ เชกเชฟเชธเชเชธเซเชฎเซเชฌเชฒ เชเชฐเซ. เชฒเซเชเชฎเชพเช เชชเชเซเชฅเซ เชธเชพเชฎเชเซเชฐเซเชจเซ เชเชเซเชเซเชค เชเชฐเชตเชพ เชฎเชพเชเซ, เช เชฎเซ เชตเซเชฐเชฟเชซเชพเชฏเชฐ, JIT เชเชฎเซเชชเชพเชเชฒเชฐ, เชเซเชฒเชพเชธเชฟเช 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
, เชนเชเชฎเซเชถเชจเซ เชเซเชฎ, เชเชเชณเชจเซ เชธเซเชเชจเชพเชจเซเช เชธเชฐเชจเชพเชฎเซเช เชธเชฎเชพเชตเซ เชเซ. เชเซเชฒเซเชฒเซ, JMP เชตเชฐเซเช 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 เชเชฌเซเชเซเชเซเชเซเชธเชจเซเช เชเซเชตเชจเชเชเซเชฐ, bpffs เชซเชพเชเชฒ เชธเชฟเชธเซเชเชฎ
(เช เชชเซเชเชพเชตเชฟเชญเชพเชเชฎเชพเช เชตเชฐเซเชฃเชตเซเชฒ เชเซเชเชฒเซเช เชตเชฟเชเชคเซ เชฎเซเช เชธเซเชชเซเชฐเชฅเชฎ เชถเซเชเซ
BPF เชเชฌเซเชเซเชเซเชเซเชธ - เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เช
เชจเซ เชจเชเชถเชพ - เชเชฆเซเชถเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเชเซเชฏเชพเชฎเชพเชเชฅเซ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ BPF_PROG_LOAD
ะธ BPF_MAP_CREATE
เชธเชฟเชธเซเชเชฎ เชเซเชฒ bpf(2)
, เช
เชฎเซ เชเชเชณเชจเชพ เชตเชฟเชญเชพเชเชฎเชพเช เช เชเซเชตเซ เชฐเซเชคเซ เชฅเชพเชฏ เชเซ เชคเซ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซเชถเซเช. เช เชเชฐเซเชจเชฒ เชกเซเชเชพ เชธเซเชเซเชฐเชเซเชเชฐเซเชธ เชฌเชจเชพเชตเซ เชเซ เช
เชจเซ เชคเซ เชฆเชฐเซเช เชฎเชพเชเซ refcount
(เชธเชเชฆเชฐเซเชญ เชเชฃเชคเชฐเซ) เชเช เชชเชฐ เชธเซเช เชเซ, เช
เชจเซ เชเชฌเซเชเซเชเซเช เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซเชถ เชเชฐเชคเซ เชซเชพเชเชฒ เชตเชฐเซเชฃเชจเชเชฐเซเชคเชพ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชชเชฐเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชนเซเชจเซเชกเชฒ เชฌเชเชง เชฅเชฏเชพ เชชเชเซ refcount
เชเชฌเซเชเซเชเซเช เชเช เชฆเซเชตเชพเชฐเชพ เชเชเชพเชกเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เช
เชจเซ เชเซเชฏเชพเชฐเซ เชคเซ เชถเซเชจเซเชฏ เชธเซเชงเซ เชชเชนเซเชเชเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชเชฌเซเชเซเชเซเช เชจเชพเชถ เชชเชพเชฎเซ เชเซ.
เชเซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชจเชเชถเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ, เชคเซ เชชเชเซ refcount
เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฒเซเชก เชเชฐเซเชฏเชพ เชชเชเซ เช เชจเชเชถเชพเชฎเชพเช เชเชเชฅเซ เชเช เชตเชงเชพเชฐเซ เชฅเชพเชฏ เชเซ, เชเชเชฒเซ เชเซ. เชคเซเชฎเชจเชพ เชซเชพเชเชฒ เชตเชฐเซเชฃเชจเชเชฐเซเชคเชพเชเชจเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเชเชฅเซ เช
เชจเซ เชนเชเซ เชชเชฃ เชฌเชเชง เชเชฐเซ เชถเชเชพเชฏ เชเซ refcount
เชถเซเชจเซเชฏ เชฌเชจเชถเซ เชจเชนเซเช:
เชชเซเชฐเซเชเซเชฐเชพเชฎ เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช เชฒเซเชก เชเชฐเซเชฏเชพ เชชเชเซ, เช
เชฎเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชคเซเชจเซ เช
เชฎเซเช เชชเซเชฐเชเชพเชฐเชจเชพ เชเชตเซเชจเซเช เชเชจเชฐเซเชเชฐ เชธเชพเชฅเซ เชเซเชกเซเช เชเซเช. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เช
เชฎเซ เชเชจเชเชฎเชฟเชเช เชชเซเชเซเชเซ เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เช
เชฅเชตเชพ เชคเซเชจเซ เชเซเชเชฒเชพเช เชธเชพเชฅเซ เชเชจเซเชเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชคเซเชจเซ เชจเซเชเชตเชฐเซเช เชเชจเซเชเชฐเชซเซเชธ เชชเชฐ เชฎเซเชเซ เชถเชเซเช เชเซเช tracepoint
เชเซเชฐ เชฎเชพเช. เช เชฌเชฟเชเชฆเซเช, เชธเชเชฆเชฐเซเชญ เชเชพเชเชจเซเชเชฐ เชชเชฃ เชเชเชฅเซ เชตเชงเชถเซ เช
เชจเซ เช
เชฎเซ เชฒเซเชกเชฐ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฎเชพเช เชซเชพเชเชฒ เชตเชฐเซเชฃเชจเชเชฐเซเชคเชพเชจเซ เชฌเชเชง เชเชฐเซ เชถเชเซเชถเซเช.
เชเซ เชเชชเชฃเซ เชนเชตเซ เชฌเซเชเชฒเซเชกเชฐ เชฌเชเชง เชเชฐเซเช เชคเซ เชถเซเช เชฅเชถเซ? เชคเซ เชเชตเซเชจเซเช เชเชจเชฐเซเชเชฐ (เชนเซเช) เชจเชพ เชชเซเชฐเชเชพเชฐ เชชเชฐ เชเชงเชพเชฐเชฟเชค เชเซ. เชฒเซเชกเชฐ เชชเซเชฐเซเชฃ เชฅเชฏเชพ เชชเชเซ เชฌเชงเชพ เชจเซเชเชตเชฐเซเช เชนเซเชเซเชธ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชฐเชนเซเชถเซ, เช เชเชนเซเชตเชพเชคเชพ เชตเซเชถเซเชตเชฟเช เชนเซเชเซเชธ เชเซ. เช เชจเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซเชฐเซเชธ เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชคเซเชฎเชจเซ เชฌเชจเชพเชตเซเชฒ เชเซ เชคเซ เชธเชฎเชพเชชเซเชค เชฅเชฏเชพ เชชเชเซ เชฐเชฟเชฒเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ (เช เชจเซ เชคเซเชฅเซ เชคเซเชจเซ "เชธเซเชฅเชพเชจเชฟเช เชฅเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ" เชธเซเชงเซ เชธเซเชฅเชพเชจเชฟเช เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ). เชเซเชเซเชจเชฟเชเชฒ เชฐเซเชคเซ, เชธเซเชฅเชพเชจเชฟเช เชนเซเชเซเชธเชฎเชพเช เชนเชเชฎเซเชถเชพ เชฏเซเชเชฐ เชธเซเชชเซเชธเชฎเชพเช เช เชจเซเชฐเซเชช เชซเชพเชเชฒ เชกเชฟเชธเซเชเซเชฐเชฟเชชเซเชเชฐ เชนเซเชฏ เชเซ เช เชจเซ เชคเซเชฅเซ เชเซเชฏเชพเชฐเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชฌเชเชง เชนเซเชฏ เชคเซเชฏเชพเชฐเซ เชฌเชเชง เชฅเชพเชฏ เชเซ, เชชเชฐเชเชคเซ เชตเซเชถเซเชตเชฟเช เชนเซเชเซเชธ เชเชตเซเช เชจเชฅเซ เชเชฐเชคเชพ. เชจเซเชเซเชจเซ เชเชเซเชคเชฟเชฎเชพเช, เชฐเซเชก เชเซเชฐเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เชนเซเช เชฌเชคเชพเชตเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช เชเซเช เชเซ เชฒเซเชกเชฐ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชธเชฎเชพเชชเซเชคเชฟ เชธเซเชฅเชพเชจเชฟเช เช เชจเซ เชตเซเชถเซเชตเชฟเช เชนเซเชเซเชธเชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช เชเชฌเซเชเซเชเซเชเชจเชพ เชเซเชตเชจเชเชพเชณเชจเซ เชเซเชตเซ เชฐเซเชคเซ เช เชธเชฐ เชเชฐเซ เชเซ.
เชธเซเชฅเชพเชจเชฟเช เช เชจเซ เชตเซเชถเซเชตเชฟเช เชนเซเช เชตเชเซเชเซ เชถเชพ เชฎเชพเชเซ เชคเชซเชพเชตเชค เชเซ? เช เชฎเซเช เชชเซเชฐเชเชพเชฐเชจเชพ เชจเซเชเชตเชฐเซเช เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชเชฒเชพเชตเชตเซเช เช เชฏเซเชเชฐเชธเซเชชเซเชธ เชตเชฟเชจเชพ เช เชฐเซเชฅเชชเซเชฐเซเชฃ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, DDoS เชธเซเชฐเชเซเชทเชพเชจเซ เชเชฒเซเชชเชจเชพ เชเชฐเซ - เชฌเซเชเชฒเซเชกเชฐ เชจเชฟเชฏเชฎเซ เชฒเชเซ เชเซ เช เชจเซ BPF เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชจเซเชเชตเชฐเซเช เชเชจเซเชเชฐเชซเซเชธ เชธเชพเชฅเซ เชเซเชกเซ เชเซ, เชเซ เชชเชเซ เชฌเซเชเชฒเซเชกเชฐ เชเชเชจเซ เชชเซเชคเชพเชจเซ เชเชพเชคเชจเซ เชฎเชพเชฐเซ เชถเชเซ เชเซ. เชฌเซเชเซ เชคเชฐเชซ, เชคเชฎเซ เชฆเชธ เชฎเชฟเชจเชฟเชเชฎเชพเช เชคเชฎเชพเชฐเชพ เชเซเชเชเชฃ เชชเชฐ เชฒเชเซเชฒเชพ เชกเชฟเชฌเชเซเชเช เชเซเชฐเซเชธ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชเชฒเซเชชเชจเชพ เชเชฐเซ - เชเซเชฏเชพเชฐเซ เชคเซ เชชเซเชฐเซเชฃ เชฅเช เชเชพเชฏ, เชคเซเชฏเชพเชฐเซ เชคเชฎเซ เชเชเซเชเซ เชเซ เชเซ เชธเชฟเชธเซเชเชฎเชฎเชพเช เชเซเช เชเชเชฐเซ เชฌเชพเชเซ เชจ เชฐเชนเซ เช เชจเซ เชธเซเชฅเชพเชจเชฟเช เชนเซเชเซเชธ เชคเซเชจเซ เชเชพเชคเชฐเซ เชเชฐเชถเซ.
เชฌเซเชเซ เชฌเชพเชเซ, เชเชฒเซเชชเชจเชพ เชเชฐเซ เชเซ เชคเชฎเซ เชเชฐเซเชจเชฒเชฎเชพเช เชเซเชฐเซเชธเชชเซเชเชจเซเช เชธเชพเชฅเซ เชเซเชกเชพเชตเชพ เชฎเชพเชเชเซ เชเซ เช
เชจเซ เชเชฃเชพ เชตเชฐเซเชทเซเชฅเซ เชเชเชเชกเชพ เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซ. เช เชเชฟเชธเซเชธเชพเชฎเชพเช, เชคเชฎเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเชพ เชญเชพเชเชจเซ เชชเซเชฐเซเชฃ เชเชฐเชตเชพ เช
เชจเซ เชธเชฎเชฏเชพเชเชคเชฐเซ เชเชเชเชกเชพ เชชเชฐ เชชเชพเชเชพ เชซเชฐเชตเชพ เชฎเชพเชเชเซ เชเซ. bpf เชซเชพเชเชฒ เชธเชฟเชธเซเชเชฎ เช เชคเช เชชเซเชฐเซ เชชเชพเชกเซ เชเซ. เชคเซ เชเช เชเชจ-เชฎเซเชฎเชฐเซ-เชเชจเซเชฒเซ เชธเซเชฏเซเชกเซ-เชซเชพเชเชฒ เชธเชฟเชธเซเชเชฎ เชเซ เชเซ BPF เชเชฌเซเชเซเชเซเชเซเชธเชจเซ เชธเชเชฆเชฐเซเชญ เชเชชเชคเซ เชซเชพเชเชฒเซ เชฌเชจเชพเชตเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ เช
เชจเซ เชคเซเชจเชพ เชเชพเชฐเชฃเซ เชตเชงเชพเชฐเซ เชฅเชพเชฏ เชเซ. refcount
เชตเชธเซเชคเซเช เช เชชเชเซ, เชฒเซเชกเชฐ เชฌเชนเชพเชฐ เชจเซเชเชณเซ เชถเชเซ เชเซ, เช
เชจเซ เชคเซเชฃเซ เชฌเชจเชพเชตเซเชฒเซ เชตเชธเซเชคเซเช เชเซเชตเชเชค เชฐเชนเซเชถเซ.
BPF เชเชฌเซเชเซเชเซเชเซเชธเชจเซ เชธเชเชฆเชฐเซเชญ เชเชชเชคเชพ bpffs เชฎเชพเช เชซเชพเชเชฒเซ เชฌเชจเชพเชตเชตเชพเชจเซ "เชชเชฟเชจเชฟเชเช" เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ (เชเซเชฎ เชเซ เชจเซเชเซเชจเชพ เชถเชฌเซเชฆเชธเชฎเซเชนเชฎเชพเช: "เชชเซเชฐเชเซเชฐเชฟเชฏเชพ 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 เชเชพเชฐเซเชฏเชเซเชฐเชฎเซ
เชฌเชงเชพ 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 เชธเซเชเชจเชพเชเชจเซ เชธเชฎเซเชน เชฒเซ เชเซ เช
เชจเซ เชคเซเชจเซ เชเชฐเซเชจเชฒเชฎเชพเช เชฒเซเชก เชเชฐเซ เชเซ. เชฒเซเชกเชฟเชเชเชจเซ เชเซเชทเชฃเซ, เชตเซเชฐเชฟเชซเชพเชฏเชฐ เชฒเซเชเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เช
เชจเซ เชชเชเซ JIT เชเชฎเซเชชเชพเชเชฒเชฐ เช
เชจเซ, เชธเชซเชณ เช
เชฎเชฒเซเชเชฐเชฃ เชชเชเซ, เชชเซเชฐเซเชเซเชฐเชพเชฎ เชซเชพเชเชฒ เชตเชฐเซเชฃเชจเชเชฐเซเชคเชพ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชชเชฐเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เช
เชฎเซ เช
เชเชพเชเชจเชพ เชตเชฟเชญเชพเชเชฎเชพเช เชคเซเชจเซ เชธเชพเชฅเซ เชเชเชณ เชถเซเช เชฅเชพเชฏ เชเซ เชคเซ เชเซเชฏเซเช
เชนเชตเซ เชเชชเชฃเซ เชเช เชเชธเซเชเชฎ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฒเชเซเชถเซเช เชเซ เชเช เชธเชพเชฆเซ 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
เชเซเชจเซ เชตเซเชถเซเชตเชฟเช ID 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)
, เชชเชฐเชเชคเซ เชตเชพเชเชฌเซเชคเชพเชฎเชพเช, เช
เชฎเชพเชฐเซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเซเชฌ เช เชธเชฐเชณ เชเซ, เช
เชจเซ เชฌเชฟเชจ-เชคเซเชเซเช เชเชพเชฐเซเชฏเชเซเชฐเชฎเซ เชฎเชพเชเซ JIT เชเชฎเซเชชเชพเชเชฒเชฐ เชฆเซเชตเชพเชฐเชพ เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซเชฒ เชชเซเชฐเชธเซเชคเชพเชตเชจเชพ เช
เชจเซ เชเชชเชธเชเชนเชพเชฐเชจเซ เชเชฐเซเชฐ เชเซ.
เชจเชเชถเชพ
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 เชเซ. เชธเชฟเชธเซเชเชฎ เชชเชฐเชจเซ เชเซเชเชชเชฃ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเชฆเซเชถเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชนเชพเชฒเชจเชพ เชจเชเชถเชพเชจเซ เชเซเชฒเชตเชพ เชฎเชพเชเซ เช 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
: เชนเชพเชฒเชจเชพ เชจเชเชถเชพเชจเซ เชคเซเชจเชพ เชตเซเชถเซเชตเชฟเช 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 เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธเชฎเชพเชเชฅเซ เชจเชเชถเชพเชจเซ เชเชชเชฏเซเช เชเซเชตเซ เชฐเซเชคเซ เชเชฐเซ เชถเชเซเช เชคเซ เชเซเชตเชพเชจเซเช เชคเชพเชฐเซเชเชฟเช เชเซ. เช
เชฎเซ เชฎเชถเซเชจ เชฎเซเชเซเชฐเซ เชเซเชกเซเชธเชฎเชพเช เชนเชพเชฐเซเชก-เชเซ-เชฐเซเชก เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธเชจเซ เชญเชพเชทเชพเชฎเชพเช เช เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซ เชถเชเซเช เชเซเช, เชชเชฐเชเชคเซ เชนเชเซเชเชคเชฎเชพเช 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 เชฐเซเชชเซเชเซเชเชฐเซ เชเชฎเซเชฐเซ, เช
เชฎเซ เชคเซ เช เชเชฐเซเชถเซเช:
$ 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)
. BPF เชชเซเชฐเซเชเซเชฐเชพเชฎ เชชเซเชคเซ เชเซ 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
. เชเชพเชฒเซ เชคเซเชฃเซเชจเซเช ID เชถเซเชงเซเช:
# 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
เชเชเช เชจเชตเซเช! เชชเซเชฐเซเชเซเชฐเชพเชฎเซ เช
เชฎเชพเชฐเซ เชธเซ เชธเซเชฐเซเชธ เชซเชพเชเชฒเชจเชพ เชนเชฟเชธเซเชธเชพเชจเซ เชฎเซเชฆเซเชฐเชฟเชค เชเชฐเซเชฏเชพ เชเซ. เช เชฒเชพเชเชฌเซเชฐเซเชฐเซ เชฆเซเชตเชพเชฐเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช 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 เชนเซเชฒเซเชชเชฐ เชซเชเชเซเชถเชจ เชตเซเชฏเชพเชเซเชฏเชพเช Linux เชธเชฟเชธเซเชเชฎ เชเซเชฒ เชตเซเชฏเชพเชเซเชฏเชพเช เชเซเชตเซ เช เชเซ. เช
เชนเซเช, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชซเชเชเซเชถเชจเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ เชเซเชฎเชพเช เชเซเช เชฆเชฒเซเชฒเซ เชจเชฅเซ. (เชเช เชเชพเชฐเซเชฏ เชเซ เชฒเซ เชเซ, เชเชนเซ, เชคเซเชฐเชฃ เชฆเชฒเซเชฒเซ เชฎเซเชเซเชฐเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ 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
};
เชเชเชฒเซ เชเซ, เชฆเชฐเซเช เชชเซเชฐเชเชพเชฐเชจเชพ BPF เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฎเชพเชเซ, เชชเซเชฐเชเชพเชฐเชจเชพ เชกเซเชเชพ เชธเซเชเซเชฐเชเซเชเชฐ เชฎเชพเชเซ เชจเชฟเชฐเซเชฆเซเชถเช เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ 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_*
เชฐเชนเชธเซเชฏเชตเชพเชฆเซ เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ
เชคเซเชฅเซ, เช เชฎเซ เชเซเชฒเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ BPF เชชเซเชฐเซเชเซเชฐเชพเชฎเชฎเชพเชเชฅเซ เชจเชเชถเชพเชจเซ เชเชเซเชธเซเชธ เชเชฐเซ เชถเชเซเช เชเซเช
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 เชฌเชจเชพเชตเชคเชพ เชนเชคเชพ เชคเซเช เชเชจเชฒเชพเชเชจ Linux เชธเชฎเซเชฆเชพเชฏเชฎเชพเชเชฅเซ เชนเชคเชพ, เชเซเชจเซ เช
เชฐเซเชฅ เชเซ เชเซ เชคเซเช เชคเซเชฎเชจเชพ เชฎเชพเชเซ เชธเซเชฅเซ เชตเชงเซ เชชเชฐเชฟเชเชฟเชค เชนเชคเชพ (เชชเชฐเชเชคเซ เชจเชนเซเช เชธเชพเชฎเชพเชจเซเชฏ เชฒเซเชเซ) เชเชฐเซเชจเชฒ เชธเชพเชฅเซ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชฎเชพเชเซ เชเชจเซเชเชฐเชซเซเชธ: 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
, เชเซ เชชเซเชเซเชเชฎเชพเชเชฅเซ เชธเชชเซเชฒเชพเชฏ เชเชฐเซ เชถเชเชพเชฏ เชเซ. เชเซ เชเซ, BPF เชตเชฟเชเชพเชธ เชนเซเช เชณ เชเซ เชคเซ เชนเชเซเชเชคเชจเซ เชเชพเชฐเชฃเซ, เชเชฐเซเชจเชฒ เช
เชจเซ เชเซเชฒเซเชธ เชธเชคเชค เชฌเชฆเชฒเชพเชคเชพ เชฐเชนเซ เชเซ, เชเซ เชคเชฎเซ 2019 เชฅเซ เชเซเชจเชพ เชเชฎเชพเชจเชพเชจเซ เชชเชฆเซเชงเชคเชฟเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ BPF เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชฒเชเชตเชพ เชฎเชพเชเชเชคเชพ เชจเชฅเซ, เชคเซ เชคเชฎเชพเชฐเซ เชเชฎเซเชชเชพเชเชฒ เชเชฐเชตเซเช เชชเชกเชถเซ.
llvm
/clang
pahole
- เชคเซเชจเซ เชฎเซเชเซเชฏ เชญเชพเช
bpftool
(เชธเชเชฆเชฐเซเชญ เชฎเชพเชเซ, เช เชตเชฟเชญเชพเช เช เชจเซ เชฒเซเชเชจเชพ เชคเชฎเชพเชฎ เชเชฆเชพเชนเชฐเชฃเซ เชกเซเชฌเชฟเชฏเชจ 10 เชชเชฐ เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ.)
llvm/clang
BPF LLVM เชธเชพเชฅเซ เชฎเซเชคเซเชฐเซเชชเซเชฐเซเชฃ เชเซ เช
เชจเซ, เชเซ เชเซ เชคเชพเชเซเชคเชฐเชฎเชพเช BPF เชฎเชพเชเซเชจเชพ เชเชพเชฐเซเชฏเชเซเชฐเชฎเซ gcc เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชธเชเชเชฒเชฟเชค เชเชฐเซ เชถเชเชพเชฏ เชเซ, เชคเชฎเชพเชฎ เชตเชฐเซเชคเชฎเชพเชจ เชตเชฟเชเชพเชธ เชเชฒเชเชฒเชตเซเชเชฎ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชคเซเชฅเซ, เชธเซ เชชเซเชฐเชฅเชฎ, เช
เชฎเซ เชตเชฐเซเชคเชฎเชพเชจ เชธเชเชธเซเชเชฐเชฃ เชฌเชจเชพเชตเซเชถเซเช clang
เชเชฟเชเชฎเชพเชเชฅเซ:
$ 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
BTF เชซเซเชฐเซเชฎเซเชเชฎเชพเช เชกเซเชฌเชเซเชเช เชฎเชพเชนเชฟเชคเซ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชเชฐเซเชจเชฒ เชฌเชจเชพเชตเชคเซ เชตเชเชคเซ เชตเชชเชฐเชพเชฏ เชเซ. เช
เชฎเซ เช เชฒเซเชเชฎเชพเช 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
, Linux เชเชฐเซเชจเชฒเชจเชพ เชญเชพเช เชฐเซเชชเซ เชชเซเชฐเซเช เชชเชพเชกเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชคเซ 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
. -
เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ/networking/filter.txt - เชเซเชฒเชพเชธเชฟเช เช เชจเซ เชชเชเซ เชตเชฟเชธเซเชคเซเชค BPF เชฎเชพเชเซ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เชธเชพเชฅเซเชจเซ เชฎเซเชณ เชซเชพเชเชฒ. เชเซ เชคเชฎเซ เชเชธเซเชฎเซเชฌเชฒเซ เชฒเซเชเชเซเชตเซเช เช เชจเซ เชเซเชเชจเชฟเชเชฒ เชเชฐเซเชเชฟเชเซเชเซเชเชฐเชฒ เชตเชฟเชเชคเซเชจเซ เช เชญเซเชฏเชพเชธ เชเชฐเชตเชพ เชฎเชพเชเชเชคเชพ เชนเซเชต เชคเซ เชธเชพเชฐเซเช เชตเชพเชเชเชจ. -
เชซเซเชธเชฌเซเช เชชเชฐเชฅเซ BPF เชตเชฟเชถเซ เชฌเซเชฒเซเช . เชคเซ เชญเชพเชเซเชฏเซ เช เช เชชเชกเซเช เชฅเชพเชฏ เชเซ, เชชเชฐเชเชคเซ เชฏเซเชเซเชฏ เชฐเซเชคเซ, เชเชพเชฐเชฃ เชเซ เชเชฒเซเชเซเชธเซ เชธเซเชเชพเชฐเซเชตเซเชเชเซเชต (eBPF เชจเชพ เชฒเซเชเช) เช เชจเซ เชเชจเซเชฆเซเชฐเซ เชจเชพเชเซเชฐเชฟเชเซ - (เชเชพเชณเชตเชฃเซเชเชพเชฐ) เชคเซเชฏเชพเช เชฒเชเซ เชเซ.libbpf
). -
bpftool เชจเชพ เชฐเชนเชธเซเชฏเซ . bpftool เชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเชพ เชเชฆเชพเชนเชฐเชฃเซ เช เชจเซ เชฐเชนเชธเซเชฏเซ เชธเชพเชฅเซ เชเซเชตเซเชจเซเชเชฟเชจ เชฎเซเชจเซเช เชคเชฐเชซเชฅเซ เชเช เชฎเชจเซเชฐเชเชเช เชเซเชตเชฟเชเชฐ เชฅเซเชฐเซเชก. -
BPF เชฎเชพเช เชกเชพเชเชต เชเชฐเซ: เชตเชพเชเชเชจ เชธเชพเชฎเชเซเชฐเซเชจเซ เชธเซเชเชฟ . เชเซเชตเซเชจเซเชเชฟเชจ เชฎเซเชจเซเช เชคเชฐเชซเชฅเซ BPF เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃเชจเซ เชฒเชฟเชเชเซเชธเชจเซ เชตเชฟเชถเชพเชณ (เช เชจเซ เชนเชเซ เชชเชฃ เชเชพเชณเชตเชฃเซ) เชธเซเชเชฟ.
เชธเซเชฐเซเชธ: www.habr.com