เดคเตเดเดเตเดเดคเตเดคเดฟเตฝ เดเดฐเต เดธเดพเดเตเดเตเดคเดฟเดเดตเดฟเดฆเตเดฏ เดเดฃเตเดเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด
เดคเดฟเดจเต เดฌเดฟเดชเดฟเดเดซเต เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเดฟเดฐเตเดจเตเดจเต. เดเดเตเดเตพ เด
เดตเดณเต เดจเตเดเตเดเดฟ
เดเดเดฆเตเดถเด เดชเดฑเดเตเดเดพเตฝ, เดฒเดฟเดจเดเตเดธเต เดเตเตผเดฃเตฝ เดธเตโเดชเตเดฏเตโเดธเดฟเตฝ เด เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เดเดชเดฏเตเดเตเดคเต-เดตเดฟเดคเดฐเดฃ เดเตเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเตป BPF เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต, เดชเตเดคเดฟเดฏ เดเตผเดเตเดเดฟเดเตเดเตเดเตผ เดตเดณเดฐเต เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด เดคเดฟเดจเตเดฑเต เดเดฒเตเดฒเดพ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเดณเตเด เดตเดฟเดตเดฐเดฟเดเตเดเดพเตป เดเดเตเดเตพเดเตเดเต เดเดฐเต เดกเดธเตป เดฒเตเดเดจเดเตเดเตพ เดเตเดเดฟ เดเดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดฐเตเด. (เดเตเดตเดเตเดฏเตเดณเตเดณ เดชเตเดฐเดเดเดจ เดเตเดกเดฟเตฝ เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดฃเดพเดจเดพเดเตเดจเตเดจเดคเตเดชเตเดฒเต, เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดจเดจเตเดจเดพเดฏเดฟ เดเตเดฏเตเดฏเดพเดคเตเดค เดเดฐเตเดฏเตเดฐเต เดเดพเดฐเตเดฏเด, เดฎเดพเดจเตเดฏเดฎเดพเดฏ เดเดฐเต เดฒเตเดเต เดธเตเดทเตเดเดฟเดเตเดเตเด เดเดจเตเดจเดคเดพเดฃเต.)
เด เดฒเตเดเดจเด เดฌเดฟเดชเดฟเดเดซเต เดตเตเตผเดเตเดตเตฝ เดฎเตเดทเตเดจเตเดฑเต เดเดเดจ, เดฌเดฟเดชเดฟเดเดซเดฟเดจเตเดชเตเดชเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเตเตผเดฃเตฝ เดเดจเตเดฑเตผเดซเตเดธเตเดเตพ, เดตเดฟเดเดธเดจ เดเดชเดเดฐเดฃเดเตเดเตพ, เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดเดดเดฟเดตเตเดเดณเตเดเต เดเดฐเต เดนเตเดฐเดธเตเดตเดตเตเด เดตเดณเดฐเต เดนเตเดฐเดธเตเดตเดตเตเดฎเดพเดฏ เด
เดตเดฒเตเดเดจเด เดเดจเตเดจเดฟเดต เดตเดฟเดตเดฐเดฟเดเตเดเตเดจเตเดจเต, เด
เดคเดพเดฏเดคเต. เดฌเดฟเดชเดฟเดเดซเดฟเดจเตเดฑเต เดชเตเดฐเดพเดฏเตเดเดฟเด เดชเตเดฐเดฏเตเดเดเตเดเดณเตเดเตเดเตเดฑเดฟเดเตเดเต เดเดดเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเด เดจเดคเตเดคเดฟเดจเต เดญเดพเดตเดฟเดฏเดฟเตฝ เดจเดฎเตเดเตเดเต เดเดตเดถเตเดฏเดฎเดพเดฏเดคเตเดฒเตเดฒเดพเด.
เดฒเตเดเดจเดคเตเดคเดฟเดจเตเดฑเต เดธเดเดเตเดฐเดนเด
bpf(2)
.
ะะธัะตะผ ะฟัะพะณัะฐะผะผั BPF ั ะฟะพะผะพััั libbpf
.libbpf
. เดเดเตเดเตพ เดเดฐเต เด
เดเดฟเดธเตเดฅเดพเดจ BPF เดเดชเตเดฒเดฟเดเตเดเตเดทเตป เด
เดธเตเดฅเดฟเดเตเดเด เดธเตเดทเตเดเดฟเดเตเดเตเด, เด
เดคเต เดคเตเดเตผเดจเตเดจเตเดณเตเดณ เดเดฆเดพเดนเดฐเดฃเดเตเดเดณเดฟเตฝ เดเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเด.
เดฌเดฟเดชเดฟเดเดซเต เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดฒเตเดเตเดเตเดณเตเดณ เดเดฎเตเดเด
BPF เดเตผเดเตเดเดฟเดเตเดเตเดเตผ เดชเดฐเดฟเดเดฃเดฟเดเตเดเดพเตป เดคเตเดเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดฎเตเดชเต, เดเดเตเดเตพ เด
เดตเดธเดพเดจเดฎเดพเดฏเดฟ เดเดจเตเดจเต เดฑเดซเตผ เดเตเดฏเตเดฏเตเด (เด)
64-เดฌเดฟเดฑเตเดฑเต เดฎเตเดทเตเดจเตเดเตพ, เดเตเดฒเตเดกเต เดธเตเดตเดจเดเตเดเตพ, SDN เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเตเดณเตเดเดณเตเดเต เดตเตผเดฆเตเดงเดฟเดเตเด เดเดตเดถเตเดฏเดเดค เดเดจเตเดจเดฟเดตเดฏเตเดเต เดชเตเดฐเดคเดฟเดเดฐเดฃเดฎเดพเดฏเดพเดฃเต เดชเตเดคเดฟเดฏ BPF เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเดคเต.Sเดชเดฒเดชเตเดชเตเดดเตเด-dเดจเดฟเตผเดตเดเดฟเดเตเดเต nเดเดฑเตเดฑเตเดตเตผเดเตเดเดฟเดเดเต). เดเตเดฒเดพเดธเดฟเดเต BPF-เดจเต เดฎเตเดเตเดเดชเตเดชเตเดเตเด เดชเดเดฐเดเตเดเดพเดฐเดจเดพเดฏเดฟ เดเตเตผเดฃเตฝ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดเดเตเดเดฟเดจเตเดฏเตผเดฎเดพเตผ เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดเตเดคเตเดค, เดชเตเดคเดฟเดฏ BPF เด เดเตเดทเดฐเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดเดฑเต เดฎเดพเดธเดคเตเดคเดฟเดจเต เดถเตเดทเด เดฒเดฟเดจเดเตเดธเต เดธเดฟเดธเตเดฑเตเดฑเดเตเดเตพ เดเดฃเตเดเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฌเตเดฆเตเดงเดฟเดฎเตเดเตเดเตเดณเตเดณ เดฆเตเดคเตเดฏเดคเตเดคเดฟเตฝ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพ เดเดฃเตเดเตเดคเตเดคเดฟ, เดเดชเตเดชเตเตพ, เด เดคเต เดชเตเดฐเดคเตเดฏเดเตเดทเดชเตเดชเตเดเตเดเต เดเดฑเต เดตเตผเดทเดคเตเดคเดฟเดจเต เดถเตเดทเด, เดเดเตเดเตพเดเตเดเต เด เดเตเดคเตเดค เดฒเตเดเดจเด เดฎเตเดดเตเดตเตป เดเดตเดถเตเดฏเดฎเดพเดฃเต. เดตเดฟเดตเดฟเดง เดคเดฐเด เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดชเดเตเดเดฟเดเดชเตเดชเตเดเตเดคเตเดคเตเด.
เดฐเดธเดเดฐเดฎเดพเดฏ เดเดฟเดคเตเดฐเดเตเดเตพ
เด เดคเดฟเดจเตเดฑเต เดเตเดจเตเดฆเตเดฐเดคเตเดคเดฟเตฝ, เดธเตเดฐเดเตเดทเดฏเดฟเตฝ เดตเดฟเดเตเดเตเดตเตเดดเตเด เดเตเดฏเตเดฏเดพเดคเต เดเตเตผเดฃเตฝ เดธเตโเดชเตเดฏเตโเดธเดฟเตฝ "เด เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ" เดเตเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดธเดพเตปเดกเตโเดฌเตเดเตโเดธเต เดตเตเตผเดเตเดตเตฝ เดฎเตเดทเตเดจเดพเดฃเต BPF. เดฌเดฟเดชเดฟเดเดซเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดฏเตเดธเตผ เดธเตโเดชเตเดฏเตโเดธเดฟเตฝ เดธเตเดทเตโเดเดฟเดเตเดเตเดเดฏเตเด เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเตเดเตเดฏเตเดฏเตเดเดฏเตเด เดเดฟเดฒ เดเดตเดจเตเดฑเต เดเดฑเดตเดฟเดเดเตเดเดณเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดเดฐเต เดเดตเดจเตเดฑเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดฐเต เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดเดจเตเดฑเตผเดซเตเดธเดฟเดฒเตเดเตเดเต เดเดฐเต เดชเดพเดเตเดเดฑเตเดฑเต เดกเตเดฒเดฟเดตเดฑเดฟ, เดเดฟเดฒ เดเตเตผเดฃเตฝ เดซเดเดเตโเดทเดจเตเดฑเต เดธเดฎเดพเดฐเดเดญเด เดฎเตเดคเดฒเดพเดฏเดต เดเดเดพเด. เดเดฐเต เดชเดพเดเตเดเตเดเดฟเดจเตเดฑเต เดเดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเต เดชเดพเดเตเดเตเดเดฟเดจเตเดฑเต เดกเดพเดฑเตเดฑเดฏเดฟเดฒเตเดเตเดเตเด เดฎเตเดฑเตเดฑเดพเดกเดพเดฑเตเดฑเดฏเดฟเดฒเตเดเตเดเตเด เดเดเตโเดธเดธเต เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเตเด (เดตเดพเดฏเดจเดฏเตเดเตเดเตเด, เดเดฐเตเดชเดเตเดทเต, เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเตเดฑเต เดคเดฐเด เด เดจเตเดธเดฐเดฟเดเตเดเต เดเดดเตเดคเตเดจเตเดจเดคเดฟเดจเตเด); เดเดฐเต เดเตเตผเดฃเตฝ เดซเดเดเตโเดทเตป เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดฎเตเดชเตเตพ, เดเตผเดเตเดฏเตเดฎเตเดจเตเดฑเตเดเตพ เดเตเตผเดฃเตฝ เดฎเตเดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเตเดฏเดฟเดจเตเดฑเดฑเตเดเตพ เดเตพเดชเตเดชเตเดเตเดฏเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด.
เด เดชเตเดฐเดเตเดฐเดฟเดฏเดฏเตเดเตเดเตเดฑเดฟเดเตเดเต เดจเดฎเตเดเตเดเต เดเตเดเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเตเดเตเดเดพเด. เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดเตเดฒเดพเดธเดฟเดเต เดฌเดฟเดชเดฟเดเดซเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดเดฆเตเดฏ เดตเตเดฏเดคเตเดฏเดพเดธเดคเตเดคเตเดเตเดเตเดฑเดฟเดเตเดเต เดธเดเดธเดพเดฐเดฟเดเตเดเดพเด, เด เดคเดฟเดจเดพเดฏเดฟ เด เดธเดเดฌเตเดฒเดฑเดฟเตฝ เดเดดเตเดคเดฟเดฏ เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ. เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเดฟเตฝ, เดเตผเดเตเดเดฟเดเตเดเตเดเตผ เดตเดฟเดชเตเดฒเตเดเดฐเดฟเดเตเดเต, เด เดคเดฟเดจเดพเตฝ เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดฏเตผเดจเตเดจ เดคเดฒเดคเตเดคเดฟเดฒเตเดณเตเดณ เดญเดพเดทเดเดณเดฟเตฝ เดเดดเตเดคเดพเด, เดชเตเดฐเดพเดฅเดฎเดฟเดเดฎเดพเดฏเดฟ, เดคเตเตผเดเตเดเดฏเดพเดฏเตเด, เดธเดฟเดฏเดฟเตฝ. เดเดคเดฟเดจเดพเดฏเดฟ, llvm-เดจเตเดณเตเดณ เดเดฐเต เดฌเดพเดเตเดเตเตปเดกเต เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดเตเดคเตเดคเต, เดเดคเต BPF เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดจเดพเดฏเดฟ เดฌเตเดฑเตเดฑเตเดเตเดกเต เดธเตเดทเตเดเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต.
BPF เดเตผเดเตเดเดฟเดเตเดเตเดเตผ เดฐเตเดชเดเตฝเดชเตเดชเดจ เดเตเดฏเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต, เดญเดพเดเดฟเดเดฎเดพเดฏเดฟ, เดเดงเตเดจเดฟเด เดฎเตเดทเตเดจเตเดเดณเดฟเตฝ เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเดจเดพเดฃเต. เดเดคเต เดชเตเดฐเดพเดฏเตเดเดฟเดเดฎเดพเดเตเดเดพเตป, เดฌเดฟเดชเดฟเดเดซเต เดฌเตเดฑเตเดฑเตเดเตเดกเต, เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเต เดเตเดฏเตเดคเตเดเดดเดฟเดเตเดเดพเตฝ, เดเตเดเดเดฟ เดเดฎเตเดชเตเดฒเตผ (JIT เดเดเดชเตเดฒเตผ) เดเดจเตเดจ เดเดเดเด เดเดชเดฏเตเดเดฟเดเตเดเต เดจเตเดฑเตเดฑเตเดตเต เดเตเดกเดฟเดฒเตเดเตเดเต เดตเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตเดฏเดชเตเดชเตเดเตเดจเตเดจเต.Just In Time). เด
เดเตเดคเตเดคเดคเดพเดฏเดฟ, เดจเดฟเดเตเดเตพ เดเตผเดเตเดเตเดจเตเดจเตเดฃเตเดเตเดเตเดเดฟเตฝ, เดเตเดฒเดพเดธเดฟเดเต BPF-เตฝ เดชเตเดฐเตเดเตเดฐเดพเด เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเต เดเตเดฏเตเดฏเตเดเดฏเตเด เดเดตเดจเตเดฑเต เดเดฑเดตเดฟเดเดคเตเดคเดฟเดฒเตเดเตเดเต เดเดฑเตเดฑเตเดฎเดฟเดเต เดเดฏเดฟ เดเดเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดคเต - เดเดฐเตเดฑเตเดฑ เดธเดฟเดธเตเดฑเตเดฑเด เดเตเดณเดฟเดจเตเดฑเต เดชเดถเตเดเดพเดคเตเดคเดฒเดคเตเดคเดฟเตฝ. เดชเตเดคเดฟเดฏ เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเตฝ, เดเดคเต เดฐเดฃเตเดเต เดเดเตเดเดเตเดเดณเดฟเดฒเดพเดฏเดพเดฃเต เดธเดเดญเดตเดฟเดเตเดเตเดจเตเดจเดคเต - เดเดฆเตเดฏเด, เดธเดฟเดธเตเดฑเตเดฑเด เดเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดเตเดกเต เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต. bpf(2)
เดคเตเดเตผเดจเตเดจเต, เดชเดฟเดจเตเดจเตเดเต, เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเตเดฑเต เดคเดฐเด เด
เดจเตเดธเดฐเดฟเดเตเดเต เดตเตเดฏเดคเตเดฏเดพเดธเดชเตเดชเตเดเตเดจเตเดจ เดฎเดฑเตเดฑเต เดฎเตเดเตเดเดพเดจเดฟเดธเดเตเดเดณเดฟเดฒเตเดเต, เดชเตเดฐเตเดเตเดฐเดพเด เดเดตเดจเตเดฑเต เดเดฑเดตเดฟเดเดคเตเดคเดฟเดฒเตเดเตเดเต เด
เดฑเตเดฑเดพเดเตเดเตเดเตเดฏเตเดฏเตเดจเตเดจเต.
เดเดตเดฟเดเต เดตเดพเดฏเดจเดเตเดเดพเดฐเดจเต เดเดฐเต เดเตเดฆเตเดฏเด เดเดฃเตเดเดพเดฏเตเดเตเดเดพเด: เด เดคเต เดธเดพเดงเตเดฏเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต? เด เดคเตเดคเดฐเด เดเตเดกเดฟเดจเตเดฑเต เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเตเดฐเดเตเดท เดเดเตเดเดจเตเดฏเดพเดฃเต เดเดฑเดชเตเดชเต เดจเตฝเดเตเดจเตเดจเดคเต? เดตเตเดฐเดฟเดซเดฏเตผ (เดเดเดเตเดฒเตเดทเดฟเตฝ เด เดเดเตเดเดคเตเดคเต เดตเตเดฐเดฟเดซเดฏเตผ เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเตเดจเตเดจเต, เดเดพเตป เดเดเดเตเดฒเตเดทเต เดตเดพเดเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต เดคเตเดเดฐเตเด):
เดตเตเดฐเดฟเดซเดฏเตผ เดเดฐเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เด เดจเดฒเตเดธเดฑเดพเดฃเต, เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเด เดเตเตผเดฃเดฒเดฟเดจเตเดฑเต เดธเดพเดงเดพเดฐเดฃ เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเต เดคเดเดธเตเดธเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจเดฟเดฒเตเดฒเตเดจเตเดจเต เดเดฑเดชเตเดชเดพเดเตเดเตเดจเตเดจเต. เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเต เดคเดเดธเตเดธเดชเตเดชเตเดเตเดคเตเดคเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒเตเดจเตเดจเต เดเดคเต เด เตผเดคเตเดฅเดฎเดพเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ - เดคเดฐเด เด เดจเตเดธเดฐเดฟเดเตเดเต, เดฌเดฟเดชเดฟเดเดซเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเต เดเตเตผเดฃเตฝ เดฎเตเดฎเตเดฎเดฑเดฟเดฏเตเดเต เดตเดฟเดญเดพเดเดเตเดเตพ เดตเดพเดฏเดฟเดเตเดเดพเดจเตเด เดฎเดพเดฑเตเดฑเดฟเดฏเตเดดเตเดคเดพเดจเตเด เดเดดเดฟเดฏเตเด, เดซเดเดเตเดทเดจเตเดเดณเตเดเต เดฎเตเดฒเตเดฏเดเตเดเตพ เดฎเดเดเตเดเดฟเดจเตฝเดเตเด, เดเตเดฐเดฟเด เดเตเดฏเตเดฏเตเด, เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเตเด, เดตเตเดฃเตเดเตเด เดเดดเตเดคเตเด เดเตเดเดพเดคเต เดซเตเตผเดตเตเดกเต เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดชเตเดฒเตเด. เดเดฐเต เดฌเดฟเดชเดฟเดเดซเต เดชเตเดฐเตเดเตเดฐเดพเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเต เดเตเตผเดฃเดฒเดฟเดจเต เดเตเดฐเดพเดทเต เดเตเดฏเตเดฏเดฟเดฒเตเดฒเตเดจเตเดจเตเด เดจเดฟเดฏเดฎเดเตเดเตพ เด เดจเตเดธเดฐเดฟเดเตเดเต, เดฑเตเดฑเตเดฑเต เดเดเตโเดธเดธเต เดเดณเตเดณ เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดเตเดเตโเดเตเดฏเดฟเดเดเต เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเตเดฑเต เดกเดพเดฑเตเดฑเดฏเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเต เดชเตเดฑเดคเตเดคเต เดเตเตผเดฃเตฝ เดฎเตเดฎเตเดฎเดฑเดฟ เดชเตเดจเดฐเดพเดฒเตเดเดจเด เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒเตเดจเตเดจเตเด เดตเตเดฐเดฟเดซเดฏเตผ เดเดฑเดชเตเดชเต เดจเตฝเดเตเดจเตเดจเต. BPF-เดจเตเดฑเต เดฎเดฑเตเดฑเตเดฒเตเดฒเดพ เดเดเดเดเตเดเดณเตเด เดชเดฐเดฟเดเดฏเดชเตเดชเตเดเตเดเดคเดฟเดจเต เดถเตเดทเด, เด เดจเตเดฌเดจเตเดง เดตเดฟเดญเดพเดเดคเตเดคเดฟเตฝ เดเดเตเดเตพ เดตเตเดฐเดฟเดซเดฏเดฑเดฟเดจเต เดเตเดฑเดเตเดเตเดเตเดเดฟ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเด.
เด
เดชเตเดชเตเตพ เดจเดฎเตเดฎเตพ เดเดคเตเดตเดฐเต เดเดจเตเดคเดพเดฃเต เดชเด เดฟเดเตเดเดคเต? เดเดชเดฏเตเดเตเดคเดพเดตเต เดธเดฟเดฏเดฟเตฝ เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเด เดเดดเตเดคเตเดจเตเดจเต, เดเดฐเต เดธเดฟเดธเตเดฑเตเดฑเด เดเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เด
เดคเต เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต bpf(2)
, เด
เดตเดฟเดเต เด
เดคเต เดเดฐเต เดตเตเดฐเดฟเดซเดฏเตผ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเต เดจเตเดฑเตเดฑเตเดตเต เดฌเตเดฑเตเดฑเตเดเตเดกเดฟเดฒเตเดเตเดเต เดตเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดคเตเดเตผเดจเตเดจเต เด
เดคเต เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดฎเดฑเตเดฑเตเดฐเต เดเดชเดฏเตเดเตเดคเดพเดตเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเต เดเดตเดจเตเดฑเต เดเดฑเดตเดฟเดเดคเตเดคเดฟเดฒเตเดเตเดเต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเตเด เด
เดคเต เดเดเตเดธเดฟเดเตเดฏเตเดเตเดเต เดเตเดฏเตเดฏเดพเตป เดคเตเดเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดฌเตเดเตเดเตเด เดเดฃเดเตเดทเดจเตเด เดตเตเตผเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เดชเดฒ เดเดพเดฐเดฃเดเตเดเดณเดพเตฝ เดเดตเดถเตเดฏเดฎเดพเดฃเต. เดเดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดเดฐเต เดตเตเดฐเดฟเดซเดฏเตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเต เดคเดพเดฐเดคเดฎเตเดฏเตเดจ เดเตเดฒเดตเตเดฑเดฟเดฏเดคเดพเดฃเต, เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเด เดจเดฟเดฐเดตเดงเดฟ เดคเดตเดฃ เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเตเดเต เดเดเตเดเตพ เดเดฎเตเดชเตเดฏเตเดเตเดเตผ เดธเดฎเดฏเด เดชเดพเดดเดพเดเตเดเตเดจเตเดจเต. เดฐเดฃเตเดเดพเดฎเดคเดพเดฏเดฟ, เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเด เดเดเตเดเดจเต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต เดเดจเตเดจเดคเต เด
เดคเดฟเดจเตเดฑเต เดคเดฐเดคเตเดคเต เดเดถเตเดฐเดฏเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต, เดเตเดเดพเดคเต เดเดฐเต เดตเตผเดทเด เดฎเตเดฎเตเดชเต เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเด เดเดฐเต "เดธเดพเตผเดตเดคเตเดฐเดฟเด" เดเดจเตเดฑเตผเดซเตเดธเต เดชเตเดคเดฟเดฏ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเต เด
เดจเตเดฏเตเดเตเดฏเดฎเดฒเตเดฒเดพเดฏเดฟเดฐเดฟเดเตเดเดพเด. (เดเดชเตเดชเตเตพ เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏ เดเตเดเตเดคเตฝ เดชเดเตเดตเดค เดชเตเดฐเดพเดชเดฟเดเตเดเตเดจเตเดจเตเดฃเตเดเตเดเตเดเดฟเดฒเตเด, เด เดเดจเตเดฑเตผเดซเตเดธเต เดคเดฒเดคเตเดคเดฟเตฝ เดเดเตเดเดฐเดฟเดเตเดเดพเดจเตเดณเตเดณ เดเดฐเต เดเดถเดฏเดฎเตเดฃเตเดเต. libbpf
.)
เดจเดฎเตเดฎเตพ เดเดคเตเดตเดฐเต เดเดฟเดคเตเดฐเดเตเดเตพ เดชเตเตผเดคเตเดคเดฟเดฏเดพเดเตเดเดฟเดฏเดฟเดเตเดเดฟเดฒเตเดฒเตเดจเตเดจเต เดถเตเดฐเดฆเตเดงเดฏเตเดณเตเดณ เดตเดพเดฏเดจเดเตเดเดพเดฐเตป เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเดเตเดเดพเด. เดคเตเตผเดเตเดเดฏเดพเดฏเตเด, เดเตเดฒเดพเดธเดฟเดเต เดฌเดฟเดชเดฟเดเดซเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเตเดเตเดคเตเดคเตเดฎเตเดชเตเตพ เดฌเดฟเดชเดฟเดเดซเต เด เดเดฟเดธเตเดฅเดพเดจเดชเดฐเดฎเดพเดฏเดฟ เดเดฟเดคเตเดฐเด เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเต เดเดจเตเดคเตเดเตเดฃเตเดเดพเดฃเตเดจเตเดจเต เดฎเตเดเดณเดฟเตฝ เดชเดฑเดเตเดเดตเดฏเตเดฒเตเดฒเดพเด เดตเดฟเดถเดฆเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ. เดชเตเดฐเดฏเตเดเดเตเดทเดฎเดคเดฏเตเดเต เดตเตเดฏเดพเดชเตเดคเดฟ เดเดฃเตเดฏเดฎเดพเดฏเดฟ เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจ เดฐเดฃเตเดเต เดชเตเดคเตเดฎเดเตพ เดชเดเตเดเดฟเดเตเด เดฎเตเดฎเตเดฎเดฑเดฟเดฏเตเด เดเตเตผเดฃเตฝ เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเดณเตเด เดเดชเดฏเตเดเดฟเดเตเดเดพเดจเตเดณเตเดณ เดเดดเดฟเดตเดพเดฃเต. BPF-เตฝ, เดชเดเตเดเดฟเดเตเด เดฎเตเดฎเตเดฎเดฑเดฟ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเต เดฎเดพเดชเตเดชเตเดเตพ เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเดต เดเดชเดฏเตเดเดฟเดเตเดเดพเดฃเต - เดเดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด API เดเดชเดฏเตเดเดฟเดเตเดเต เดชเดเตเดเดฟเดเตเด เดกเดพเดฑเตเดฑ เดเดเดจเดเตพ. เดเดฆเตเดฏเด เดชเตเดฐเดคเตเดฏเดเตเดทเดชเตเดชเตเดเตเดจเตเดจ เดฎเดพเดชเตเดชเต เดเดฐเต เดนเดพเดทเต เดเตเดฌเดฟเตพ เดเดฏเดคเตเดเตเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเดพเด เด เดตเตผเดเตเดเต เด เดชเตเดฐเต เดฒเดญเดฟเดเตเดเดคเต. เดชเดฟเดจเตเดจเตเดเต เด เดฑเตเดเตพ เดชเตเดฐเดคเตเดฏเดเตเดทเดชเตเดชเตเดเตเดเต, เดฒเตเดเตเดเตฝ (เดเดฐเต เดธเดฟเดชเดฟเดฏเต) เดนเดพเดทเต เดเตเดฌเดฟเดณเตเดเดณเตเด เดฒเตเดเตเดเตฝ เด เดฑเตเดเดณเตเด, เดธเตเตผเดเตเดเต เดเตเดฐเตเดเดณเตเด, เดฌเดฟเดชเดฟเดเดซเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเตเดฏเดฟเดจเตเดฑเดฑเตเดเตพ เด เดเดเตเดเดฟเดฏ เดฎเดพเดชเตเดชเตเดเดณเตเด เดฎเดฑเตเดฑเตเด. เดเดชเตเดชเตเตพ เดเดเตเดเตพเดเตเดเต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดคเต, เดเตเดณเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เดจเดฟเดฒเดจเดฟเตฝเดเตเดเดพเดจเตเด เดฎเดฑเตเดฑเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเตเดฎเดพเดฏเตเด เดเดชเดฏเตเดเตเดคเต เดเดเดตเตเดฎเดพเดฏเตเด เดชเดเตเดเดฟเดเดพเดจเตเดณเตเดณ เดเดดเดฟเดตเต BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเต เดเดชเตเดชเตเตพ เดเดฃเตเดเต เดเดจเตเดจเดคเดพเดฃเต.
เดเดฐเต เดธเดฟเดธเตเดฑเตเดฑเด เดเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดเดชเดฏเตเดเตเดคเต เดชเตเดฐเดเตเดฐเดฟเดฏเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดชเตโเดธเต เดเดเตโเดธเดธเต เดเตเดฏเตเดฏเดชเตเดชเตเดเตเดจเตเดจเต bpf(2)
, เดเตเดเดพเดคเต เดนเตเตฝเดชเตเดชเตผ เดซเดเดเตโเดทเดจเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดเตเตผเดฃเดฒเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจ BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเตเด. เดเตเดเดพเดคเต, เดฎเดพเดชเตเดชเตเดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดฎเดฑเตเดฑเต เดเตเตผเดฃเตฝ เดเดดเดฟเดตเตเดเตพ เดเดเตเดธเดธเต เดเตเดฏเตเดฏเดพเดจเตเด เดธเดนเดพเดฏเดฟเดเตพ เดจเดฟเดฒเดตเดฟเดฒเตเดฃเตเดเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดฎเดฑเตเดฑเต เดเดจเตเดฑเตผเดซเตเดธเตเดเดณเดฟเดฒเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดเตเดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเตเด เดชเตเตผเดซเต เดเดตเดจเตเดฑเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดเตเตผเดฃเตฝ เดเดเดจเดเตพ เดเดเตโเดธเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด เดฌเดฟเดชเดฟเดเดซเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเต เดนเตเตฝเดชเตเดชเตผ เดซเดเดเตโเดทเดจเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเดพเด.
เดเตเดฐเตเดเตเดเดคเตเดคเดฟเตฝ, เดเตเตผเดฃเตฝ เดธเตโเดชเตเดฏเตโเดธเดฟเดฒเตเดเตเดเต เด เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ, เด เดคเดพเดฏเดคเต เดตเตเดฐเดฟเดซเดฏเตผ-เดเตเดธเตเดฑเตเดฑเต เดเตเดฏเตโเดค เดเดชเดฏเตเดเตเดคเต เดเตเดกเต เดฒเตเดกเต เดเตเดฏเตเดฏเดพเดจเตเดณเตเดณ เดเดดเดฟเดตเต BPF เดจเตฝเดเตเดจเตเดจเต. เด เดเตเดกเดฟเดจเต เดเตเดณเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เด เดตเดธเตเดฅ เดธเดเดฐเดเตเดทเดฟเดเตเดเดพเดจเตเด เดเดชเดฏเตเดเตเดคเต เดเดเด เดเดชเดฏเตเดเดฟเดเตเดเต เดกเดพเดฑเตเดฑ เดเตเดฎเดพเดฑเตเดฑเด เดเตเดฏเตเดฏเดพเดจเตเด เดเดดเดฟเดฏเตเด, เดเตเดเดพเดคเต เดเดคเตเดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเตเดฐเตเดเตเดฐเดพเด เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจ เดเตเตผเดฃเตฝ เดธเดฌเตเดธเดฟเดธเตเดฑเตเดฑเดเตเดเดณเดฟเดฒเตเดเตเดเตเดณเตเดณ เดเดเตโเดธเดธเตเดธเตเด เดเดฃเตเดเต.
เดเดคเต เดเดคเดฟเดจเดเด เดคเดจเตเดจเต เดเตเตผเดฃเตฝ เดฎเตเดกเตเดฏเตเดณเตเดเตพ เดจเตฝเดเตเดจเตเดจ เดเดดเดฟเดตเตเดเตพเดเตเดเต เดธเดฎเดพเดจเดฎเดพเดฃเต, เดเดคเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเตเดเตเดคเตเดคเตเดฎเตเดชเตเตพ เดฌเดฟเดชเดฟเดเดซเดฟเดจเต เดเดฟเดฒ เดเตเดฃเดเตเดเดณเตเดฃเตเดเต (เดคเตเตผเดเตเดเดฏเดพเดฏเตเด, เดจเดฟเดเตเดเตพเดเตเดเต เดธเดฎเดพเดจเดฎเดพเดฏ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพ เดฎเดพเดคเตเดฐเดฎเต เดคเดพเดฐเดคเดฎเตเดฏเด เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดธเดฟเดธเตเดฑเตเดฑเด เดเตเดฐเตเดธเดฟเดเดเต - เดจเดฟเดเตเดเตพเดเตเดเต เดฌเดฟเดชเดฟเดเดซเต เดเดชเดฏเตเดเดฟเดเตเดเต เดเดฐเต เด เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เดกเตเดฐเตเดตเตผ เดเดดเตเดคเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ). เดเตเดฑเดเตเด เดเตปเดเตเดฐเดฟ เดคเตเดฐเตเดทเตเตพเดกเต (เดฌเดฟเดชเดฟเดเดซเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจ เดเดฟเดฒ เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟเดเตพเดเตเดเต เดเดชเดฏเตเดเตเดคเดพเดตเดฟเดจเต เดเตเตผเดฃเตฝ เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต เดเดดเดฟเดตเตเดเดณเต เดชเตเดคเตเดตเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต เดเดดเดฟเดตเตเดเดณเต เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ), เดฑเตบเดเตเด เดธเตเดฐเดเตเดท (เดเดดเตเดคเตเดฎเตเดชเตเตพ เดธเดฟเดธเตเดฑเตเดฑเด เดคเดเตผเดเตเดเดพเดคเตเดคเดตเตผเดเตเดเตเดณเตเดณ เด เดญเดฟเดชเตเดฐเดพเดฏเดเตเดเดณเดฟเตฝ เดจเดฟเดเตเดเดณเตเดเต เดเต เดเดฏเตผเดคเตเดคเตเด. เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเตเดธเตเดฑเตเดฑเดฟเดเดเต เดฎเตเดกเตเดฏเตเดณเตเดเตพ), เดเดฑเตเดฑเตเดฎเดฟเดธเดฟเดฑเตเดฑเดฟ - เดฎเตเดกเตเดฏเตเดณเตเดเตพ เดตเตเดฃเตเดเตเด เดฒเตเดกเตเดเตเดฏเตเดฏเตเดฎเตเดชเตเตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดธเดฎเดฏเดฎเตเดฃเตเดเต, เดเตเดเดพเดคเต เดเดตเดจเตเดฑเตเดเดณเตเดจเตเดจเตเด เดจเดทเตโเดเดชเตเดชเตเดเตเดจเตเดจเดฟเดฒเตเดฒเตเดจเตเดจเต BPF เดธเดฌเตโเดธเดฟเดธเตเดฑเตเดฑเด เดเดฑเดชเตเดชเดพเดเตเดเตเดจเตเดจเต (เดจเตเดฏเดพเดฏเดฎเดพเดฏเดฟ เดชเดฑเดเตเดเดพเตฝ, เดเดคเต เดเดฒเตเดฒเดพเดคเตเดคเดฐเด BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเตเด เดถเดฐเดฟเดฏเดฒเตเดฒ).
เด เดคเตเดคเดฐเด เดเดดเดฟเดตเตเดเดณเตเดเต เดธเดพเดจเตเดจเดฟเดงเตเดฏเด เดฌเดฟเดชเดฟเดเดซเดฟเดจเต เดเตเตผเดฃเตฝ เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดธเดพเตผเดตเดคเตเดฐเดฟเด เดเดชเดเดฐเดฃเดฎเดพเดเตเดเดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเต, เดเดคเต เดชเตเดฐเดพเดฏเตเดเดฟเดเดฎเดพเดฏเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต: เดเตเดเตเดคเตฝ เดเตเดเตเดคเตฝ เดชเตเดคเดฟเดฏ เดคเดฐเด เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดฌเดฟเดชเดฟเดเดซเดฟเดฒเตเดเตเดเต เดเตเตผเดเตเดเตเดจเตเดจเต, เดเตเดเตเดคเตฝ เดเตเดเตเดคเตฝ เดตเดฒเดฟเดฏ เดเดฎเตเดชเดจเดฟเดเตพ เดเตเดเดฌเดพเดฑเตเดฑเต เดธเตเตผเดตเดฑเตเดเดณเดฟเตฝ 24ร7 เดฌเดฟเดชเดฟเดเดซเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต, เดเตเดเตเดคเตฝ เดเตเดเตเดคเตฝ BPF เด เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟเดฏเตเดณเตเดณ เดชเดฐเดฟเดนเดพเดฐเดเตเดเตพ เด เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟเดฏเดพเดฃเต เดธเตเดฑเตเดฑเดพเตผเดเตเดเดชเตเดชเตเดเตพ เด เดตเดฐเตเดเต เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดเตเดเตเดเดฟเดชเตเดชเดเตเดเตเดเตเดจเตเดจเดคเต. เดเดฒเตเดฒเดพเดฏเดฟเดเดคเตเดคเตเด BPF เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต: DDoS เดเดเตเดฐเดฎเดฃเดเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดฐเดฟเดฐเดเตเดทเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด, SDN เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด (เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, kubernetes-เดจเดพเดฏเดฟ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด), เดชเตเดฐเดงเดพเดจ เดธเดฟเดธเตเดฑเตเดฑเด เดเตเดฐเตเดฏเตโเดธเดฟเดเดเต เดเดชเดเดฐเดฃเดฎเดพเดฏเตเด เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเดเตเดเดฃเดเตเดเตเดเตพ เดถเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดตเดฐเดพเดฏเตเด, เดจเตเดดเดเตเดเตเดเดฏเดฑเตเดฑเด เดเดฃเตเดเตเดคเตเดคเตฝ เดธเดเดตเดฟเดงเดพเดจเดเตเดเดณเดฟเดฒเตเด เดธเดพเตปเดกเตโเดฌเตเดเตโเดธเต เดธเดฟเดธเตเดฑเตเดฑเดเตเดเดณเดฟเดฒเตเด เดฎเตเดคเดฒเดพเดฏเดต.
เดฒเตเดเดจเดคเตเดคเดฟเดจเตเดฑเต เด เดตเดฒเตเดเดจ เดญเดพเดเด เดเดตเดฟเดเต เดชเตเตผเดคเตเดคเดฟเดฏเดพเดเตเดเดฟ เดตเตเตผเดเตเดตเตฝ เดฎเตเดทเตเดจเตเด เดฌเดฟเดชเดฟเดเดซเต เดเดเตเดเตเดธเดฟเดธเตเดฑเตเดฑเดตเตเด เดเตเดเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเตเดเตเดเดพเด.
เดตเตเดฏเดคเดฟเดเดฒเดจเด: เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟเดเตพ
เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดตเดฟเดญเดพเดเดเตเดเดณเดฟเดฒเต เดเดฆเดพเดนเดฐเดฃเดเตเดเตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเดเตเดเตพเดเตเดเต เดเตเดฑเดเตเดเดคเต เดจเดฟเดฐเดตเดงเดฟ เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟเดเตพ เดเดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดจเตเดจเตเดเตเดเดพเด llvm
/clang
bpf เดชเดฟเดจเตเดคเตเดฃเดฏเตเดเต เดเดชเตเดชเด bpftool
. เดตเดฟเดญเดพเดเดคเตเดคเดฟเตฝ
BPF เดตเตเตผเดเตเดตเตฝ เดฎเตเดทเตเตป เดฐเดเดฟเดธเตเดฑเตเดฑเดฑเตเดเดณเตเด เดเตปเดธเตเดเตเดฐเดเตเดทเตป เดธเดฟเดธเตเดฑเตเดฑเดตเตเด
เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดธเดฟ เดญเดพเดทเดฏเดฟเตฝ เดเดดเตเดคเตเดเดฏเตเด เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเต เดเตเดฏเตเดค เดถเตเดทเด เดจเตเดฑเตเดฑเตเดตเต เดเตเดกเดฟเดฒเตเดเตเดเต เดตเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตเดฏเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด เดเดจเตเดจ เดตเดธเตเดคเตเดค เดเดฃเดเตเดเดฟเดฒเตเดเตเดคเตเดคเดพเดฃเต เดฌเดฟเดชเดฟเดเดซเดฟเดจเตเดฑเต เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเตเด เดเดฎเดพเตปเดกเต เดธเดฟเดธเตเดฑเตเดฑเดตเตเด เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดเตเดคเตเดคเดคเต. เด เดคเดฟเดจเดพเตฝ, เดเดงเตเดจเดฟเด เดฏเดจเตเดคเตเดฐเดเตเดเดณเตเดเต เดเดดเดฟเดตเตเดเดณเตเดเต เดเดฃเดฟเดคเดถเดพเดธเตเดคเตเดฐเดชเดฐเดฎเดพเดฏ เด เตผเดคเตเดฅเดคเตเดคเดฟเตฝ, เดเดตเดฒเดฏเดฟเดฒเตเดเตเดเต เดเดฃเตเดฃเตเดตเตเดเตเดเดพเดฃเต เดฐเดเดฟเดธเตเดฑเตเดฑเดฑเตเดเดณเตเดเต เดเดฃเตเดฃเดตเตเด เดเดฎเดพเตปเดกเตเดเดณเตเดเต เดธเตเดฑเตเดฑเตเด เดคเดฟเดฐเดเตเดเตเดเตเดคเตเดคเดคเต. เดเตเดเดพเดคเต, เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเดฟเตฝ เดตเดฟเดตเดฟเดง เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเดเตเดเตพ เดเตผเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดเตเดเตเดฃเตเดเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด เดเตเดคเตเดคเดฟเดเต เดตเดฐเต เดฒเตเดชเตเดชเตเดเดณเตเด เดธเดฌเตเดฑเตเดเตเดเตเดจเตเดเดณเตเด เดเดดเตเดคเตเดจเตเดจเดคเต เดธเดพเดงเตเดฏเดฎเดฒเตเดฒเดพเดฏเดฟเดฐเตเดจเตเดจเต, เดเตเดเดพเดคเต เดจเดฟเตผเดฆเตเดฆเตเดถเดเตเดเดณเตเดเต เดเดฃเตเดฃเด 4096 เดเดฏเดฟ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต (เดเดชเตเดชเตเตพ เดชเตเดฐเดฟเดตเดฟเดฒเตเดเตเดกเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเต เดเดฐเต เดฆเดถเดฒเดเตเดทเด เดจเดฟเตผเดฆเตเดฆเตเดถเดเตเดเตพ เดตเดฐเต เดฒเตเดกเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเด).
เดฌเดฟเดชเดฟเดเดซเดฟเดจเต เดเดชเดฏเตเดเตเดคเดพเดเตเดเตพเดเตเดเต เดเดเตเดธเดธเต เดเตเดฏเตเดฏเดพเดตเตเดจเตเดจ เดชเดคเดฟเดจเตเดจเตเดจเต 64-เดฌเดฟเดฑเตเดฑเต เดฐเดเดฟเดธเตเดฑเตเดฑเดฑเตเดเตพ เดเดฃเตเดเต r0
-r10
เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเด เดเตเดฃเตเดเดฑเตเด. เดฐเดเดฟเดธเตเดฑเตเดฑเตผ เดเตเดฏเตเดฏเตเด r10
เดเดฐเต เดซเตเดฐเตเดฏเดฟเด เดชเตเดฏเดฟเดจเตเดฑเตผ เด
เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต, เดตเดพเดฏเดฟเดเตเดเดพเตป เดฎเดพเดคเตเดฐเด. เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเต เดฑเตบเดเตเดฎเดฟเตฝ 512-เดฌเตเดฑเตเดฑเต เดธเตเดฑเตเดฑเดพเดเตเดเดฟเดฒเตเดเตเดเตเด เดฎเดพเดชเตเดชเตเดเดณเตเดเต เดฐเตเดชเดคเตเดคเดฟเตฝ เด
เตบเดฒเดฟเดฎเดฟเดฑเตเดฑเดกเต เดฎเตเดฎเตเดฎเดฑเดฟ เดชเดเตเดเดฟเดเดฒเดฟเดฒเตเดเตเดเตเด เดเดเตเดธเดธเต เดเดฃเตเดเต.
BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเต เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดธเตเดฑเตเดฑเต เดชเตเดฐเตเดเตเดฐเดพเด-เดเตเดชเตเดชเต เดเตเตผเดฃเตฝ เดธเดนเดพเดฏเดฟเดเดณเตเด เด
เดเตเดคเตเดคเดเดพเดฒเดคเตเดคเดพเดฏเดฟ เดฑเตเดเตเดฒเตผ เดซเดเดเตเดทเดจเตเดเดณเตเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเตป เด
เดจเตเดตเดพเดฆเดฎเตเดฃเตเดเต. เดตเดฟเดณเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจ เดเดฐเต เดซเดเดเตโเดทเดจเตเด เดฐเดเดฟเดธเตเดฑเตเดฑเดฑเตเดเดณเดฟเตฝ เดชเดพเดธเดพเดเตเดเดฟเดฏ เด
เดเตเดเต เดเตผเดเตเดฏเตเดฎเตเดจเตเดฑเตเดเตพ เดตเดฐเต เดเดเตเดเตเดเดพเด r1
-r5
, เดเตเดเดพเดคเต เดฑเดฟเดเตเดเตเตบ เดฎเตเดฒเตเดฏเด เดเตเดฎเดพเดฑเตเดจเตเดจเต r0
. เดซเดเดเตเดทเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดเดเตเดเดฟเดฏเตเดคเตเดคเดฟเดฏ เดถเตเดทเด, เดฐเดเดฟเดธเตเดฑเตเดฑเดฑเตเดเดณเตเดเต เดเดณเตเดณเดเดเตเดเด เดเดฑเดชเตเดชเตเดจเตฝเดเตเดจเตเดจเต r6
-r9
เดฎเดพเดฑเดฟเดฒเตเดฒ.
เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฏ เดชเตเดฐเตเดเตเดฐเดพเด เดตเดฟเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดฐเดเดฟเดธเตเดฑเตเดฑเตผ เดเตเดฏเตเดฏเตเดจเตเดจเต r0
-r11
เดจเดฟเดฒเดตเดฟเดฒเต เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดจเตเดฑเต เดเดฌเดฟเด เดธเดตเดฟเดถเตเดทเดคเดเตพ เดเดฃเดเตเดเดฟเดฒเตเดเตเดคเตเดคเต, เดชเดฟเดจเตเดคเตเดฃเดฏเตเดเตเดเตเดจเตเดจ เดเดฒเตเดฒเดพ เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเตเดเดณเตเด เดฏเดฅเดพเตผเดคเตเดฅ เดฐเดเดฟเดธเตเดฑเตเดฑเดฑเตเดเดณเดฟเดฒเตเดเตเดเต เด
เดฆเตเดตเดฟเดคเตเดฏเดฎเดพเดฏเดฟ เดฎเดพเดชเตเดชเต เดเตเดฏเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดตเตเดฃเตเดเดฟ 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.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 เดฌเตเดจเดฑเดฟ เดเตเดกเตเดเตพ เดตเดพเดฏเดฟเดเตเดเดพเตป เดชเด เดฟเดเตเดเต, เดเดตเดถเตเดฏเดฎเตเดเตเดเดฟเตฝ เดเดคเต เดจเดฟเตผเดฆเตเดฆเตเดถเดตเตเด เดชเดพเดดเตโเดธเต เดเตเดฏเตเดฏเดพเตป เดคเดฏเตเดฏเดพเดฑเดพเดฃเต. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดชเตเดฐเดพเดฏเตเดเดฟเดเดฎเดพเดฏเดฟ เดธเตเดฑเตเดฑเดพเตปเดกเตเตผเดกเต เดเตเดณเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดกเดฟเดธเตเด เดธเดเดฌเตเดฒเดฟเดเดเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเต เดเตเดเตเดคเตฝ เดธเตเดเดฐเตเดฏเดชเตเดฐเดฆเดตเตเด เดตเตเดเดคเดฏเตเดฎเดพเดฃเตเดจเตเดจเต เดชเดฑเดฏเตเดฃเตเดเดคเดพเดฃเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต:
$ 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 เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเด เด เด
เดตเดธเดฐเด เดจเตฝเดเตเดจเตเดจเต. เดฌเดฟเดชเดฟเดเดซเต เดเดฌเตโเดเดเตโเดฑเตเดฑเตเดเดณเต เดชเดฐเดพเดฎเตผเดถเดฟเดเตเดเตเดจเตเดจ เดซเดฏเดฒเตเดเตพ เดธเตเดทเตโเดเดฟเดเตเดเดพเดจเตเด เด
เดคเตเดตเดดเดฟ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเดพเดจเตเด เด
เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจ เดเตป-เดฎเตเดฎเตเดฎเดฑเดฟ-เดเตบเดฒเดฟ เดธเตเดฏเตเดกเต-เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเดฎเดพเดฃเดฟเดคเต. 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
, เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดชเตเดฐเตเดเตเดเตเดเตเดชเตเดชเต เดเดฃเตเดเต:
#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 เดชเตเดฐเตเดเตเดฐเดพเด เดจเดฟเตผเดตเดเดฟเดเตเด เดถเตเดทเด, เดเดเตเดเตพ เด
เดคเต เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเตเดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเตเดเตเดเต เดจเตเดเตเดเตเดจเตเดจเต. เดเดเตเดเดณเตเดเต เดฎเดฟเดจเดฟเดฎเดฒเดฟเดธเตเดฑเตเดฑเต เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดเตพ attr
เดชเตเดฐเตเดเตเดฐเดพเด เดคเดฐเด, เดธเตเดฑเตเดฑเต, เดจเดฟเตผเดฆเตเดฆเตเดถเดเตเดเดณเตเดเต เดเดฃเตเดฃเด, เดเดตเดถเตเดฏเดฎเดพเดฏ เดฒเตเดธเตปเดธเต, เดชเตเดฐเต เดเดจเตเดจเดฟเดต เดเตพเดชเตเดชเตเดเตเดจเตเดจเต "woo"
, เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดคเดคเดฟเดจเต เดถเตเดทเด เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเด เดเดฃเตเดเตเดคเตเดคเดพเตป เดเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. เดชเตเดฐเตเดเตเดฐเดพเด, เดตเดพเดเตเดฆเดพเดจเด เดเตเดฏเตเดคเดคเตเดชเตเดฒเต, เดเดฐเต เดธเดฟเดธเตเดฑเตเดฑเด เดเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเตเดเตเดเต เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต bpf
.
เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเตเดฑเต เด
เดตเดธเดพเดจเด, เดชเตเดฒเตเดกเดฟเดจเต เด
เดจเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เด
เดจเดจเตเดคเดฎเดพเดฏ เดฒเตเดชเตเดชเดฟเตฝ เดเดเตเดเตพ เด
เดตเดธเดพเดจเดฟเดเตเดเตเดจเตเดจเต. เดเดคเต เดเตเดเดพเดคเต, เดธเดฟเดธเตเดฑเตเดฑเด เดเตเตพ เดเดเตเดเตพเดเตเดเต เดคเดฟเดฐเดฟเดเต เดจเตฝเดเดฟเดฏ เดซเดฏเตฝ เดกเดฟเดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตผ เด
เดเดฏเตเดเตเดเตเดฎเตเดชเตเตพ เดชเตเดฐเตเดเตเดฐเดพเด เดเตเตผเดฃเตฝ เดจเดถเดฟเดชเตเดชเดฟเดเตเดเตเด. bpf
, เดเดเตเดเตพ เด
เดคเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดเดพเดฃเดฟเดฒเตเดฒ.
เดถเดฐเดฟ, เดเดเตเดเตพ เดชเดฐเตเดเตเดทเดฃเดคเตเดคเดฟเดจเต เดคเดฏเตเดฏเดพเดฑเดพเดฃเต. เดคเดพเดดเต เดชเตเดฐเตเดเตเดฐเดพเด เด
เดธเดเดฌเดฟเตพ เดเตเดฏเตเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเด strace
เดเดฒเตเดฒเดพเด เดถเดฐเดฟเดฏเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเตเดฃเตเดเตเดฏเตเดจเตเดจเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเตป:
$ clang -g -O2 simple-prog.c -o simple-prog
$ sudo strace ./simple-prog
execve("./simple-prog", ["./simple-prog"], 0x7ffc7b553480 /* 13 vars */) = 0
...
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0x7ffe03c4ed50, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_V
ERSION(0, 0, 0), prog_flags=0, prog_name="woo", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS}, 72) = 3
pause(
เดเดฒเตเดฒเดพเด เดจเดจเตเดจเดพเดฏเดฟ, bpf(2)
เดเดเตเดเตพเดเตเดเต เดนเดพเตปเดกเดฟเตฝ 3 เดคเดฟเดฐเดฟเดเต เดจเตฝเดเดฟ, เดเดเตเดเตพ เด
เดจเดจเตเดคเดฎเดพเดฏ เดฒเตเดชเตเดชเดฟเดฒเตเดเตเดเต เดชเตเดฏเดฟ pause()
. เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเด เดเดฃเตเดเตเดคเตเดคเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเดพเด. เดเดคเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดเดเตเดเตพ เดฎเดฑเตเดฑเตเดฐเต เดเตเตผเดฎเดฟเดจเดฒเดฟเดฒเตเดเตเดเต เดชเตเดฏเดฟ เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเด bpftool
:
# bpftool prog | grep -A3 woo
390: xdp name woo tag 3b185187f1855c4c gpl
loaded_at 2020-08-31T24:66:44+0000 uid 0
xlated 16B jited 40B memlock 4096B
pids simple-prog(10381)
เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดเดฐเต เดฒเตเดกเต เดเตเดฏเตเดค เดชเตเดฐเตเดเตเดฐเดพเด เดเดฃเตเดเตเดจเตเดจเต เดเดเตเดเตพ เดเดพเดฃเตเดจเตเดจเต woo
เดเดเตเดณ เดเดกเดฟ 390 เดเดฃเต, เดจเดฟเดฒเดตเดฟเตฝ เดชเตเดฐเตเดเดคเดฟเดฏเดฟเดฒเดพเดฃเต simple-prog
เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดฒเตเดเตเดเต เดเตเดฃเตเดเดฟเดเตเดเดพเดฃเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดคเตเดฑเดจเตเดจ เดซเดฏเตฝ เดกเดฟเดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตผ เดเดฃเตเดเต (เด
เดเตเดเดจเตเดฏเตเดเตเดเดฟเตฝ simple-prog
เด
เดชเตเดชเตเตพ เดเตเดฒเดฟ เดชเตเตผเดคเตเดคเดฟเดฏเดพเดเตเดเตเด woo
เด
เดชเตเดฐเดคเตเดฏเดเตเดทเดฎเดพเดเตเด). เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเดคเตเดชเตเดฒเต, เดชเตเดฐเตเดเตเดฐเดพเด woo
BPF เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดฒเต เดฌเตเดจเดฑเดฟ เดเตเดกเตเดเดณเตเดเต 16 เดฌเตเดฑเตเดฑเตเดเตพ - เดฐเดฃเตเดเต เดจเดฟเตผเดฆเตเดฆเตเดถเดเตเดเตพ เดเดเตเดเตเดเตเดจเตเดจเต, เดเดจเตเดจเดพเตฝ เด
เดคเดฟเดจเตเดฑเต เดจเตเดฑเตเดฑเตเดตเต เดฐเตเดชเดคเตเดคเดฟเตฝ (x86_64) เดเดคเต เดเดคเดฟเดจเดเด 40 เดฌเตเดฑเตเดฑเตเดเตพ เดเดฃเต. เดเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเด เด
เดคเดฟเดจเตเดฑเต เดฏเดฅเดพเตผเดคเตเดฅ เดฐเตเดชเดคเตเดคเดฟเตฝ เดจเตเดเตเดเดพเด:
# bpftool prog dump xlated id 390
0: (b7) r0 = 2
1: (95) exit
เด เดคเตเดญเตเดคเดเตเดเดณเตเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เดเดจเดฟ JIT เดเดฎเตเดชเตเดฒเตผ เดธเตเดทเตเดเดฟเดเตเด เดเตเดกเต เดจเตเดเตเดเดพเด:
# bpftool prog dump jited id 390
bpf_prog_3b185187f1855c4c_woo:
0: nopl 0x0(%rax,%rax,1)
5: push %rbp
6: mov %rsp,%rbp
9: sub $0x0,%rsp
10: push %rbx
11: push %r13
13: push %r14
15: push %r15
17: pushq $0x0
19: mov $0x2,%eax
1e: pop %rbx
1f: pop %r15
21: pop %r14
23: pop %r13
25: pop %rbx
26: leaveq
27: retq
เดตเดณเดฐเต เดซเดฒเดชเตเดฐเดฆเดฎเดฒเตเดฒ exit(2)
, เดเดจเตเดจเดพเตฝ เดจเตเดฏเดพเดฏเดฎเดพเดฏเดฟ เดชเดฑเดเตเดเดพเตฝ, เดเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเด เดตเดณเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฃเต, เดจเดฟเดธเตเดธเดพเดฐเดฎเดฒเตเดฒเดพเดคเตเดค เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเต JIT เดเดเดชเตเดฒเตผ เดเตเตผเดคเตเดค เดเดฎเตเดเดตเตเด เดเดชเตเดชเดฟเดฒเตเดเตเด เดคเตเตผเดเตเดเดฏเดพเดฏเตเด เดเดตเดถเตเดฏเดฎเดพเดฃเต.
เดฎเดพเดชเตเดธเต
BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพเดเตเดเต เดฎเดฑเตเดฑเต BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเดฟเดฒเตเดเตเดเตเด เดเดชเดฏเตเดเตเดคเต เดธเตเดฅเดฒเดคเตเดคเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเดฟเดฒเตเดเตเดเตเด เดเดเตโเดธเดธเต เดเตเดฏเตเดฏเดพเดตเตเดจเตเดจ เดเดเดจเดพเดชเดฐเดฎเดพเดฏ เดฎเตเดฎเตเดฎเดฑเดฟ เดเดฐเดฟเดฏเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด. เด เดเดฌเตโเดเดเตเดฑเตเดฑเตเดเดณเต เดฎเดพเดชเตเดชเตเดเตพ เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเตเดจเตเดจเต, เดเดฐเต เดธเดฟเดธเตเดฑเตเดฑเด เดเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เด
เดต เดเดเตเดเดจเต เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเดพเดฎเตเดจเตเดจเต เด เดตเดฟเดญเดพเดเดคเตเดคเดฟเตฝ เดเดเตเดเตพ เดเดพเดฃเดฟเดเตเดเตเด bpf
.
เดฎเดพเดชเตเดชเตเดเดณเตเดเต เดเดดเดฟเดตเตเดเตพ เดชเดเตเดเดฟเดเตเด เดฎเตเดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเตเดเตเดเตเดณเตเดณ เดเดเตโเดธเดธเตเดธเดฟเตฝ เดฎเดพเดคเตเดฐเด เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเตเดเตเดจเตเดจเดฟเดฒเตเดฒเตเดจเตเดจเต เดจเดฎเตเดเตเดเต เดเดชเตเดชเตเตพ เดคเดจเตเดจเต เดชเดฑเดฏเดพเด. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเตเดฏเดฟเดจเตเดฑเดฑเตเดเตพ เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดเดจเตเดฑเตผเดซเตเดธเตเดเดณเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเตเดฏเดฟเดจเตเดฑเดฑเตเดเตพ, เดชเตเตผเดซเต เดเดตเดจเตเดฑเตเดเตพเดเตเดเตเดชเตเดชเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเดจเตเดณเตเดณ เดฎเดพเดชเตเดชเตเดเตพ เดฎเตเดคเดฒเดพเดฏเดต เด
เดเดเตเดเตเดจเตเดจ เดชเตเดฐเดคเตเดฏเตเด-เดเดฆเตเดฆเตเดถเตเดฏ เดฎเดพเดชเตเดชเตเดเตพ เดเดฃเตเดเต. เดตเดพเดฏเดจเดเตเดเดพเดฐเดจเต เดเดถเดฏเดเตเดเตเดดเดชเตเดชเดคเตเดคเดฟเดฒเดพเดเตเดเดพเดคเดฟเดฐเดฟเดเตเดเดพเตป เดเดเตเดเตพ เด
เดตเดฐเตเดเตเดเตเดฑเดฟเดเตเดเต เดเดตเดฟเดเต เดธเดเดธเดพเดฐเดฟเดเตเดเดฟเดฒเตเดฒ. เดเดคเตเดเตเดเดพเดคเต, เดธเดฎเดจเตเดตเดฏ เดชเตเดฐเดถเตเดจเดเตเดเตพ เดเดเตเดเตพ เด
เดตเดเดฃเดฟเดเตเดเตเดจเตเดจเต, เดเดพเดฐเดฃเด เดเดคเต เดเดเตเดเดณเตเดเต เดเดฆเดพเดนเดฐเดฃเดเตเดเตพเดเตเดเต เดชเตเดฐเดงเดพเดจเดฎเดฒเตเดฒ. เดฒเดญเตเดฏเดฎเดพเดฏ เดฎเดพเดชเตเดชเต เดคเดฐเดเตเดเดณเตเดเต เดชเตเตผเดฃเตเดฃเดฎเดพเดฏ เดฒเดฟเดธเตเดฑเตเดฑเต เดเดคเดฟเตฝ เดเดพเดฃเดพเด <linux/bpf.h>
BPF_MAP_TYPE_HASH
.
เดจเดฟเดเตเดเตพ C++ เดเดจเตเดจเดคเดฟเตฝ เดเดฐเต เดนเดพเดทเต เดเตเดฌเดฟเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดจเดฟเดเตเดเตพ เดชเดฑเดฏเตเด unordered_map<int,long> woo
, เดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเตฝ "เดเดจเดฟเดเตเดเต เดเดฐเต เดฎเตเดถ เดตเตเดฃเด woo
เดชเดฐเดฟเดงเดฟเดฏเดฟเดฒเตเดฒเดพเดคเตเดค เดตเดฒเตเดชเตเดชเด, เด
เดคเดฟเดจเตเดฑเต เดเตเดเตพ เดคเดฐเด int
, เดฎเตเดฒเตเดฏเดเตเดเตพ เดคเดฐเด long
" เดเดฐเต เดฌเดฟเดชเดฟเดเดซเต เดนเดพเดทเต เดเตเดฌเดฟเตพ เดธเตเดทเตโเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดชเดเตเดเดฟเดเดฏเตเดเต เดชเดฐเดฎเดพเดตเดงเดฟ เดตเดฒเตเดชเตเดชเด เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเดฃเด เดเดจเตเดจเดคเตเดดเดฟเดเตเดเดพเตฝ, เดเดเตเดเตพ เดเดฐเต เดเดพเดฐเตเดฏเด เดคเดจเตเดจเต เดเตเดฏเตเดฏเตเดฃเตเดเดคเตเดฃเตเดเต, เดเตเดเดพเดคเต เดเตเดเดณเตเดเตเดฏเตเด เดฎเตเดฒเตเดฏเดเตเดเดณเตเดเตเดฏเตเด เดคเดฐเดเตเดเตพ เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดชเดเดฐเด, เด
เดตเดฏเตเดเต เดตเดฒเตเดชเตเดชเดเตเดเตพ เดฌเตเดฑเตเดฑเตเดเดณเดฟเตฝ เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต. . เดฎเดพเดชเตเดชเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเดพเตป เดเดฎเดพเตปเดกเต เดเดชเดฏเตเดเดฟเดเตเดเตเด BPF_MAP_CREATE
เดธเดฟเดธเตเดฑเตเดฑเด เดเตเตพ bpf
. เดเดฐเต เดฎเดพเดชเตเดชเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจ เดเตเดเตเดคเดฒเต เดเตเดฑเดตเต เดเตเดฑเดเตเด เดชเตเดฐเตเดเตเดฐเดพเด เดจเตเดเตเดเดพเด. 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 เดเดจเตเดจ เดธเดเดเตเดฏเดฏเดพเดฃเต เดจเดฎเตเดฎเตเดเต เดตเดธเตเดคเตเดตเดฟเดจเตเดฑเต เดเดเตเดณ เดเดกเดฟ. เดเดฎเดพเตปเดกเต เดเดชเดฏเตเดเดฟเดเตเดเต เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดเดฐเต เดฎเดพเดชเตเดชเต เดคเตเดฑเดเตเดเดพเตป เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต เดเดคเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเตเด เด เดเดกเดฟ เดเดชเดฏเตเดเดฟเดเตเดเดพเด 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
เดเดฆเตเดฏเด เดเดเตเดเตพ เดเดฎเดพเตปเดกเต เดเดชเดฏเตเดเดฟเดเตเดเต เด
เดคเดฟเดจเตเดฑเต เดเตเดฒเตเดฌเตฝ เดเดกเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดฎเดพเดชเตเดชเต เดคเตเดฑเดจเตเดจเต 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
เดเดกเดฟเดฏเตเด เดเดฎเดพเตปเดกเตเด เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเตเดเดณเตเดเต เดฎเดพเดชเตเดชเต เดคเตเดฑเดเตเดเตเดจเตเดจเต BPF_MAP_UPDATE_ELEM
เดฎเตเดฒเดเดคเตเดคเต เดคเดฟเดฐเตเดคเตเดคเดฟเดฏเตเดดเตเดคเตเดจเตเดจเต.
เด
เดคเดฟเดจเดพเตฝ, เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฐเต เดนเดพเดทเต เดเตเดฌเดฟเตพ เดธเตเดทเตเดเดฟเดเตเด เดถเตเดทเด, เดจเดฎเตเดเตเดเต เดฎเดฑเตเดฑเตเดจเตเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เด
เดคเดฟเดจเตเดฑเต เดเดณเตเดณเดเดเตเดเดเตเดเตพ เดตเดพเดฏเดฟเดเตเดเดพเดจเตเด เดเดดเตเดคเดพเดจเตเด เดเดดเดฟเดฏเตเด. เดเดฎเดพเตปเดกเต เดฒเตเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดคเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเดฎเตเดเตเดเดฟเตฝ, เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต เดฎเดฑเตเดฑเตเดคเตเดเตเดเดฟเดฒเตเด เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเต เดเดคเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเด. เดฎเตเดเดณเดฟเตฝ เดตเดฟเดตเดฐเดฟเดเตเด เดเดฎเดพเตปเดกเตเดเตพเดเตเดเต เดชเตเดฑเดฎเต, เดเดชเดฏเตเดเตเดคเต เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเตเดณเตเดณ เดฎเดพเดชเตเดชเตเดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต,
BPF_MAP_LOOKUP_ELEM
: เดเต เดเดชเดฏเตเดเดฟเดเตเดเต เดฎเตเดฒเตเดฏเด เดเดฃเตเดเตเดคเตเดคเตเดBPF_MAP_UPDATE_ELEM
: เดฎเตเดฒเตเดฏเด เด เดชเตเดกเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเด/เดธเตเดทเตเดเดฟเดเตเดเตเดBPF_MAP_DELETE_ELEM
: เดเต เดจเตเดเตเดเด เดเตเดฏเตเดฏเตเดBPF_MAP_GET_NEXT_KEY
: เด เดเตเดคเตเดค (เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฆเตเดฏ) เดเต เดเดฃเตเดเตเดคเตเดคเตเดBPF_MAP_GET_NEXT_ID
: เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดเดฒเตเดฒเดพ เดฎเดพเดชเตเดชเตเดเดณเดฟเดฒเตเดเตเดฏเตเด เดชเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต, เด เดเตเดเดจเตเดฏเดพเดฃเต เดเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเตbpftool map
BPF_MAP_GET_FD_BY_ID
: เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดเดฐเต เดฎเดพเดชเตเดชเต เด เดคเดฟเดจเตเดฑเต เดเดเตเดณ เดเดกเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดคเตเดฑเดเตเดเตเดBPF_MAP_LOOKUP_AND_DELETE_ELEM
: เดเดฐเต เดตเดธเตเดคเตเดตเดฟเดจเตเดฑเต เดฎเตเดฒเตเดฏเด เดเดฑเตเดฑเตเดฎเดฟเดเต เดเดฏเดฟ เด เดชเตเดกเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดเดฏเตเด เดชเดดเดฏเดคเต เดคเดฟเดฐเดฟเดเต เดจเตฝเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดBPF_MAP_FREEZE
: เดเดชเดฏเตเดเตเดคเต เดเดเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดชเตเดชเต เดฎเดพเดฑเตเดฑเดฎเดฟเดฒเตเดฒเดพเดคเตเดคเดคเดพเดเตเดเตเด (เด เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดชเดดเดฏเดชเดเดฟเดฏเดพเดเตเดเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ)BPF_MAP_LOOKUP_BATCH
,BPF_MAP_LOOKUP_AND_DELETE_BATCH
,BPF_MAP_UPDATE_BATCH
,BPF_MAP_DELETE_BATCH
: เดฌเดนเตเดเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเตพ. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต,BPF_MAP_LOOKUP_AND_DELETE_BATCH
- เดฎเดพเดชเตเดชเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฒเตเดฒเดพ เดฎเตเดฒเตเดฏเดเตเดเดณเตเด เดตเดพเดฏเดฟเดเตเดเดพเดจเตเด เดชเตเดจเดเดธเดเตเดเดฎเดพเดเตเดเดพเดจเตเดฎเตเดณเตเดณ เดเด เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ เดฎเดพเตผเดเดฎเดพเดฃเดฟเดคเต
เด เดเดฎเดพเตปเดกเตเดเดณเตเดฒเตเดฒเดพเด เดเดฒเตเดฒเดพ เดฎเดพเดชเตเดชเต เดคเดฐเดเตเดเตพเดเตเดเตเด เดตเตเดฃเตเดเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดฟเดฒเตเดฒ, เดเดจเตเดจเดพเตฝ เดชเตเดคเตเดตเต, เดเดชเดฏเตเดเตเดคเต เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเตเดณเตเดณ เดฎเดฑเตเดฑเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดฎเดพเดชเตเดชเตเดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเต เดนเดพเดทเต เดเตเดฌเดฟเดณเตเดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฃเต.
เดเตเดฐเดฎเดคเตเดคเดฟเดจเต เดตเตเดฃเตเดเดฟ, เดจเดฎเตเดเตเดเต เดนเดพเดทเต เดเตเดฌเดฟเตพ เดชเดฐเตเดเตเดทเดฃเดเตเดเตพ เดชเตเตผเดคเตเดคเดฟเดฏเดพเดเตเดเดพเด. เดจเดพเดฒเต เดเตเดเตพ เดตเดฐเต เดเตพเดเตเดเตเดณเตเดณเดพเตป เดเดดเดฟเดฏเตเดจเตเดจ เดเดฐเต เดชเดเตเดเดฟเดเดฏเดพเดฃเต เดเดเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเดคเตเดจเตเดจเต เดเตผเดเตเดเตเดจเตเดจเตเดฃเตเดเต? เดจเดฎเตเดเตเดเต เดเตเดฑเดเตเดเต เดเดเดเดเตเดเตพ เดเตเดเดฟ เดเตเตผเดเตเดเดพเด:
$ sudo bpftool map update id 114 key 2 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 3 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 4 0 0 0 value 1 0 0 0
เดเดคเตเดตเดฐเต เดตเดณเดฐเต เดจเดฒเตเดฒเดคเดพเดฏเดฟเดฐเตเดจเตเดจเต:
$ sudo bpftool map dump id 114
key: 01 00 00 00 value: 01 00 00 00
key: 02 00 00 00 value: 01 00 00 00
key: 04 00 00 00 value: 01 00 00 00
key: 03 00 00 00 value: 01 00 00 00
Found 4 elements
เดเดจเตเดจเต เดเตเดเดฟ เดเตเตผเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเดพเด:
$ sudo bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
Error: update failed: Argument list too long
เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเดคเตเดชเตเดฒเต, เดเดเตเดเตพ เดตเดฟเดเดฏเดฟเดเตเดเดฟเดฒเตเดฒ. เดชเดฟเดถเดเต เดเตเดเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเตเดเตเดเดพเด:
$ sudo strace -e bpf bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, info_len=80, info=0x7ffe6c626da0}}, 120) = 0
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=3, key=0x56049ded5260, value=0x56049ded5280, flags=BPF_ANY}, 120) = -1 E2BIG (Argument list too long)
Error: update failed: Argument list too long
+++ exited with 255 +++
เดเดฒเตเดฒเดพเด เดถเดฐเดฟเดฏเดพเดฃเต: เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเดคเตเดชเตเดฒเต, เดเตเด BPF_MAP_UPDATE_ELEM
เดเดฐเต เดชเตเดคเดฟเดฏ, เด
เดเตเดเดพเดฎเดคเตเดคเต, เดเต เดธเตเดทเตเดเดฟเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเตเดจเตเดจเต, เดชเดเตเดทเต เดเตเดฐเดพเดทเตเดเตพ E2BIG
.
เด
เดคเดฟเดจเดพเตฝ, เดเดเตเดเตพเดเตเดเต BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดธเตเดทเตโเดเดฟเดเตเดเดพเดจเตเด เดฒเตเดกเตเดเตเดฏเตเดฏเดพเดจเตเด เดเดชเดฏเตเดเตเดคเต เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเต เดฎเดพเดชเตเดชเตเดเตพ เดธเตเดทเตโเดเดฟเดเตเดเดพเดจเตเด เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดเตเดเดพเดจเตเด เดเดดเดฟเดฏเตเด. เดฌเดฟเดชเดฟเดเดซเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดจเตเดจเต เดจเดฎเตเดเตเดเต เดฎเดพเดชเตเดชเตเดเตพ เดเดเตเดเดจเต เดเดชเดฏเตเดเดฟเดเตเดเดพเดฎเตเดจเตเดจเต เดจเตเดเตเดเตเดจเตเดจเดคเต เดเดชเตเดชเตเตพ เดฏเตเดเตเดคเดฟเดธเดนเดฎเดพเดฃเต. เดฎเตเดทเตเตป เดฎเดพเดเตเดฐเต เดเตเดกเตเดเดณเดฟเดฒเต เดตเดพเดฏเดฟเดเตเดเดพเตป เดฌเตเดฆเตเดงเดฟเดฎเตเดเตเดเตเดณเตเดณ เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเตเดเต เดญเดพเดทเดฏเดฟเตฝ เดจเดฎเตเดเตเดเต เดเดคเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเต เดธเดเดธเดพเดฐเดฟเดเตเดเดพเด, เดเดจเตเดจเดพเตฝ เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดเตเดเดจเต เดเดดเตเดคเตเดเดฏเตเด เดชเดฐเดฟเดชเดพเดฒเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเตเดตเตเดจเตเดจเต เดเดพเดฃเดฟเดเตเดเตเดฃเตเด เดธเดฎเดฏเด เด
เดคเดฟเดเตเดฐเดฎเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. libbpf
.
(เดคเดพเดดเตเดจเตเดจ เดจเดฟเดฒเดฏเดฟเดฒเตเดณเตเดณ เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต เด
เดญเดพเดตเดคเตเดคเดฟเตฝ เด
เดธเดเดคเตเดชเตเดคเดฐเดพเดฏ เดตเดพเดฏเดจเดเตเดเดพเตผเดเตเดเต: เดเดชเดฏเตเดเดฟเดเตเดเต เดธเตเดทเตเดเดฟเดเตเด เดฎเดพเดชเตเดชเตเดเดณเตเด เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเดณเตเด เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจ เดตเดฟเดถเดฆเดฎเดพเดฏ เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดเตเดเตพ เดตเดฟเดถเดเดฒเดจเด เดเตเดฏเตเดฏเตเด libbpf
เดจเดฟเตผเดฆเตเดฆเตเดถ เดคเดฒเดคเตเดคเดฟเตฝ เดเดจเตเดคเดพเดฃเต เดธเดเดญเดตเดฟเดเตเดเตเดจเตเดจเดคเตเดจเตเดจเต เดจเดฟเดเตเดเดณเตเดเต เดชเดฑเดฏเตเด. เด
เดธเดเดคเตเดชเตเดคเดฐเดพเดฏ เดตเดพเดฏเดจเดเตเดเดพเตผเดเตเดเต เดตเดณเดฐเต, เดเดเตเดเตพ เดเตเดเตเดเดฟเดเตเดเตเตผเดคเตเดคเต
libbpf เดเดชเดฏเตเดเดฟเดเตเดเต BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดดเตเดคเตเดจเตเดจเต
เดฎเตเดทเตเตป เดเตเดกเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดดเตเดคเตเดจเตเดจเดคเต เดเดฆเตเดฏเดฎเดพเดฏเดฟ เดฐเดธเดเดฐเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเตเด, เดคเตเดเตผเดจเตเดจเต เดธเดเดคเตเดชเตเดคเดฟ เดเดฐเดเดญเดฟเดเตเดเตเด. เด เดจเดฟเดฎเดฟเดทเด เดจเดฟเดเตเดเดณเตเดเต เดถเตเดฐเดฆเตเดง เดคเดฟเดฐเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต llvm
, BPF เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดจเดพเดฏเดฟ เดเตเดกเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดฌเดพเดเตเดเตเตปเดกเตเด เดฒเตเดฌเตเดฐเดฑเดฟเดฏเตเด เดเดฃเตเดเต libbpf
, เดเดคเต BPF เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเดณเตเดเต เดเดชเดฏเตเดเตเดคเต เดตเดถเด เดเดดเตเดคเดพเดจเตเด เดเดชเดฏเตเดเดฟเดเตเดเต เดธเตเดทเตเดเดฟเดเตเด BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเตเดเต เดเตเดกเต เดฒเตเดกเต เดเตเดฏเตเดฏเดพเดจเตเด เดจเดฟเดเตเดเดณเต เด
เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต llvm
/clang
.
เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดเดคเดฟเดฒเตเด เดคเตเดเตผเดจเตเดจเตเดณเตเดณ เดฒเตเดเดจเดเตเดเดณเดฟเดฒเตเด เดจเดฎเตเดฎเตพ เดเดพเดฃเตเด, libbpf
เดเดคเต เดเตเดเดพเดคเต เดงเดพเดฐเดพเดณเด เดเตเดฒเดฟเดเตพ เดเตเดฏเตเดฏเตเดจเตเดจเต (เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดธเดฎเดพเดจเดฎเดพเดฏ เดเดชเดเดฐเดฃเดเตเดเตพ - iproute2
, libbcc
, libbpf-go
, เดฎเตเดคเดฒเดพเดฏเดต) เดเตเดตเดฟเดเตเดเดพเตป เด
เดธเดพเดงเตเดฏเดฎเดพเดฃเต. เดชเดฆเตเดงเดคเดฟเดฏเตเดเต เดเตเดฒเดฏเดพเดณเดฟ เดธเดตเดฟเดถเตเดทเดคเดเดณเดฟเตฝ เดเดจเตเดจเต libbpf
BPF CO-RE (เดเดฐเดฟเดเตเดเตฝ เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเด, เดเดฒเตเดฒเดพเดฏเดฟเดเดคเตเดคเตเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเด) - เดตเตเดฏเดคเตเดฏเดธเตเดค API-เดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเดจเตเดณเตเดณ เดเดดเดฟเดตเตเดเต (เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเดคเดฟเดชเตเดชเดฟเตฝ เดจเดฟเดจเตเดจเต เดเตเตผเดฃเตฝ เดเดเดจ เดฎเดพเดฑเตเดฎเตเดชเตเตพ, เดเดฐเต เดเตเตผเดฃเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดฑเตเดฑเตเดจเตเดจเดฟเดฒเตเดเตเดเต เดชเตเตผเดเตเดเดฌเดฟเตพ เดเตเดฏเตเดฏเดพเดตเตเดจเตเดจ BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดดเตเดคเดพเตป เดจเดฟเดเตเดเดณเต เด
เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดชเดคเดฟเดชเตเดชเดฟเดฒเตเดเตเดเต). 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
, เดจเดฎเตเดเตเดเต เดจเดฟเดฐเดตเดงเดฟ (เดเตเดเตเดคเดฒเต เดเตเดฑเดตเต เด
เตผเดคเตเดฅเดถเตเดจเตเดฏเดฎเดพเดฏ) เดเตเดธเตเดฑเตเดฑเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดดเตเดคเตเดเดฏเตเด เดเดฒเตเดฒเดพเด เดเดเตเดเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเต เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดตเดฟเดถเดเดฒเดจเด เดเตเดฏเตเดฏเตเดเดฏเตเด เดเตเดฏเตเดฏเดพเด. เดฎเดพเดชเตเดชเตเดเตพ, เดเตเตผเดฃเตฝ เดธเดนเดพเดฏเดฟเดเตพ, BTF เดฎเตเดคเดฒเดพเดฏเดตเดฏเตเดฎเดพเดฏเดฟ BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดเตเดเดจเต เดธเดเดตเดฆเดฟเดเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเต เดเตเดคเตเดฏเดฎเดพเดฏเดฟ เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดตเดฟเดญเดพเดเดเตเดเดณเดฟเตฝ เดเตเดเตเดคเตฝ เดเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดตเดฟเดถเดฆเตเดเดฐเดฟเดเตเดเดพเตป เดเดคเต เดเดเตเดเดณเต เด
เดจเตเดตเดฆเดฟเดเตเดเตเด.
เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจ เดชเตเดฐเตเดเดเตเดฑเตเดฑเตเดเตพ libbpf
เดเดฐเต git เดธเดฌเตโเดฎเตเดกเตเดฏเตเดณเดพเดฏเดฟ เดเดฐเต 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
, เดฎเตเดฎเตเดชเดคเตเดคเต เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดฒเต เดชเตเดฒเต เดคเดจเตเดจเต, เดเดจเตเดจเดพเตฝ เดธเดฟเดฏเดฟเตฝ, เดเดเตเดเตพ เดเดคเต เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเดจเตเดจเต 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
- เดฌเดฟเดชเดฟเดเดซเต เดฒเตเดเดคเตเดคเดฟเดจเตเดฑเต เดธเตเดตเดฟเดธเต เดเดคเตเดคเดฟ (เด
เดเตเดทเดฐเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดเดเตเดเตเดเดพเด, เดเดพเดฐเดฃเด เดฌเดฟเดชเดฟเดเดซเดฟเดจเตเดฑเต เดธเตเดฐเดทเตเดเดพเดเตเดเดณเดฟเดฒเตเด เดชเดฐเดฟเดชเดพเดฒเดฟเดเตเดเตเดจเตเดจเดตเดฐเดฟเดฒเตเดฐเดพเดณเดพเดฏ เดกเดพเดจเดฟเดฏเตฝ เดฌเตเตผเดเตเดเตเดฎเดพเตป เดธเตเดตเดฟเดธเตเดธเต เดเดฃเต):
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
เดซเดฏเดฒเดฟเตฝ xdp-simple.skel.h
เดเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเตเดฑเต เดฌเตเดจเดฑเดฟ เดเตเดกเตเด เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเดณเตเด เด
เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต - เดฒเตเดกเต เดเตเดฏเตเดฏเตฝ, เด
เดฑเตเดฑเดพเดเตเดเตเดเตเดฏเตเดฏเตฝ, เดเดเตเดเดณเตเดเต เดเดฌเตเดเดเตเดฑเตเดฑเต เดเดฒเตเดฒเดพเดคเดพเดเตเดเตฝ. เดเดเตเดเดณเตเดเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเตฝ เดเดคเต เดเดตเตผเดเดฟเตฝ เดชเตเดฒเต เดเดพเดฃเดชเตเดชเตเดเตเดจเตเดจเต, เดเดจเตเดจเดพเตฝ เดเดฌเตโเดเดเตเดฑเตเดฑเต เดซเดฏเดฒเดฟเตฝ เดจเดฟเดฐเดตเดงเดฟ เดฌเดฟเดชเดฟเดเดซเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเตเด เดฎเดพเดชเตเดชเตเดเดณเตเด เด
เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเดฒเตเด เดเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต, เด เดญเตเดฎเตป ELF เดฒเตเดกเตเดเตเดฏเตเดฏเดพเตป เดจเดฎเตเดเตเดเต เด
เดธเตเดฅเดฟเดเตเดเด เดธเตเดทเตโเดเดฟเดเตเดเต เดเดเตเดเตพ เดเดทเตโเดเดพเดจเตเดธเตเดค เด
เดชเตเดฒเดฟเดเตเดเตเดทเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดจเตเดจเต เดฐเดฃเตเดเต เดซเดเดเตโเดทเดจเตเดเตพ เดตเดฟเดณเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต. เดเดดเตเดคเตเดจเตเดจเต เดเดจเดฟ เดจเดฎเตเดเตเดเต เดฎเตเดจเตเดจเตเดเตเดเต เดชเตเดเดพเด.
เดเตเดคเตเดฏเดฎเดพเดฏเดฟ เดชเดฑเดเตเดเดพเตฝ, เดเดเตเดเดณเตเดเต เดฒเตเดกเตผ เดชเตเดฐเตเดเตเดฐเดพเด เดจเดฟเดธเตเดธเดพเดฐเดฎเดพเดฃเต:
#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"
int main(int argc, char **argv)
{
struct xdp_simple_bpf *obj;
obj = xdp_simple_bpf__open_and_load();
if (!obj)
err(1, "failed to open and/or load BPF objectn");
pause();
xdp_simple_bpf__destroy(obj);
}
เดเดคเต struct xdp_simple_bpf
เดซเดฏเดฒเดฟเตฝ เดจเดฟเตผเดตเดเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต xdp-simple.skel.h
เดเดเตเดเดณเตเดเต เดเดฌเตโเดเดเตเดฑเตเดฑเต เดซเดฏเดฒเดฟเดจเต เดตเดฟเดตเดฐเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต:
struct xdp_simple_bpf {
struct bpf_object_skeleton *skeleton;
struct bpf_object *obj;
struct {
struct bpf_program *simple;
} progs;
struct {
struct bpf_link *simple;
} links;
};
เดเดฐเต เดคเดพเดดเตเดจเตเดจ เดจเดฟเดฒเดฏเดฟเดฒเตเดณเตเดณ API เดฏเตเดเต เด
เดเดฏเดพเดณเดเตเดเตพ เดจเดฎเตเดเตเดเต เดเดตเดฟเดเต เดเดพเดฃเดพเด: เดเดเดจ struct bpf_program *simple
ะธ struct bpf_link *simple
. เดตเดฟเดญเดพเดเดคเตเดคเดฟเตฝ เดเดดเตเดคเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เดเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเต เดเดฆเตเดฏ เดเดเดจ เดชเตเดฐเดคเตเดฏเตเดเด เดตเดฟเดตเดฐเดฟเดเตเดเตเดจเตเดจเต xdp/simple
, เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เดชเตเดฐเตเดเตเดฐเดพเด เดเดเตเดเดจเต เดเดตเดจเตเดฑเต เดเดฑเดตเดฟเดเดตเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต เดเดจเตเดจเต เดตเดฟเดตเดฐเดฟเดเตเดเตเดจเตเดจเต.
เดซเดเดเตเดทเตป xdp_simple_bpf__open_and_load
, เดเดฐเต ELF เดเดฌเตโเดเดเตเดฑเตเดฑเต เดคเตเดฑเดเตเดเตเดจเตเดจเต, เด
เดคเต เดชเดพเดดเตโเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเต, เดเดฒเตเดฒเดพ เดเดเดจเดเดณเตเด เดเดชเดเดเดจเดเดณเตเด เดธเตเดทเตโเดเดฟเดเตเดเตเดจเตเดจเต (เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเต เดชเตเดฑเดฎเต, ELF-เตฝ เดฎเดฑเตเดฑเต เดตเดฟเดญเดพเดเดเตเดเดณเตเด เด
เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต - เดกเดพเดฑเตเดฑ, เดฑเตเดกเต เดฎเดพเดคเตเดฐเด เดกเดพเดฑเตเดฑ, เดกเตเดฌเดเตเดเดฟเดเดเต เดตเดฟเดตเดฐเดเตเดเตพ, เดฒเตเดธเตปเดธเต เดฎเตเดคเดฒเดพเดฏเดต), เดคเตเดเตผเดจเตเดจเต เดเดฐเต เดธเดฟเดธเตเดฑเตเดฑเด เดเดชเดฏเตเดเดฟเดเตเดเต เด
เดคเต เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต. เดตเดฟเดณเดฟ bpf
, เดชเตเดฐเตเดเตเดฐเดพเด เดเดเดชเตเตฝ เดเตเดฏเตเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดฒเตเดเต เดจเดฎเตเดเตเดเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเด:
$ clang -O2 -I ./libbpf/src/root/usr/include/ xdp-simple.c -o xdp-simple ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo strace -e bpf ./xdp-simple
...
bpf(BPF_BTF_LOAD, 0x7ffdb8fd9670, 120) = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0xdfd580, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(5, 8, 0), prog_flags=0, prog_name="simple", prog_ifindex=0, expected_attach_type=0x25 /* BPF_??? */, ...}, 120) = 4
เดเดชเตเดชเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจ เดจเดฎเตเดฎเตเดเต เดชเตเดฐเตเดเตเดฐเดพเด เดจเตเดเตเดเดพเด bpftool
. เดจเดฎเตเดเตเดเต เด
เดตเดณเตเดเต เดเดกเดฟ เดเดฃเตเดเตเดคเตเดคเดพเด:
# bpftool p | grep -A4 simple
463: xdp name simple tag 3b185187f1855c4c gpl
loaded_at 2020-08-01T01:59:49+0000 uid 0
xlated 16B jited 40B memlock 4096B
btf_id 185
pids xdp-simple(16498)
เดเตเดเดพเดคเต เดกเดเดชเต (เดเดเตเดเตพ เดเดฎเดพเตปเดกเดฟเดจเตเดฑเต เดเดฐเต เดเตเดฐเตเดเตเดเดฟเดฏ เดฐเตเดชเด เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต bpftool prog dump xlated
):
# bpftool p d x id 463
int simple(void *ctx):
; return XDP_PASS;
0: (b7) r0 = 2
1: (95) exit
เดชเตเดคเดฟเดฏ เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด! เดชเตเดฐเตเดเตเดฐเดพเด เดเดเตเดเดณเตเดเต เดธเดฟ เดธเตเดดเตโเดธเต เดซเดฏเดฒเดฟเดจเตเดฑเต เดญเดพเดเดเตเดเตพ เด
เดเตเดเดเดฟเดเตเดเต. เดเดคเต เดฒเตเดฌเตเดฐเดฑเดฟเดฏเดพเดฃเต เดเตเดฏเตเดคเดคเต libbpf
, เดฌเตเดจเดฑเดฟเดฏเดฟเดฒเต เดกเตเดฌเดเต เดตเดฟเดญเดพเดเด เดเดฃเตเดเตเดคเตเดคเดฟ, เด
เดคเต เดเดฐเต เดฌเดฟเดเดฟเดเดซเต เดเดฌเตโเดเดเตเดฑเตเดฑเดฟเดฒเตเดเตเดเต เดธเดฎเดพเดนเดฐเดฟเดเตเดเต, เดเดคเต เดเดชเดฏเตเดเดฟเดเตเดเต เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเต เดเตเดฏเตเดคเต 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
, เดเดคเต เดธเดนเดพเดฏ เดซเดเดเตโเดทเตป เดเดกเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต 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
. เดเดฆเตเดงเดฐเดฃเดฟเดเดณเดฟเตฝ เดจเดฟเตผเดตเดเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เดเดพเดฐเดฃเด เดเดคเต เดเดฐเต เดฒเตเดเดฟเดเตเดเตฝ เดจเดฟเตผเดตเดเดจเดฎเดพเดฃเต, เดเตเดเดพเดคเต เดธเดฟ เดญเดพเดทเดฏเดฟเตฝ เดเดฐเต เดเตเดเตเดเด เดเตเตบเดเตเดฐเตเดฑเตเดฑเต เดเดเดจเดเดณเตเดเต เดจเดฟเตผเดตเดเดจเด เดฎเดฑเตเดฑเต เดธเตเดฅเดฒเดเตเดเดณเดฟเตฝ เดธเดเดญเดตเดฟเดเตเดเตเดจเตเดจเต. เดชเตเดฐเดคเตเดฏเตเดเดฟเดเตเดเต, เดซเดฏเดฒเดฟเตฝ 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
- เดชเตเดเตเดฏเด. เดตเตเดฐเดฟเดซเดฏเตผ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจ เดเดฌเดฟเด เดเดฐเดพเตผ เดชเตเดฐเดเดพเดฐเด, เดเดคเต เดนเตเตฝเดชเตเดชเตผ เดซเดเดเตโเดทเตป เดจเดฎเตเดชเตผ เดเดเตเดเดฟเดฒเตเดเตเดเตเดณเตเดณ เดเตเดณเดพเดฃเต. เด
เดคเต เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเตเดเดดเดฟเดเตเดเดพเตฝ, เดฏเตเดเตเดคเดฟ เดฒเดณเดฟเดคเดฎเดพเดฃเต. เดฐเดเดฟเดธเตเดฑเตเดฑเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเตเดฒเตเดฏเด เดคเดฟเดฐเดฟเดเต เดจเตฝเดเตเด 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;
}
เดเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเด เด เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจ เดธเดฟเดชเดฟเดฏเต เดจเดฎเตเดชเตผ เดชเตเดฐเดฟเดจเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเต. เดจเดฎเตเดเตเดเต เด เดคเต เดธเดฎเดพเดนเดฐเดฟเดเตเดเต เดเตเดกเต เดจเตเดเตเดเดพเด:
$ 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
เดเดเตเดเตพ เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดค เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดจเต เดเดกเดฟ 669 เดเดฃเตเดเต, เดเดจเตเดฑเตผเดซเตเดธเดฟเตฝ เดเดเตเดเตพ เด
เดคเต เดเดกเดฟ เดเดพเดฃเตเดจเตเดจเต 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
(เดธเดฟ-เดฏเดฟเตฝ เดเดเตเดเตพ เด
เดคเตเดคเดฐเดฎเตเดฐเต เด
เดฑเตเดฏเต เดจเดฟเตผเดตเตเดตเดเดฟเดเตเดเตเด u64 woo[8]
). เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเตฝ "xdp/simple"
เดจเดฎเตเดเตเดเต เดจเดฟเดฒเดตเดฟเดฒเต เดชเตเดฐเตเดธเดธเตผ เดจเดฎเตเดชเตผ เดเดฐเต เดตเตเดฐเดฟเดฏเดฌเดฟเดณเดฟเดฒเตเดเตเดเต เดฒเดญเดฟเดเตเดเตเด key
เดคเตเดเตผเดจเตเดจเต เดนเตเตฝเดชเตเดชเตผ เดซเดเดเตโเดทเตป เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต bpf_map_lookup_element
เด
เดฑเตเดฏเดฟเดฒเต เด
เดจเตเดฌเดจเตเดง เดเตปเดเตเดฐเดฟเดฏเดฟเดฒเตเดเตเดเต เดจเดฎเตเดเตเดเต เดเดฐเต เดชเตเดฏเดฟเดจเตเดฑเตผ เดฒเดญเดฟเดเตเดเตเด, เด
เดคเต เดจเดฎเตเดฎเตพ เดเดจเตเดจเดพเดฏเดฟ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเด. เดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเดฒเตเดเตเดเต เดตเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตโเดคเต: เดเตปเดเดฎเดฟเดเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดเดคเต เดธเดฟเดชเดฟเดฏเต เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดคเต เดเดจเตเดจเดคเดฟเดจเตเดฑเต เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเดเตเดเดฃเดเตเดเตเดเตพ เดเดเตเดเตพ เดเดฃเดเตเดเดพเดเตเดเตเดจเตเดจเต. เดชเตเดฐเตเดเตเดฐเดพเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเดพเด:
$ 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
, เดเตเดเดพเดคเต เดเดกเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดคเตเดฑเดจเตเดจเดคเต 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[]
. เดเดจเตเดจเดพเตฝ เดจเดฎเตเดฎเตพ เดธเดฟเดฏเดฟเตฝ เดเดณเตเดณ เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเด เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดจเดฎเตเดเตเดเต เดเตเดฑเดเตเดเต เดเดคเดฟเดเตเดเดพเด:
$ llvm-objdump -D --section xdp/simple xdp-simple.bpf.o
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
2: bf a2 00 00 00 00 00 00 r2 = r10
3: 07 02 00 00 fc ff ff ff r2 += -4
4: 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
6: 85 00 00 00 01 00 00 00 call 1
7: b7 01 00 00 00 00 00 00 r1 = 0
8: 15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2>
9: 61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0)
10: 07 01 00 00 01 00 00 00 r1 += 1
11: 63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1
12: b7 01 00 00 02 00 00 00 r1 = 2
0000000000000068 <LBB0_2>:
13: bf 10 00 00 00 00 00 00 r0 = r1
14: 95 00 00 00 00 00 00 00 exit
เดฎเตเดคเตเดคเดคเตเดคเดฟเตฝ, เดจเดฎเตเดเตเดเต 14 เดจเดฟเตผเดฆเตเดฆเตเดถเดเตเดเตพ เดชเตเดฒเตเดณเตเดณ เดเดเดจเดเดณเตเดเต เดฐเตเดชเดคเตเดคเดฟเตฝ เดเดดเตเดคเตเดฃเตเดเดคเตเดฃเตเดเต struct bpf_insn
(เดเดชเดฆเตเดถเด: เดฎเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดเดชเต เดเดเตเดเตเดเตเด, เดจเดฟเตผเดฆเตเดฆเตเดถเดเตเดเตพ เดตเดฟเดญเดพเดเด เดตเตเดฃเตเดเตเด เดตเดพเดฏเดฟเดเตเดเตเด, เดคเตเดฑเดเตเดเตเด linux/bpf.h
linux/bpf_common.h
struct bpf_insn insns[]
เดธเตเดตเดจเตเดคเด เดจเดฟเดฒเดฏเดฟเตฝ):
struct bpf_insn insns[] = {
/* 85 00 00 00 08 00 00 00 call 8 */
{
.code = BPF_JMP | BPF_CALL,
.imm = 8,
},
/* 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0 */
{
.code = BPF_MEM | BPF_STX,
.off = -4,
.src_reg = BPF_REG_0,
.dst_reg = BPF_REG_10,
},
/* bf a2 00 00 00 00 00 00 r2 = r10 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_X,
.src_reg = BPF_REG_10,
.dst_reg = BPF_REG_2,
},
/* 07 02 00 00 fc ff ff ff r2 += -4 */
{
.code = BPF_ALU64 | BPF_ADD | BPF_K,
.dst_reg = BPF_REG_2,
.imm = -4,
},
/* 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll */
{
.code = BPF_LD | BPF_DW | BPF_IMM,
.src_reg = BPF_PSEUDO_MAP_FD,
.dst_reg = BPF_REG_1,
.imm = map_fd,
},
{ }, /* placeholder */
/* 85 00 00 00 01 00 00 00 call 1 */
{
.code = BPF_JMP | BPF_CALL,
.imm = 1,
},
/* b7 01 00 00 00 00 00 00 r1 = 0 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 0,
},
/* 15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2> */
{
.code = BPF_JMP | BPF_JEQ | BPF_K,
.off = 4,
.src_reg = BPF_REG_0,
.imm = 0,
},
/* 61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0) */
{
.code = BPF_MEM | BPF_LDX,
.off = 0,
.src_reg = BPF_REG_0,
.dst_reg = BPF_REG_1,
},
/* 07 01 00 00 01 00 00 00 r1 += 1 */
{
.code = BPF_ALU64 | BPF_ADD | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 1,
},
/* 63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1 */
{
.code = BPF_MEM | BPF_STX,
.src_reg = BPF_REG_1,
.dst_reg = BPF_REG_0,
},
/* b7 01 00 00 02 00 00 00 r1 = 2 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 2,
},
/* <LBB0_2>: bf 10 00 00 00 00 00 00 r0 = r1 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_X,
.src_reg = BPF_REG_1,
.dst_reg = BPF_REG_0,
},
/* 95 00 00 00 00 00 00 00 exit */
{
.code = BPF_JMP | BPF_EXIT
},
};
เดเดคเต เดธเตเดตเดฏเด เดเดดเตเดคเดพเดคเตเดคเดตเตผเดเตเดเตเดณเตเดณ เดเดฐเต เดตเตเดฏเดพเดฏเดพเดฎเด - เดเดฃเตเดเตเดคเตเดคเตเด map_fd
.
เดเดเตเดเดณเตเดเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเตฝ เดตเตเดณเดฟเดชเตเดชเตเดเตเดคเตเดคเดพเดคเตเดค เดเดฐเต เดญเดพเดเด เดเตเดเดฟ เด
เดตเดถเตเดทเดฟเดเตเดเตเดจเตเดจเต - xdp_attach
. เดจเดฟเตผเดญเดพเดเตเดฏเดตเดถเดพเตฝ, เดเดฐเต เดธเดฟเดธเตเดฑเตเดฑเด เดเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเต XDP เดชเตเดฒเตเดณเตเดณ เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ bpf
. BPF เดเด XDP เดเด เดธเตเดทเตโเดเดฟเดเตเด เดเดณเตเดเตพ เดเตบเดฒเตเตป เดฒเดฟเดจเดเตโเดธเต เดเดฎเตเดฎเตเดฏเตเดฃเดฟเดฑเตเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณเดตเดฐเดพเดฃเต, เด
เดคเดฟเดจเตผเดคเตเดฅเด เด
เดตเตผ เด
เดตเตผเดเตเดเต เดเดฑเตเดฑเดตเตเด เดชเดฐเดฟเดเดฟเดคเดฎเดพเดฏ เดเดจเตเดจเต เดเดชเดฏเตเดเดฟเดเตเดเต (เดชเดเตเดทเต เด
เดฒเตเดฒ เดธเดพเดงเดพเดฐเดฃ เดเดณเตเดเตพ) เดเตเตผเดฃเดฒเตเดฎเดพเดฏเดฟ เดธเดเดตเดฆเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดจเตเดฑเตผเดซเตเดธเต: xdp_attach
เดเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดเตเดกเต เดชเดเตผเดคเตเดคเตเดจเตเดจเต libbpf
, เด
เดคเดพเดฏเดคเต, เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต netlink.c
เดจเตเดฑเตเดฑเตเดฒเดฟเดเตเดเต เดธเตเดเตเดเดฑเตเดฑเตเดเดณเตเดเต เดฒเตเดเดคเตเดคเตเดเตเดเต เดธเตเดตเดพเดเดคเด
เดเดฐเต เดจเตเดฑเตเดฑเตเดฒเดฟเดเตเดเต เดธเตเดเตเดเดฑเตเดฑเต เดคเดฐเด เดคเตเดฑเดเตเดเตเด NETLINK_ROUTE
:
int netlink_open(__u32 *nl_pid)
{
struct sockaddr_nl sa;
socklen_t addrlen;
int one = 1, ret;
int sock;
memset(&sa, 0, sizeof(sa));
sa.nl_family = AF_NETLINK;
sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sock < 0)
err(1, "socket");
if (setsockopt(sock, SOL_NETLINK, NETLINK_EXT_ACK, &one, sizeof(one)) < 0)
warnx("netlink error reporting not supported");
if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0)
err(1, "bind");
addrlen = sizeof(sa);
if (getsockname(sock, (struct sockaddr *)&sa, &addrlen) < 0)
err(1, "getsockname");
*nl_pid = sa.nl_pid;
return sock;
}
เด เดธเตเดเตเดเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดเตเดเตพ เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเต:
static int bpf_netlink_recv(int sock, __u32 nl_pid, int seq)
{
bool multipart = true;
struct nlmsgerr *errm;
struct nlmsghdr *nh;
char buf[4096];
int len, ret;
while (multipart) {
multipart = false;
len = recv(sock, buf, sizeof(buf), 0);
if (len < 0)
err(1, "recv");
if (len == 0)
break;
for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, len);
nh = NLMSG_NEXT(nh, len)) {
if (nh->nlmsg_pid != nl_pid)
errx(1, "wrong pid");
if (nh->nlmsg_seq != seq)
errx(1, "INVSEQ");
if (nh->nlmsg_flags & NLM_F_MULTI)
multipart = true;
switch (nh->nlmsg_type) {
case NLMSG_ERROR:
errm = (struct nlmsgerr *)NLMSG_DATA(nh);
if (!errm->error)
continue;
ret = errm->error;
// libbpf_nla_dump_errormsg(nh); too many code to copy...
goto done;
case NLMSG_DONE:
return 0;
default:
break;
}
}
}
ret = 0;
done:
return ret;
}
เด เดตเดธเดพเดจเดฎเดพเดฏเดฟ, เดเดฐเต เดธเตเดเตเดเดฑเตเดฑเต เดคเตเดฑเดจเตเดจเต เด เดคเดฟเดฒเตเดเตเดเต เดเดฐเต เดซเดฏเตฝ เดกเดฟเดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตผ เด เดเดเตเดเตเดจเตเดจ เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดธเดจเตเดฆเตเดถเด เด เดฏเดเตเดเตเดจเตเดจ เดเดเตเดเดณเตเดเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดเดคเดพ:
static int xdp_attach(int ifindex, int prog_fd)
{
int sock, seq = 0, ret;
struct nlattr *nla, *nla_xdp;
struct {
struct nlmsghdr nh;
struct ifinfomsg ifinfo;
char attrbuf[64];
} req;
__u32 nl_pid = 0;
sock = netlink_open(&nl_pid);
if (sock < 0)
return sock;
memset(&req, 0, sizeof(req));
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
req.nh.nlmsg_type = RTM_SETLINK;
req.nh.nlmsg_pid = 0;
req.nh.nlmsg_seq = ++seq;
req.ifinfo.ifi_family = AF_UNSPEC;
req.ifinfo.ifi_index = ifindex;
/* started nested attribute for XDP */
nla = (struct nlattr *)(((char *)&req)
+ NLMSG_ALIGN(req.nh.nlmsg_len));
nla->nla_type = NLA_F_NESTED | IFLA_XDP;
nla->nla_len = NLA_HDRLEN;
/* add XDP fd */
nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
nla_xdp->nla_type = IFLA_XDP_FD;
nla_xdp->nla_len = NLA_HDRLEN + sizeof(int);
memcpy((char *)nla_xdp + NLA_HDRLEN, &prog_fd, sizeof(prog_fd));
nla->nla_len += nla_xdp->nla_len;
/* if user passed in any flags, add those too */
__u32 flags = XDP_FLAGS_SKB_MODE;
nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
nla_xdp->nla_type = IFLA_XDP_FLAGS;
nla_xdp->nla_len = NLA_HDRLEN + sizeof(flags);
memcpy((char *)nla_xdp + NLA_HDRLEN, &flags, sizeof(flags));
nla->nla_len += nla_xdp->nla_len;
req.nh.nlmsg_len += NLA_ALIGN(nla->nla_len);
if (send(sock, &req, req.nh.nlmsg_len, 0) < 0)
err(1, "send");
ret = bpf_netlink_recv(sock, nl_pid, seq);
cleanup:
close(sock);
return ret;
}
เด เดคเดฟเดจเดพเตฝ, เดเดฒเตเดฒเดพเด เดชเดฐเตเดเตเดทเดฃเดคเตเดคเดฟเดจเต เดคเดฏเตเดฏเดพเดฑเดพเดฃเต:
$ cc nolibbpf.c -o nolibbpf
$ sudo strace -e bpf ./nolibbpf
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, map_name="woo", ...}, 72) = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=15, prog_name="woo", ...}, 72) = 4
+++ exited with 0 +++
เดจเดฎเตเดฎเตเดเต เดชเตเดฐเตเดเตเดฐเดพเด เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเดฟเดเตเดเตเดฃเตเดเต เดเดจเตเดจเต เดจเตเดเตเดเดพเด lo
:
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 160
เดจเดฎเตเดเตเดเต เดชเดฟเดเดเตเดเตพ เด เดฏเดเตเดเต เดฎเดพเดชเตเดชเต เดจเตเดเตเดเดพเด:
$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done
$ sudo bpftool m dump name woo
key: 00 00 00 00 value: 90 01 00 00 00 00 00 00
key: 01 00 00 00 value: 00 00 00 00 00 00 00 00
key: 02 00 00 00 value: 00 00 00 00 00 00 00 00
key: 03 00 00 00 value: 00 00 00 00 00 00 00 00
key: 04 00 00 00 value: 00 00 00 00 00 00 00 00
key: 05 00 00 00 value: 00 00 00 00 00 00 00 00
key: 06 00 00 00 value: 40 b5 00 00 00 00 00 00
key: 07 00 00 00 value: 00 00 00 00 00 00 00 00
Found 8 elements
เดนเตเดฑเต, เดเดฒเตเดฒเดพเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต. เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเด, เดเดเตเดเดณเตเดเต เดฎเดพเดชเตเดชเต เดตเตเดฃเตเดเตเด เดฌเตเดฑเตเดฑเตเดเดณเตเดเต เดฐเตเดชเดคเตเดคเดฟเตฝ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดคเต เดชเตเดฒเตเดฏเดฒเตเดฒ, เดตเดธเตเดคเตเดค เดเดพเดฐเดฃเด libbpf
เดเดเตเดเตพ เดคเดฐเด เดตเดฟเดตเดฐเดเตเดเตพ เดฒเตเดกเต เดเตเดฏเตเดคเดฟเดเตเดเดฟเดฒเตเดฒ (BTF). เดเดจเตเดจเดพเตฝ เด
เดเตเดคเตเดค เดคเดตเดฃ เดเดคเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเต เดเตเดเตเดคเตฝ เดธเดเดธเดพเดฐเดฟเดเตเดเดพเด.
เดตเดฟเดเดธเดจ เดเดชเดเดฐเดฃเดเตเดเตพ
เด เดตเดฟเดญเดพเดเดคเตเดคเดฟเตฝ, เดเดเตเดเตพ เดเดฑเตเดฑเดตเตเด เดเตเดฑเดเตเด BPF เดกเตเดตเดฒเดชเตเดชเตผ เดเตเตพเดเดฟเดฑเตเดฑเต เดจเตเดเตเดเดพเด.
เดชเตเดคเตเดตเดพเดฏเดฟ เดชเดฑเดเตเดเดพเตฝ, BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดจเดฟเดเตเดเตพเดเตเดเต เดชเตเดฐเดคเตเดฏเตเดเดฟเดเตเดเตเดจเตเดจเตเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ - BPF เดเดคเตเดเตเดเดฟเดฒเตเด เดฎเดพเดจเตเดฏเดฎเดพเดฏ เดตเดฟเดคเดฐเดฃ เดเตเตผเดฃเดฒเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต, เดเตเดเดพเดคเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เดเดชเดฏเตเดเดฟเดเตเดเดพเดฃเต clang
, เดชเดพเดเตเดเตเดเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเดจเตเดจเดคเต. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดฌเดฟเดชเดฟเดเดซเต เดตเดฟเดเดธเดฟเดเตเดเตเดเตเดฃเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดเตเตผเดฃเดฒเตเด เดเดชเดเดฐเดฃเดเตเดเดณเตเด เดจเดฟเดฐเดจเตเดคเดฐเด เดฎเดพเดฑเดฟเดเตเดเตเดฃเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต, 2019 เดฎเตเดคเตฝ เดชเดดเดฏ เดฐเตเดคเดฟเดฏเดฟเดฒเตเดณเตเดณ เดฐเตเดคเดฟเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดฌเดฟเดชเดฟเดเดซเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดดเตเดคเดพเตป เดจเดฟเดเตเดเตพ เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดจเดฟเดเตเดเตพ เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเดฃเตเดเดฟเดตเดฐเตเด.
llvm
/clang
pahole
- เด เดคเดฟเดจเตเดฑเต เดเดพเดคเตฝ
bpftool
(เดฑเดซเดฑเตปเดธเดฟเดจเดพเดฏเดฟ, เด เดตเดฟเดญเดพเดเดตเตเด เดฒเตเดเดจเดคเตเดคเดฟเดฒเต เดเดฒเตเดฒเดพ เดเดฆเดพเดนเดฐเดฃเดเตเดเดณเตเด เดกเตเดฌเดฟเดฏเตป 10-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดคเดพเดฃเต.)
llvm/clang
เดฌเดฟโเดชเดฟโเดเดซเต เดเตฝโเดเตฝโเดตเดฟโเดเดฎเตเดฎเตเดฎเดพเดฏเดฟ เดธเตเดนเตเดฆเดชเดฐเดฎเดพเดฃเต, เดเตเดเดพเดคเต เด
เดเตเดคเตเดคเดฟเดเต เดฌเดฟโเดชเดฟโเดเดซเดฟเดจเดพเดฏเตเดณเตเดณ เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพโ เดเดฟโเดธเดฟโเดธเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดธเดฎเดพเดนเดฐเดฟเดเตเดเดพเตปโ เดเดดเดฟเดฏเตเดฎเตเดเตเดเดฟเดฒเตเด, เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดเดฒเตเดฒเดพ เดตเดฟเดเดธเดจเดตเตเด เดเตฝโเดเตฝโเดตเดฟโเดเดฎเตเดฎเดฟเดจเดพเดฏเดฟ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต. เด
เดคเดฟเดจเดพเตฝ, เดเดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดเดเตเดเตพ เดจเดฟเดฒเดตเดฟเดฒเต เดชเดคเดฟเดชเตเดชเต เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเด clang
git เตฝ เดจเดฟเดจเตเดจเต:
$ sudo apt install ninja-build
$ git clone --depth 1 https://github.com/llvm/llvm-project.git
$ mkdir -p llvm-project/llvm/build/install
$ cd llvm-project/llvm/build
$ cmake .. -G "Ninja" -DLLVM_TARGETS_TO_BUILD="BPF;X86"
-DLLVM_ENABLE_PROJECTS="clang"
-DBUILD_SHARED_LIBS=OFF
-DCMAKE_BUILD_TYPE=Release
-DLLVM_BUILD_RUNTIME=OFF
$ time ninja
... ะผะฝะพะณะพ ะฒัะตะผะตะฝะธ ัะฟัััั
$
เดเดฒเตเดฒเดพเด เดถเดฐเดฟเดฏเดพเดฏเดฟ เดตเดจเตเดจเดฟเดเตเดเตเดฃเตเดเต เดเดจเตเดจเต เดเดชเตเดชเตเตพ เดจเดฎเตเดเตเดเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเด:
$ ./bin/llc --version
LLVM (http://llvm.org/):
LLVM version 11.0.0git
Optimized build.
Default target: x86_64-unknown-linux-gnu
Host CPU: znver1
Registered Targets:
bpf - BPF (host endian)
bpfeb - BPF (big endian)
bpfel - BPF (little endian)
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
(เด
เดธเดเดฌเตเดฒเดฟ เดจเดฟเตผเดฆเตเดฆเตเดถเดเตเดเตพ clang
เดเดพเตป เดเดเตเดคเตเดคเดคเต
เดเดเตเดเตพ เดเดชเตเดชเตเตพ เดจเดฟเตผเดฎเตเดฎเดฟเดเตเด เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเดฟเดฒเตเดฒ, เดชเดเดฐเด เด
เดต เดเตเตผเดเตเดเตเด PATH
เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต:
export PATH="`pwd`/bin:$PATH"
(เดเดคเดฟเดฒเตเดเตเดเต เดเตเตผเดเตเดเดพเดตเตเดจเตเดจเดคเดพเดฃเต .bashrc
เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดซเดฏเดฒเดฟเดฒเตเดเตเดเต. เดตเตเดฏเดเตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ, เดเดพเตป เดเดคเตเดชเตเดฒเตเดณเตเดณ เดเดพเดฐเตเดฏเดเตเดเตพ เดเตเตผเดเตเดเตเดจเตเดจเต ~/bin/activate-llvm.sh
เดเดตเดถเตเดฏเดฎเตเดณเตเดณเดชเตเดชเตเตพ เดเดพเตป เด
เดคเต เดเตเดฏเตเดฏเตเดจเตเดจเต . activate-llvm.sh
.)
เดชเดนเตเดณเตเด เดฌเดฟ.เดเดฟ.เดเดซเตเด
เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟ pahole
BTF เดซเตเตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดกเตเดฌเดเตเดเดฟเดเดเต เดตเดฟเดตเดฐเดเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเดพเตป เดเตเตผเดฃเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเดฎเตเดชเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. 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 เดเดชเดฏเตเดเดฟเดเตเดเต เดชเดฐเตเดเตเดทเดฟเดเตเดเดพเตป เดจเดฎเตเดเตเดเต เดธเดพเดงเดพเดฐเดฃ เดเดชเดฏเตเดเดฟเดเตเดเดพเด 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 เดเตเตผเดฃเดฒเดฟเดจเตเดฑเต เดญเดพเดเดฎเดพเดฏเดฟ เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดคเต. เดเดคเต เดฌเดฟเดชเดฟเดเดซเต เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผเดเตเดเดพเดฏเดฟ เดฌเดฟเดชเดฟเดเดซเต เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดเดดเตเดคเตเดเดฏเตเด เดชเดฐเดฟเดชเดพเดฒเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต, เดเตเดเดพเดคเต เดเดฒเตเดฒเดพเดคเตเดคเดฐเด เดฌเดฟเดชเดฟเดเดซเต เดเดฌเตโเดเดเตเดฑเตเดฑเตเดเดณเตเด - เดฒเตเดกเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ, เดฎเดพเดชเตเดชเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเด, เดเดกเดฟเดฑเตเดฑเต เดเตเดฏเตเดฏเตเด, เดฌเดฟเดชเดฟเดเดซเต เดเดเตเดเตเดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต เดเตเดตเดฟเดคเด เดชเดฐเตเดฏเดตเตเดเตเดทเดฃเด เดเตเดฏเตเดฏเตเด เดคเตเดเดเตเดเดฟเดฏเดต เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเดพเตป เดเดคเต เดเดชเดฏเตเดเดฟเดเตเดเดพเด. เดฎเดพเตป เดชเตเดเตเดเตพเดเตเดเตเดณเตเดณ เดธเตเดดเตเดธเต เดเตเดกเตเดเดณเตเดเต เดฐเตเดชเดคเตเดคเดฟเตฝ เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเตป เดเดฃเตเดเตเดคเตเดคเดพเดจเดพเดเตเด
เดเดคเต เดเดดเตเดคเตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต 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
...
เดจเดฟเดเตเดเดณเตเดเต เดเตเตผเดฃเดฒเดฟเตฝ เดเดคเต เดฌเดฟเดชเดฟเดเดซเต เดซเตเดเตเดเดฑเตเดเตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเดเดฟเดฏเดฟเดเตเดเตเดฃเตเดเตเดจเตเดจเต เดเดคเต เดเดพเดฃเดฟเดเตเดเตเด.
เดตเดดเดฟเดฏเดฟเตฝ, เดฎเตเดฎเตเดชเดคเตเดคเต เดเดฎเดพเตปเดกเต เดเดคเตเดชเตเดฒเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเด
# bpftool f p k
เดชเดพเดเตเดเตเดเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟเดเดณเตเดฎเดพเดฏเตเดณเตเดณ เดธเดพเดฎเตเดฏเด เดเดชเดฏเตเดเดฟเดเตเดเดพเดฃเต เดเดคเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเต iproute2
, เดจเดฎเตเดเตเดเต เดเดตเดฟเดเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเดฑเดฏเดพเด ip a s eth0
เดชเดเดฐเด ip addr show dev eth0
.
เดคเตเดฐเตเดฎเดพเดจเด
เดเดพเดฎเตเดชเดฟเดจเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดค เดซเดฒเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เด เดณเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดเตบ-เดฆเดฟ-เดซเตเดฒเต เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเตเด เดเดฐเต เดเตเดณเตเดณเดฟเดจเต เดทเต เดเตเดฏเตเดฏเดพเตป BPF เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต. UNIX-เดจเตเดฑเต เดเดฑเตเดฑเดตเตเด เดฎเดฟเดเดเตเด เดชเดพเดฐเดฎเตเดชเดฐเตเดฏเดเตเดเดณเดฟเตฝ, เดธเดฟเดธเตเดฑเตเดฑเด เดตเดณเดฐเต เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต: เดเตเตผเดฃเตฝ (เดตเตเดฃเตเดเตเด) เดชเตเดฐเตเดเตเดฐเดพเด เดเตเดฏเตเดฏเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเดเดตเดฟเดงเดพเดจเด เดงเดพเดฐเดพเดณเด เดเดณเตเดเดณเตเดฏเตเด เดเตผเดเดจเตเดธเตเดทเดจเตเดเดณเตเดฏเตเด เดชเดฐเตเดเตเดทเดฃเดเตเดเตพ เดจเดเดคเตเดคเดพเตป เด เดจเตเดตเดฆเดฟเดเตเดเต. เดเตเดเดพเดคเต, เดชเดฐเตเดเตเดทเดฃเดเตเดเดณเตเด เด เดคเตเดชเตเดฒเต เดคเดจเตเดจเต เดฌเดฟเดชเดฟเดเดซเต เดเตปเดซเตเดฐเดพเดธเตเดเตเดฐเดเตเดเดฑเดฟเดจเตเดฑเต เดตเดฟเดเดธเดจเดตเตเด เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟเดเตเดเดฟเดฒเตเดฒเตเดเตเดเดฟเดฒเตเด, เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเต เดเดคเดฟเดจเดเด เดธเตเดฅเดฟเดฐเดคเดฏเตเดณเตเดณ เดเดฐเต เดเดฌเดฟเด เดเดฃเตเดเต, เด เดคเต เดตเดฟเดถเตเดตเดธเดจเตเดฏเดตเตเด เดเดฑเตเดฑเดตเตเด เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเดฟ เดซเดฒเดชเตเดฐเดฆเดตเตเดฎเดพเดฏ เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดฒเตเดเดฟเดเตเดเต เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต.
เดเดจเตเดฑเต เด เดญเดฟเดชเตเดฐเดพเดฏเดคเตเดคเดฟเตฝ, เดธเดพเดเตเดเตเดคเดฟเดเดตเดฟเดฆเตเดฏ เดตเดณเดฐเต เดเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏเดฟเดคเตเดคเตเตผเดจเตเดจเตเดตเตเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเดเตเดเดพเตป เดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเต, เดเดพเดฐเดฃเด เดเดฐเต เดตเดถเดคเตเดคเต เด เดคเดฟเดจเต เดเดดเดฟเดฏเตเด เดเดณเดฟเดเตเดเตเด (เดเดฐเต เดฏเดจเตเดคเตเดฐเดคเตเดคเดฟเดจเตเดฑเต เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏ เดเดฐเต เดธเดพเดฏเดพเดนเตเดจเดคเตเดคเดฟเตฝ เดเตเดเตเดคเดฒเต เดเตเดฑเดตเต เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเดพเด), เดฎเดฑเตเดตเดถเดคเตเดคเต, เด เดคเดฟเดจเตเดฑเต เดฐเตเดชเดคเตเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเดพเดคเตเดค (เดฎเดจเตเดนเดฐเดฎเดพเดฏเดฟ) เดชเตเดฐเดถเตเดจเดเตเดเตพ เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเตป. เด เดฐเดฃเตเดเต เดเดเดเดเตเดเดณเตเด เดเดฐเตเดฎเดฟเดเตเดเต เดเดณเตเดเดณเต เดชเดฐเตเดเตเดทเดฟเดเตเดเดพเดจเตเด เดธเตเดตเดชเตเดจเด เดเดพเดฃเดพเดจเตเด เดชเตเดฐเตเดฐเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต, เดเดคเต เดเตเดเตเดคเตฝ เดจเตเดคเดจเดฎเดพเดฏ เดชเดฐเดฟเดนเดพเดฐเดเตเดเดณเตเดเต เดเดตเดฟเตผเดญเดพเดตเดคเตเดคเดฟเดฒเตเดเตเดเต เดจเดฏเดฟเดเตเดเตเดจเตเดจเต.
เด เดฒเตเดเดจเด, เดชเตเดฐเดคเตเดฏเตเดเดฟเดเตเดเต เดเตเดฑเตเดคเดฒเตเดฒเตเดเตเดเดฟเดฒเตเด, เดฌเดฟเดชเดฟเดเดซเดฟเดจเตเดฑเต เดฒเตเดเดคเตเดคเตเดเตเดเตเดณเตเดณ เดเดฐเต เดเดฎเตเดเด เดฎเดพเดคเตเดฐเดฎเดพเดฃเต, เดเตเดเดพเดคเต "เดตเดฟเดชเตเดฒเดฎเดพเดฏ" เดธเดตเดฟเดถเตเดทเดคเดเดณเตเด เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏเดฏเตเดเต เดชเตเดฐเดงเดพเดจ เดญเดพเดเดเตเดเดณเตเด เดตเดฟเดตเดฐเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ. เดฎเตเดจเตเดจเตเดเตเดเต เดชเตเดเตเดจเตเดจ เดชเตเดฒเดพเตป เดเดคเตเดชเตเดฒเตเดฏเดพเดฃเต: เด เดเตเดคเตเดค เดฒเตเดเดจเด BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเตเดเต เดเดฐเต เด เดตเดฒเตเดเดจเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเตเด (5.8 เดเตเตผเดฃเดฒเดฟเตฝ 30 เดคเดฐเด เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดชเดฟเดจเตเดคเตเดฃเดฏเตเดเตเดเตเดจเตเดจเต), เดคเตเดเตผเดจเตเดจเต เดเตเตผเดฃเตฝ เดเตเดฐเตเดฏเตโเดธเดฟเดเดเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดฏเดฅเดพเตผเดคเตเดฅ BPF เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพ เดเดเตเดเดจเต เดเดดเตเดคเดพเดฎเตเดจเตเดจเต เดเดเตเดเตพ เดจเตเดเตเดเดพเด. เดเดฐเต เดเดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ, เดฌเดฟเดชเดฟเดเดซเต เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดเตเดเตเดคเตฝ เดเดดเดคเตเดคเดฟเดฒเตเดณเตเดณ เดเตเดดเตโเดธเดฟเดจเตเดณเตเดณ เดธเดฎเดฏเดฎเดพเดฃเดฟเดคเต, เดคเตเดเตผเดจเตเดจเต เดฌเดฟเดชเดฟเดเดซเต เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเดฟเดเดเดฟเดจเตเดฑเตเดฏเตเด เดธเตเดฐเดเตเดทเดพ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเดณเตเดเตเดฏเตเด เดเดฆเดพเดนเดฐเดฃเดเตเดเตพ.
เด เดชเดฐเดฎเตเดชเดฐเดฏเดฟเดฒเต เดฎเตเตป เดฒเตเดเดจเดเตเดเตพ
เดฒเดฟเดเตเดเตเดเตพ
-
BPF, XDP เดฑเดซเดฑเตปเดธเต เดเตเดกเต - เดธเดฟเดฒเดฟเดฏเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฌเดฟเดชเดฟเดเดซเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเตป, เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดฌเดฟเดชเดฟเดเดซเดฟเดจเตเดฑเต เดธเตเดฐเดทเตโเดเดพเดเตเดเดณเดฟเดฒเตเด เดชเดฐเดฟเดชเดพเดฒเดฟเดเตเดเตเดจเตเดจเดตเดฐเดฟเดฒเตเดฐเดพเดณเดพเดฏ เดกเดพเดจเดฟเดฏเตฝ เดฌเตเตผเดเตเดเตโเดฎเดพเดจเดฟเตฝ เดจเดฟเดจเตเดจเต. เดกเดพเดจเดฟเดฏเตเดฒเดฟเดจเต เดคเดพเตป เดเดจเตเดคเดพเดฃเต เดเดดเตเดคเตเดจเตเดจเดคเตเดจเตเดจเต เดเตเดคเตเดฏเดฎเดพเดฏเดฟ เด เดฑเดฟเดฏเดพเดฎเตเดจเตเดจเตเด เด เดคเดฟเตฝ เดคเตเดฑเตเดฑเตเดเดณเตเดจเตเดจเตเดฎเดฟเดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเดฒเตเด เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฐเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ เดเดฆเตเดฏเดคเตเดคเต เดเตเดฐเตเดคเดฐเดฎเดพเดฏ เดตเดฟเดตเดฐเดฃเดเตเดเดณเดฟเตฝ เดเดจเตเดจเดพเดฃเดฟเดคเต. เดชเตเดฐเดคเตเดฏเตเดเดฟเดเตเดเตเด, เด เดฑเดฟเดฏเดชเตเดชเตเดเตเดจเตเดจ เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต XDP, TC เดคเดฐเดเตเดเดณเตเดเต BPF เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเดณเตเดฎเดพเดฏเดฟ เดเดเตเดเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเดฎเตเดจเตเดจเต เด เดชเตเดฐเดฎเดพเดฃเด เดตเดฟเดตเดฐเดฟเดเตเดเตเดจเตเดจเต.ip
เดชเดพเดเตเดเตเดเดฟเตฝ เดจเดฟเดจเตเดจเตiproute2
. -
เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเตป/เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเดฟเดเดเต/filter.txt โ เดเตเดฒเดพเดธเดฟเดเตเดเดฟเดจเตเดณเตเดณ เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเดจเตเดเตเดเตเดเดฟเดฏ เดฏเดฅเดพเตผเดคเตเดฅ เดซเดฏเตฝ, เดคเตเดเตผเดจเตเดจเต เดตเดฟเดชเตเดฒเตเดเดฐเดฟเดเตเด BPF. เดจเดฟเดเตเดเตพเดเตเดเต เด เดธเดเดฌเตเดฒเดฟ เดญเดพเดทเดฏเตเด เดธเดพเดเตเดเตเดคเดฟเด เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏเดพ เดตเดฟเดถเดฆเดพเดเดถเดเตเดเดณเตเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดฃเดฎเตเดเตเดเดฟเตฝ เดเดฐเต เดจเดฒเตเดฒ เดตเดพเดฏเดจ. -
เดซเตเดธเตเดฌเตเดเตเดเดฟเตฝ เดจเดฟเดจเตเดจเต BPF เดจเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดฌเตเดฒเตเดเต . เด เดฒเดเตเดธเดฟ เดธเตเดฑเตเดฑเดพเดฑเตเดตเตเดฏเดฟเดฑเตเดฑเตเดตเต (เดเดฌเดฟเดชเดฟเดเดซเดฟเดจเตเดฑเต เดฐเดเดฏเดฟเดคเดพเดตเต) เดเตปเดกเตเดฐเดฟ เดจเดเตเดฐเดฟเดเตเดเต - (เดชเดฐเดฟเดชเดพเดฒเดเตป) เดเดจเตเดจเดฟเดตเตผ เด เดตเดฟเดเต เดเดดเตเดคเตเดจเตเดจเดคเต เดชเตเดฒเต, เดเดคเต เดตเดณเดฐเต เด เดชเตเตผเดตเดฎเดพเดฏเดฟ เดฎเดพเดคเตเดฐเดฎเต เด เดชเตเดกเตเดฑเตเดฑเต เดเตเดฏเตเดฏเดชเตเดชเตเดเตเดจเตเดจเตเดณเตเดณเต, เดเดจเตเดจเดพเตฝ เดเดเดฟเดคเดฎเดพเดฏเดฟ.libbpf
). -
bpftool-เดจเตเดฑเต เดฐเดนเดธเตเดฏเดเตเดเตพ . bpftool เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดฑเต เดเดฆเดพเดนเดฐเดฃเดเตเดเดณเตเด เดฐเดนเดธเตเดฏเดเตเดเดณเตเด เด เดเดเตเดเดฟเดฏ Quentin Monnet-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฐเดธเดเดฐเดฎเดพเดฏ เดเตเดตเดฟเดฑเตเดฑเตผ เดคเตเดฐเตเดกเต. -
BPF-เดฒเตเดเตเดเต เดกเตเดตเต เดเตเดฏเตเดฏเตเด: เดตเดพเดฏเดจ เดธเดพเดฎเดเตเดฐเดฟเดเดณเตเดเต เดเดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต . Quentin Monnet-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ BPF เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเดจเดฟเดฒเตเดเตเดเตเดณเตเดณ เดฒเดฟเดเตเดเตเดเดณเตเดเต เดเดฐเต เดตเดฒเดฟเดฏ (เดเดชเตเดชเตเดดเตเด เดชเดฐเดฟเดชเดพเดฒเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจ) เดฒเดฟเดธเตเดฑเตเดฑเต.
เด เดตเดฒเดเดฌเด: www.habr.com