เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชเช• เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€ เชนเชคเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ BPF เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเชคเซเช‚ เชนเชคเซเช‚. เช…เชฎเซ‡ เชคเซ‡เชจเชพ เชคเชฐเชซ เชœเซ‹เชฏเซเช‚ เช…เช—เชพเช‰เชจเชพ, เช† เชถเซเชฐเซ‡เชฃเซ€เชจเซ‹ เช“เชฒเซเชก เชŸเซ‡เชธเซเชŸเชพเชฎเซ‡เชจเซเชŸ เชฒเซ‡เช–. 2013 เชฎเชพเช‚, เชเชฒเซ‡เช•เซเชธเซ€ เชธเซเชŸเชพเชฐเซ‹เชตเซ‹เช‡เชŸเซ‹เชต เช…เชจเซ‡ เชกเซ‡เชจเชฟเชฏเชฒ เชฌเซ‹เชฐเซเช•เชฎเซ‡เชจเชจเชพ เชชเซเชฐเชฏเชพเชธเซ‹ เชฆเซเชตเชพเชฐเชพ, เช†เชงเซเชจเชฟเช• 64-เชฌเซ€เชŸ เชฎเชถเซ€เชจเซ‹ เชฎเชพเชŸเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเชพเชฏเซ‡เชฒ เชคเซ‡เชจเซเช‚ เชธเซเชงเชพเชฐเซ‡เชฒเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ, เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช…เชจเซ‡ Linux เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชถเชพเชฎเซ‡เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚. เช† เชจเชตเซ€ เชŸเซ‡เช•เชจเซ‹เชฒเซ‹เชœเซ€เชจเซ‡ เชธเช‚เช•เซเชทเชฟเชชเซเชคเชฎเชพเช‚ เช†เช‚เชคเชฐเชฟเช• BPF เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€, เชคเซเชฏเชพเชฐเชฌเชพเชฆ เชคเซ‡เชจเซเช‚ เชจเชพเชฎ เชเช•เซเชธเชŸเซ‡เชจเซเชกเซ‡เชก BPF เชฐเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚, เช…เชจเซ‡ เชนเชตเซ‡, เช˜เชฃเชพ เชตเชฐเซเชทเซ‹ เชชเช›เซ€, เชฆเชฐเซ‡เช• เชคเซ‡เชจเซ‡ เชซเช•เซเชค BPF เช•เชนเซ‡ เช›เซ‡.

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช•เชนเซ€เช เชคเซ‹, BPF เชคเชฎเชจเซ‡ Linux เช•เชฐเซเชจเชฒ เชธเซเชชเซ‡เชธเชฎเชพเช‚ เชฎเชจเชธเซเชตเซ€ เชฐเซ€เชคเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฆเซเชตเชพเชฐเชพ เชชเซ‚เชฐเชพ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เช•เซ‹เชก เชšเชฒเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เช…เชจเซ‡ เชจเชตเซเช‚ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชเชŸเชฒเซเช‚ เชธเชซเชณ เชฌเชจเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เชคเซ‡เชจเซ€ เชฌเชงเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชจเซ‡ เชตเชงเซ เชกเชเชจ เชฒเซ‡เช–เซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. (เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“เช เชฎเชพเชคเซเชฐ เชเช• เชœ เชตเชธเซเชคเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซ€ เชจ เชนเชคเซ€, เชœเซ‡เชฎ เช•เซ‡ เชคเชฎเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจ เช•เซ‹เชกเชฎเชพเช‚ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, เชคเซ‡ เชฏเซ‹เช—เซเชฏ เชฒเซ‹เช—เซ‹ เชฌเชจเชพเชตเชคเซ€ เชนเชคเซ€.)

เช† เชฒเซ‡เช– BPF เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชจเซเช‚ เชฎเชพเชณเช–เซเช‚, BPF เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เช•เชฐเซเชจเชฒ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ, เชตเชฟเช•เชพเชธ เชธเชพเชงเชจเซ‹, เชคเซ‡เชฎเชœ เชนเชพเชฒเชจเซ€ เช•เซเชทเชฎเชคเชพเช“เชจเซ€ เชŸเซ‚เช‚เช•เซ€, เช–เซ‚เชฌ เชœ เชธเช‚เช•เซเชทเชฟเชชเซเชค เชเชพเช‚เช–เซ€เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡. BPF เชจเชพ เชตเซเชฏเชตเชนเชพเชฐเซ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹เชจเชพ เชŠเช‚เชกเชพ เช…เชญเซเชฏเชพเชธ เชฎเชพเชŸเซ‡ เช†เชชเชฃเชจเซ‡ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ เชคเซ‡ เชฌเชงเซเช‚.
เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

เชฒเซ‡เช–เชจเซ‹ เชธเชพเชฐเชพเช‚เชถ

BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ‹ เชชเชฐเชฟเชšเชฏ. เชธเซŒเชชเซเชฐเชฅเชฎ, เช…เชฎเซ‡ BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซเช‚ เชชเช•เซเชทเซ€เชฆเชฐเซเชถเชจ เช•เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เชฎเซเช–เซเชฏ เช˜เชŸเช•เซ‹เชจเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพ เช•เชฐเซ€เชถเซเช‚.

BPF เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชจเซ€ เชฐเชœเชฟเชธเซเชŸเชฐ เช…เชจเซ‡ เช•เชฎเชพเชจเซเชก เชธเชฟเชธเซเชŸเชฎ. เชเช•เช‚เชฆเชฐเซ‡ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ‹ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช–เซเชฏเชพเชฒ เชนเซ‹เชตเชพเชฅเซ€, เช…เชฎเซ‡ BPF เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชจเซ€ เชฐเชšเชจเชพเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เชถเซเช‚.

BPF เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ, bpffs เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎเชจเซเช‚ เชœเซ€เชตเชจ เชšเช•เซเชฐ. เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚, เช…เชฎเซ‡ BPF เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ - เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช…เชจเซ‡ เชจเช•เชถเชพเชจเชพ เชœเซ€เชตเชจ เชšเช•เซเชฐเชจเซ‡ เชจเชœเซ€เช•เชฅเซ€ เชœเซ‹เชˆเชถเซเช‚.

bpf เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเซเช‚. เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชธเชฟเชธเซเชŸเชฎเชจเซ€ เชฅเซ‹เชกเซ€ เชธเชฎเชœเชฃ เชธเชพเชฅเซ‡, เช…เชฎเซ‡ เช†เช–เชฐเซ‡ เช–เชพเชธ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธเชฎเชพเช‚เชฅเซ€ เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชนเซ‡เชฐเชซเซ‡เชฐ เช•เชฐเชตเซ€ เชคเซ‡ เชœเซ‹เชˆเชถเซเช‚ - bpf(2).

ะŸะธัˆะตะผ ะฟั€ะพะณั€ะฐะผะผั‹ BPF ั ะฟะพะผะพั‰ัŒัŽ libbpf. เช…เชฒเชฌเชคเซเชค, เชคเชฎเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฒเช–เซ€ เชถเช•เซ‹ เช›เซ‹. เชชเชฐเช‚เชคเซ เชคเซ‡ เชฎเซเชถเซเช•เซ‡เชฒ เช›เซ‡. เชตเชงเซ เชตเชพเชธเซเชคเชตเชฟเช• เชฆเซƒเชถเซเชฏ เชฎเชพเชŸเซ‡, เชชเชฐเชฎเชพเชฃเซ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฐเซ‹เช เชเช• เชชเซเชธเซเชคเช•เชพเชฒเชฏ เชตเชฟเช•เชธเชพเชตเซเชฏเซเช‚ libbpf. เช…เชฎเซ‡ เชเช• เชฎเซ‚เชณเชญเซ‚เชค BPF เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชนเชพเชกเชชเชฟเช‚เชœเชฐ เชฌเชจเชพเชตเซ€เชถเซเช‚ เชœเซ‡เชจเซ‹ เช…เชฎเซ‡ เช…เชจเซเช—เชพเชฎเซ€ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชฎเชพเช‚ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚.

เช•เชฐเซเชจเชฒ เชนเซ‡เชฒเซเชชเชฐเซเชธ. เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชถเซ€เช–เซ€เชถเซเช‚ เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชฐเซเชจเชฒ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจเซเชธเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ - เชเช• เชธเชพเชงเชจ เชœเซ‡ เชจเช•เชถเชพ เชธเชพเชฅเซ‡, เช•เซเชฒเชพเชธเชฟเช•เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€เชฎเชพเช‚ เชจเชตเชพ BPFเชจเซ€ เช•เซเชทเชฎเชคเชพเช“เชจเซ‡ เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ‡ เช›เซ‡.

BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพเชจเซ€ เชเช•เซเชธเซ‡เชธ. เช† เชฌเชฟเช‚เชฆเซเช, เช…เชฎเซ‡ เชจเช•เชถเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเซ€ เชถเช•เซ€เช เชคเซ‡ เชฌเชฐเชพเชฌเชฐ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชœเชพเชฃเซ€เชถเซเช‚. เช…เชจเซ‡ เชšเชพเชฒเซ‹ เชฎเชนเชพเชจ เช…เชจเซ‡ เชถเช•เชฟเชคเชถเชพเชณเซ€ เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐเชฎเชพเช‚ เชเช• เชเชกเชชเซ€ เชกเซ‹เช•เชฟเชฏเซเช‚ เชชเชฃ เช•เชฐเซ€เช.

เชตเชฟเช•เชพเชธ เชธเชพเชงเชจเซ‹. เชชเซเชฐเชฏเซ‹เช—เซ‹ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพ เชคเซ‡ เช…เช‚เช—เซ‡เชจเซ‹ เชธเชนเชพเชฏ เชตเชฟเชญเชพเช—.

เชจเชฟเชทเซเช•เชฐเซเชท เชฒเซ‡เช–เชจเชพ เช…เช‚เชคเซ‡, เชœเซ‡เช“ เช†เชŸเชฒเซเช‚ เชตเชพเช‚เชšเซ‡ เช›เซ‡ เชคเซ‡เช“เชจเซ‡ เชชเซเชฐเซ‡เชฐเช• เชถเชฌเซเชฆเซ‹ เช…เชจเซ‡ เชชเช›เซ€เชจเชพ เชฒเซ‡เช–เซ‹เชฎเชพเช‚ เชถเซเช‚ เชฅเชถเซ‡ เชคเซ‡เชจเซเช‚ เชŸเซ‚เช‚เช•เซเช‚ เชตเชฐเซเชฃเชจ เชฎเชณเชถเซ‡. เช…เชฎเซ‡ เชเชตเชพ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ เชธเซเชต-เช…เชญเซเชฏเชพเชธ เชฎเชพเชŸเซ‡เชจเซ€ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เชฒเชฟเช‚เช•เซเชธ เชชเชฃ เชธเซ‚เชšเชฟเชฌเชฆเซเชง เช•เชฐเซ€เชถเซเช‚ เชœเซ‡เชฎเชจเซ€ เชชเชพเชธเซ‡ เชšเชพเชฒเซ เชฐเชพเช–เชตเชพเชจเซ€ เชฐเชพเชน เชœเซ‹เชตเชพเชจเซ€ เช‡เชšเซเช›เชพ เช…เชฅเชตเชพ เช•เซเชทเชฎเชคเชพ เชจเชฅเซ€.

BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ‹ เชชเชฐเชฟเชšเชฏ

เช…เชฎเซ‡ BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‡เชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ€เช เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚, เช…เชฎเซ‡ เชเช• เช›เซ‡เชฒเซเชฒเซ€ เชตเชพเชฐ (เช“เชน) เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เชฒเชˆเชถเซเช‚ เช•เซเชฒเชพเชธเชฟเช• BPF, เชœเซ‡ RISC เชฎเชถเซ€เชจเซ‹เชจเชพ เช†เช—เชฎเชจเชจเชพ เชชเซเชฐเชคเชฟเชญเชพเชต เชคเชฐเซ€เช•เซ‡ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ เช…เชจเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐเชฟเช‚เช—เชจเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เชนเชฒ เช•เชฐเซ€ เชนเชคเซ€. เช† เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชเชŸเชฒเซเช‚ เชธเชซเชณ เชฌเชจเซเชฏเซเช‚ เช•เซ‡, เชฌเชฐเซเช•เชฒเซ‡ UNIX เชฎเชพเช‚ เชกเซ…เชถเชฟเช‚เช— เชจเซ‡เชตเซเช‚เชจเชพ เชฆเชพเชฏเช•เชพเชฎเชพเช‚ เชœเชจเซเชฎเซเชฏเชพ เชชเช›เซ€, เชคเซ‡ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ€ เชนเชพเชฒเชจเซ€ เช‘เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเซเชธเชฎเชพเช‚ เชชเซ‹เชฐเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€, เชคเซ‡ เช•เซเชฐเซ‡เชเซ€ เชตเซ€เชธเชฎเชพเช‚ เชŸเช•เซ€ เชฐเชนเซ€ เชนเชคเซ€ เช…เชจเซ‡ เชนเชœเซ เชชเชฃ เชจเชตเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชถเซ‹เชงเซ€ เชฐเชนเซ€ เช›เซ‡.

เชจเชตเซเช‚ BPF 64-เชฌเซ€เชŸ เชฎเชถเซ€เชจเซ‹เชจเซ€ เชธเชฐเซเชตเชตเซเชฏเชพเชชเช•เชคเชพ, เช•เซเชฒเชพเช‰เชก เชธเซ‡เชตเชพเช“ เช…เชจเซ‡ SDN (Sเช‘เชซเชตเซ‡เชฐ-dเชถเซเชฆเซเชง nเช•เชพเชฎ เช•เชฐเชตเซเช‚). เช•เซเชฒเชพเชธเชฟเช• BPF เชฎเชพเชŸเซ‡ เชธเซเชงเชพเชฐเซ‡เชฒ เชฐเชฟเชชเซเชฒเซ‡เชธเชฎเซ‡เชจเซเชŸ เชคเชฐเซ€เช•เซ‡ เช•เชฐเซเชจเชฒ เชจเซ‡เชŸเชตเชฐเซเช• เช‡เชœเชจเซ‡เชฐเซ‹ เชฆเซเชตเชพเชฐเชพ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ, เชจเชตเชพ BPFเชจเซ‡ เชถเชพเชฌเซเชฆเชฟเช• เชฐเซ€เชคเซ‡ เช› เชฎเชนเชฟเชจเชพ เชชเช›เซ€ Linux เชธเชฟเชธเซเชŸเชฎเซเชธเชจเซ‡ เชŸเซเชฐเซ‡เชธ เช•เชฐเชตเชพเชจเชพ เชฎเซเชถเซเช•เซ‡เชฒ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชณเซ€, เช…เชจเซ‡ เชนเชตเซ‡, เชคเซ‡เชจเชพ เชฆเซ‡เช–เชพเชตเชจเชพ เช› เชตเชฐเซเชท เชชเช›เซ€, เช…เชฎเชจเซ‡ เช†เช–เชพ เช†เช—เชพเชฎเซ€ เชฒเซ‡เช–เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชตเชฟเชตเชฟเชง เชชเซเชฐเช•เชพเชฐเชจเชพ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹เชจเซ€ เชฏเชพเชฆเซ€ เชฌเชจเชพเชตเซ‹.

เชฐเชฎเซเชœเซ€ เชšเชฟเชคเซเชฐเซ‹

เชคเซ‡เชจเชพ เชฎเซ‚เชณเชฎเชพเช‚, BPF เช เชธเซ‡เชจเซเชกเชฌเซ‹เช•เซเชธ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชธเซเชฐเช•เซเชทเชพ เชธเชพเชฅเซ‡ เชธเชฎเชพเชงเชพเชจ เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เช•เชฐเซเชจเชฒ เชธเซเชชเซ‡เชธเชฎเชพเช‚ "เชฎเชจเชธเซเชตเซ€" เช•เซ‹เชก เชšเชฒเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธเชฎเชพเช‚ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเซเช• เช‡เชตเซ‡เชจเซเชŸ เชธเซ‹เชฐเซเชธ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เชนเซ‹เชฏ เช›เซ‡. เช˜เชŸเชจเชพ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชจเซ‡เชŸเชตเชฐเซเช• เชˆเชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚ เชชเซ‡เช•เซ‡เชŸเชจเซ€ เชกเชฟเชฒเชฟเชตเชฐเซ€, เช•เซ‡เชŸเชฒเชพเช• เช•เชฐเซเชจเชฒ เชซเช‚เช•เซเชถเชจเชจเซเช‚ เชฒเซ‹เชจเซเชšเชฟเช‚เช— เชตเช—เซ‡เชฐเซ‡ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เชชเซ‡เช•เซ‡เชœเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชชเซ‡เช•เซ‡เชœเชจเชพ เชกเซ‡เชŸเชพ เช…เชจเซ‡ เชฎเซ‡เชŸเชพเชกเซ‡เชŸเชพเชจเซ€ เชเช•เซเชธเซ‡เชธ เชนเชถเซ‡ (เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซ‡, เชธเช‚เชญเชตเชคเชƒ, เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เชชเซเชฐเช•เชพเชฐ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ€เชจเซ‡); เช•เชฐเซเชจเชฒ เชซเช‚เช•เซเชถเชจ เชšเชฒเชพเชตเชตเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฆเชฒเซ€เชฒเซ‹ เช•เชฐเซเชจเชฒ เชฎเซ‡เชฎเชฐเซ€ เชตเช—เซ‡เชฐเซ‡เชจเชพ เชจเชฟเชฐเซเชฆเซ‡เชถเช•เซ‹ เชธเชนเชฟเชค เชซเช‚เช•เซเชถเชจ.

เชšเชพเชฒเซ‹ เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชชเชฐ เชจเชœเซ€เช•เชฅเซ€ เชจเชœเชฐ เช•เชฐเซ€เช. เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เช•เซเชฒเชพเชธเชฟเช• BPF เชจเชพ เชชเซเชฐเชฅเชฎ เชคเชซเชพเชตเชค เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เช, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเชฐเชฎเชพเช‚ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ. เชจเชตเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚, เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ เชœเซ‡เชฅเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช‰เชšเซเชš-เชธเซเชคเชฐเชจเซ€ เชญเชพเชทเชพเช“เชฎเชพเช‚ เชฒเช–เซ€ เชถเช•เชพเชฏ, เชฎเซเช–เซเชฏเชคเซเชตเซ‡, เช…เชฒเชฌเชคเซเชค, C เชฎเชพเช‚. เช† เชฎเชพเชŸเซ‡, llvm เชฎเชพเชŸเซ‡ เชฌเซ‡เช•เชเชจเซเชก เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚, เชœเซ‡ เชคเชฎเชจเซ‡ BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชฎเชพเชŸเซ‡ เชฌเชพเช‡เชŸเช•เซ‹เชก เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ‡ เช†เช‚เชถเชฟเช• เชฐเซ€เชคเซ‡, เช†เชงเซเชจเชฟเช• เชฎเชถเซ€เชจเซ‹ เชชเชฐ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชฐเซ€เชคเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชกเชฟเชเชพเช‡เชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚. เช† เช•เชพเชฐเซเชฏเชจเซ‡ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, BPF เชฌเชพเชˆเชŸเช•เซ‹เชก, เชเช•เชตเชพเชฐ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เชฅเชˆ เชœเชพเชฏ เช›เซ‡, เชœเซ‡ JIT เช•เชฎเซเชชเชพเชˆเชฒเชฐ เชจเชพเชฎเชจเชพ เช˜เชŸเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฎเซ‚เชณ เช•เซ‹เชกเชฎเชพเช‚ เช…เชจเซเชตเชพเชฆเชฟเชค เชฅเชพเชฏ เช›เซ‡Just In Time). เช†เช—เชณ, เชœเซ‹ เชคเชฎเชจเซ‡ เชฏเชพเชฆ เชนเซ‹เชฏ, เชคเซ‹ เช•เซเชฒเชพเชธเชฟเช• BPF เชฎเชพเช‚ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ เช…เชจเซ‡ เช‡เชตเซ‡เชจเซเชŸ เชธเซ‹เชฐเซเชธ เชธเชพเชฅเซ‡ เช…เชฃเซ เชฐเซ€เชคเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เชนเชคเซ‹ - เชธเชฟเช‚เช—เชฒ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚. เชจเชตเชพ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚, เช† เชฌเซ‡ เชคเชฌเช•เซเช•เชพเชฎเชพเช‚ เชฅเชพเชฏ เช›เซ‡ - เชชเซเชฐเชฅเชฎ, เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‹เชก เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡. bpf(2)เช…เชจเซ‡ เชชเช›เซ€, เชชเช›เซ€เชฅเซ€, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เชชเซเชฐเช•เชพเชฐเชจเซ‡ เช†เชงเชพเชฐเซ‡ เชฌเชฆเชฒเชพเชคเซ€ เช…เชจเซเชฏ เชชเชฆเซเชงเชคเชฟเช“ เชฆเซเชตเชพเชฐเชพ, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช‡เชตเซ‡เชจเซเชŸเชจเชพ เชธเซเชคเซเชฐเซ‹เชค เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏ เช›เซ‡.

เช…เชนเซ€เช‚ เชตเชพเชšเช•เชจเซ‡ เชเช• เชชเซเชฐเชถเซเชจ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡: เชถเซเช‚ เชคเซ‡ เชถเช•เซเชฏ เชนเชคเซเช‚? เช†เชตเชพ เช•เซ‹เชกเชจเชพ เช…เชฎเชฒเชจเซ€ เชธเชฒเชพเชฎเชคเซ€เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡? เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชพเชคเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‡ เชฒเซ‹เชก เช•เชฐเชตเชพเชจเชพ เชธเซเชŸเซ‡เชœ เชฆเซเชตเชพเชฐเชพ เชเช•เซเชเชฟเช•เซเชฏเซเชถเชจ เชธเซ‡เชซเซเชŸเซ€เชจเซ€ เช–เชพเชคเชฐเซ€ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ (เช…เช‚เช—เซเชฐเซ‡เชœเซ€เชฎเชพเช‚ เช† เชธเซเชŸเซ‡เชœเชจเซ‡ เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชนเซเช‚ เช…เช‚เช—เซเชฐเซ‡เชœเซ€ เชถเชฌเซเชฆเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เซ€เชถ):

เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เช เชธเซเชŸเซ‡เชŸเชฟเช• เชตเชฟเชถเซเชฒเซ‡เชทเช• เช›เซ‡ เชœเซ‡ เช–เชพเชคเชฐเซ€ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชฐเซเชจเชฒเชจเซ€ เชธเชพเชฎเชพเชจเซเชฏ เช•เชพเชฎเช—เซ€เชฐเซ€เชฎเชพเช‚ เชตเชฟเช•เซเชทเซ‡เชช เชชเชพเชกเชคเซ‹ เชจเชฅเซ€. เช†เชจเซ‹ เช…เชฐเซเชฅ เช เชจเชฅเซ€ เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเชฟเชธเซเชŸเชฎเชจเชพ เช‘เชชเชฐเซ‡เชถเชจเชฎเชพเช‚ เชฆเช–เชฒ เช•เชฐเซ€ เชถเช•เชคเซ‹ เชจเชฅเซ€ - BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ, เชชเซเชฐเช•เชพเชฐ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ€เชจเซ‡, เช•เชฐเซเชจเชฒ เชฎเซ‡เชฎเชฐเซ€เชจเชพ เชตเชฟเชญเชพเช—เซ‹ เชตเชพเช‚เชšเซ€ เช…เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ€ เชถเช•เซ‡ เช›เซ‡, เชซเช‚เช•เซเชถเชจเชจเชพ เชฎเซ‚เชฒเซเชฏเซ‹ เชชเชฐเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชŸเซเชฐเชฟเชฎ, เชเชชเซ‡เชจเซเชก, เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ€ เชถเช•เซ‡ เช›เซ‡. เช…เชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชชเซ‡เช•เซ‡เชŸเซ‹ เชชเชฃ เชซเซ‹เชฐเชตเชฐเซเชก เช•เชฐเซ‹. เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชฌเชพเช‚เชนเซ‡เชงเชฐเซ€ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเชตเชพเชฅเซ€ เช•เชฐเซเชจเชฒ เช•เซเชฐเซ‡เชถ เชฅเชถเซ‡ เชจเชนเซ€เช‚ เช…เชจเซ‡ เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เซ‡ เชœเซ‡ เชจเชฟเชฏเชฎเซ‹ เช…เชจเซเชธเชพเชฐ, เชฒเช–เชตเชพเชจเซ€ เชเช•เซเชธเซ‡เชธ เชงเชฐเชพเชตเซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช†เช‰เชŸเช—เซ‹เช‡เช‚เช— เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เชกเซ‡เชŸเชพ, เชชเซ‡เช•เซ‡เชŸเชจเซ€ เชฌเชนเชพเชฐ เช•เชฐเซเชจเชฒ เชฎเซ‡เชฎเชฐเซ€เชจเซ‡ เช“เชตเชฐเชฐเชพเช‡เชŸ เช•เชฐเซ€ เชถเช•เชถเซ‡ เชจเชนเซ€เช‚. BPF เชจเชพ เช…เชจเซเชฏ เชคเชฎเชพเชฎ เช˜เชŸเช•เซ‹เชฅเซ€ เชชเชฐเชฟเชšเชฟเชค เชฅเชฏเชพ เชชเช›เซ€, เช…เชฎเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชฅเซ‹เชกเซ€ เชตเชงเซ เชตเชฟเช—เชคเชฎเชพเช‚ เชšเช•เชพเชธเชฃเซ€เช•เชฐเซเชคเชพเชจเซ‡ เชœเซ‹เชˆเชถเซเช‚.

เชคเซ‹ เช†เชชเชฃเซ‡ เช…เชคเซเชฏเชพเชฐ เชธเซเชงเซ€ เชถเซเช‚ เชถเซ€เช–เซเชฏเชพ? เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ C เชฎเชพเช‚ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เซ‡ เช›เซ‡, เชคเซ‡เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡ bpf(2), เชœเซเชฏเชพเช‚ เชคเซ‡ เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชฆเซเชตเชพเชฐเชพ เชคเชชเชพเชธเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฎเซ‚เชณ เชฌเชพเชฏเชŸเซ‡เช•เซ‹เชกเชฎเชพเช‚ เช…เชจเซเชตเชพเชฆเชฟเชค เชฅเชพเชฏ เช›เซ‡. เชชเช›เซ€ เชคเซ‡ เชœ เช…เชฅเชตเชพ เช…เชจเซเชฏ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เช‡เชตเซ‡เชจเซเชŸ เชธเซเชฐเซ‹เชค เชธเชพเชฅเซ‡ เชœเซ‹เชกเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡. เชฌเซ‚เชŸ เช…เชจเซ‡ เช•เชจเซ‡เช•เซเชถเชจเชจเซ‡ เช…เชฒเช— เชชเชพเชกเชตเซเช‚ เช˜เชฃเชพ เช•เชพเชฐเชฃเซ‹เชธเชฐ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชชเซเชฐเชฅเชฎ, เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชšเชฒเชพเชตเชตเซเช‚ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เช–เชฐเซเชšเชพเชณ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชœ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เช˜เชฃเซ€ เชตเช–เชค เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€เชจเซ‡ เช†เชชเชฃเซ‡ เช•เชฎเซเชชเซเชฏเซเชŸเชฐเชจเซ‹ เชธเชฎเชฏ เชฌเช—เชพเชกเซ€เช เช›เซ€เช. เชฌเซ€เชœเซเช‚, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชจเซ‡เช•เซเชŸ เชฅเชฏเซ‡เชฒ เช›เซ‡ เชคเซ‡ เชคเซ‡เชจเชพ เชชเซเชฐเช•เชพเชฐ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ‡ เช›เซ‡, เช…เชจเซ‡ เชเช• เชตเชฐเซเชท เชชเชนเซ‡เชฒเชพเช‚ เชตเชฟเช•เชธเชฟเชค เชเช• "เชฏเซเชจเชฟเชตเชฐเซเชธเชฒ" เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชจเชตเชพ เชชเซเชฐเช•เชพเชฐเชจเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เชจ เชนเซ‹เชˆ เชถเช•เซ‡. (เชœเซ‹เช•เซ‡ เชนเชตเซ‡ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชตเชงเซ เชชเชฐเชฟเชชเช•เซเชต เชฌเชจเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡, เช† เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชจเซ‡ เชธเซเชคเชฐเซ‡ เชเช•เซ€เช•เซƒเชค เช•เชฐเชตเชพเชจเซ‹ เชตเชฟเชšเชพเชฐ เช›เซ‡. libbpf.)

เชธเชšเซ‡เชค เชตเชพเชšเช• เช•เชฆเชพเชš เชจเซ‹เช‚เชง เชฒเซ‡เชถเซ‡ เช•เซ‡ เช…เชฎเซ‡ เชนเชœเซ€ เชšเชฟเชคเซเชฐเซ‹ เชธเชพเชฅเซ‡ เชธเชฎเชพเชชเซเชค เชฅเชฏเชพ เชจเชฅเซ€. เช–เชฐเซ‡เช–เชฐ, เช‰เชชเชฐเซ‹เช•เซเชค เชคเชฎเชพเชฎ เชธเชฎเชœเชพเชตเชคเชพ เชจเชฅเซ€ เช•เซ‡ เชถเชพ เชฎเชพเชŸเซ‡ BPF เช•เซเชฒเชพเชธเชฟเช• BPF เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€เชฎเชพเช‚ เชšเชฟเชคเซเชฐเชจเซ‡ เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เชฌเชฆเชฒเซ‡ เช›เซ‡. เชฌเซ‡ เชจเชตเซ€เชจเชคเชพเช“ เช•เซ‡ เชœเซ‡ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เชฒเชพเช—เซ เชฅเชตเชพเชจเชพ เช…เชตเช•เชพเชถเชจเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชถเซ‡เชฐเซเชก เชฎเซ‡เชฎเชฐเซ€ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เช›เซ‡. BPF เชฎเชพเช‚, เชถเซ‡เชฐเซเชก เชฎเซ‡เชฎเชฐเซ€เชจเซ‡ เช•เชนเซ‡เชตเชพเชคเชพ เชจเช•เชถเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ - เชšเซ‹เช•เซเช•เชธ API เชธเชพเชฅเซ‡ เชถเซ‡เชฐ เช•เชฐเซ‡เชฒ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ. เชคเซ‡เชฎเชจเซ‡ เช•เชฆเชพเชš เช† เชจเชพเชฎ เชฎเชณเซเชฏเซเช‚ เช•เชพเชฐเชฃ เช•เซ‡ เชฆเซ‡เช–เชพเชตเชพเชจเซ‹ เชชเซเชฐเชฅเชฎ เชชเซเชฐเช•เชพเชฐเชจเซ‹ เชจเช•เชถเซ‹ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชนเชคเซ‹. เชชเช›เซ€ เชเชฐเซ‡ เชฆเซ‡เช–เชพเชฏเชพ, เชธเซเชฅเชพเชจเชฟเช• (เชธเซ€เชชเซ€เชฏเซ เชฆเซ€เช ) เชนเซ‡เชถ เช•เซ‹เชทเซเชŸเช•เซ‹ เช…เชจเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชเชฐเซ‡, เชธเชฐเซเชš เชŸเซเชฐเซ€, เชฌเซ€เชชเซ€เชเชซ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เชงเชฐเชพเชตเชคเชพ เชจเช•เชถเชพ เช…เชจเซ‡ เช˜เชฃเซเช‚ เชฌเชงเซเช‚. เชนเชตเซ‡ เช…เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชฐเชธเชชเซเชฐเชฆ เชฌเชพเชฌเชค เช เช›เซ‡ เช•เซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชนเชตเซ‡ เช•เซ‰เชฒเซเชธ เชตเชšเซเชšเซ‡ เชธเซเชŸเซ‡เชŸเชฎเซ‡เชจเซเชŸ เชšเชพเชฒเซ เชฐเชพเช–เชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช…เชจเซเชฏ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช…เชจเซ‡ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธ เชธเชพเชฅเซ‡ เชถเซ‡เชฐ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชงเชฐเชพเชตเซ‡ เช›เซ‡.

เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ bpf(2), เช…เชจเซ‡ เชธเชนเชพเชฏเช• เช•เชพเชฐเซเชฏเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชšเชพเชฒเชคเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชฎเชพเช‚เชฅเซ€. เชตเชงเซเชฎเชพเช‚, เชธเชนเชพเชฏเช•เซ‹ เชฎเชพเชคเซเชฐ เชจเช•เชถเชพ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœ เชจเชนเซ€เช‚, เชชเชฃ เช…เชจเซเชฏ เช•เชฐเซเชจเชฒ เช•เซเชทเชฎเชคเชพเช“เชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฃ เช…เชธเซเชคเชฟเชคเซเชต เชงเชฐเชพเชตเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฌเซ€เชชเซ€เชเชซ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ‡ เช…เชจเซเชฏ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เชซเซ‹เชฐเชตเชฐเซเชก เช•เชฐเชตเชพ, เชชเชฐเซเชซ เชˆเชตเซ‡เชจเซเชŸเซเชธ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ, เช•เชฐเซเชจเชฒ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ เชตเช—เซ‡เชฐเซ‡ เชฎเชพเชŸเซ‡ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

เชธเชพเชฐเชพเช‚เชถเชฎเชพเช‚, BPF เช•เชฐเซเชจเชฒ เชธเซเชชเซ‡เชธเชฎเชพเช‚ เช†เชฐเซเชฌเชฟเชŸเชฐเซ€, เชเชŸเชฒเซ‡ เช•เซ‡ เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ-เชŸเซ‡เชธเซเชŸเซ‡เชก, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช•เซ‹เชกเชจเซ‡ เชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เช† เช•เซ‹เชก เช•เซ‰เชฒเซเชธ เชตเชšเซเชšเซ‡เชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชฌเชšเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเซเชชเซ‡เชธ เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพเชจเซเช‚ เชตเชฟเชจเชฟเชฎเชฏ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เช† เชชเซเชฐเช•เชพเชฐเชจเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชฎเช‚เชœเซ‚เชฐ เช•เชฐเชพเชฏเซ‡เชฒ เช•เชฐเซเชจเชฒ เชธเชฌเชธเชฟเชธเซเชŸเชฎเซเชธเชจเซ€ เชเช•เซเชธเซ‡เชธ เชชเชฃ เชงเชฐเชพเชตเซ‡ เช›เซ‡.

เช† เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช•เชฐเซเชจเชฒ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชฆเซเชตเชพเชฐเชพ เชชเซ‚เชฐเซ€ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เช•เซเชทเชฎเชคเชพเช“ เชœเซ‡เชตเซเช‚ เชœ เช›เซ‡, เชœเซ‡เชจเซ€ เชคเซเชฒเชจเชพเชฎเชพเช‚ BPF เชจเชพ เช•เซ‡เชŸเชฒเชพเช• เชซเชพเชฏเชฆเชพ เช›เซ‡ (เช…เชฒเชฌเชคเซเชค, เชคเชฎเซ‡ เชซเช•เซเชค เชธเชฎเชพเชจ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชธเชฟเชธเซเชŸเชฎ เชŸเซเชฐเซ‡เชธเชฟเช‚เช— - เชคเชฎเซ‡ BPF เชธเชพเชฅเซ‡ เชฎเชจเชธเซเชตเซ€ เชกเซเชฐเชพเช‡เชตเชฐ เชฒเช–เซ€ เชถเช•เชคเชพ เชจเชฅเซ€). เชคเชฎเซ‡ เชจเซ€เชšเซ€ เชเชจเซเชŸเซเชฐเซ€ เชฅเซเชฐเซ‡เชถเซ‹เชฒเซเชก เชจเซ‹เช‚เชงเซ€ เชถเช•เซ‹ เช›เซ‹ (เช•เซ‡เชŸเชฒเซ€เช• เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เช•เซ‡ เชœเซ‡ BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชฎเชพเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เช•เชฐเซเชจเชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เช•เซŒเชถเชฒเซเชฏ เช…เชฅเชตเชพ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เช•เซŒเชถเชฒเซเชฏ เชนเซ‹เชตเซเช‚ เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€), เชฐเชจเชŸเชพเช‡เชฎ เชธเชฒเชพเชฎเชคเซ€ (เชœเซ‡เช“ เชฒเช–เชคเซ€ เชตเช–เชคเซ‡ เชธเชฟเชธเซเชŸเชฎ เชคเซ‹เชกเซ€ เชจเชฅเซ€ เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡ เชŸเชฟเชชเซเชชเชฃเซ€เช“เชฎเชพเช‚ เชคเชฎเชพเชฐเซ‹ เชนเชพเชฅ เชŠเช‚เชšเซ‹ เช•เชฐเซ‹. เช…เชฅเชตเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ‹), เชเชŸเซ‹เชฎเซ€เชธเซ€เชŸเซ€ - เชฎเซ‹เชกเซเชฏเซเชฒเซ‹เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชฒเซ‹เชก เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชกเชพเช‰เชจเชŸเชพเช‡เชฎ เชนเซ‹เชฏ เช›เซ‡, เช…เชจเซ‡ BPF เชธเชฌเชธเชฟเชธเซเชŸเชฎ เช–เชพเชคเชฐเซ€ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เช•เซ‹เชˆ เช‡เชตเซ‡เชจเซเชŸ เชšเซ‚เช•เซ€ เชจ เชœเชพเชฏ (เช‰เชšเชฟเชค เช•เชนเซเช‚ เชคเซ‹, เช† เชคเชฎเชพเชฎ เชชเซเชฐเช•เชพเชฐเชจเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฎเชพเชŸเซ‡ เชธเชพเชšเซเช‚ เชจเชฅเซ€).

เช†เชตเซ€ เช•เซเชทเชฎเชคเชพเช“เชจเซ€ เชนเชพเชœเชฐเซ€ BPF เชจเซ‡ เช•เชฐเซเชจเชฒเชจเชพ เชตเชฟเชธเซเชคเชฐเชฃ เชฎเชพเชŸเซ‡ เชเช• เชธเชพเชฐเซเชตเชคเซเชฐเชฟเช• เชธเชพเชงเชจ เชฌเชจเชพเชตเซ‡ เช›เซ‡, เชœเซ‡ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชชเซเชทเซเชŸเชฟ เชฅเชฏเซ‡เชฒ เช›เซ‡: BPF เชฎเชพเช‚ เชตเชงเซ เช…เชจเซ‡ เชตเชงเซ เชจเชตเชพ เชชเซเชฐเช•เชพเชฐเชจเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชตเชงเซ เช…เชจเซ‡ เชตเชงเซ เชฎเซ‹เชŸเซ€ เช•เช‚เชชเชจเซ€เช“ เชฒเชกเชพเชฏเช• เชธเชฐเซเชตเชฐ 24ร—7 เชชเชฐ BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เชธเซเชŸเชพเชฐเซเชŸเช…เชชเซเชธ เชฌเซ€เชชเซ€เชเชซ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชเชตเชพ เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธ เชชเชฐ เชคเซ‡เชฎเชจเซ‹ เชตเซเชฏเชตเชธเชพเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡. BPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฆเชฐเซ‡เช• เชœเช—เซเชฏเชพเช เชฅเชพเชฏ เช›เซ‡: DDoS เชนเซเชฎเชฒเชพเช“ เชธเชพเชฎเซ‡ เชฐเช•เซเชทเชฃ เช•เชฐเชตเชพ, SDN เชฌเชจเชพเชตเชตเชพ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, kubernetes เชฎเชพเชŸเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชฒเชพเช—เซ เช•เชฐเชตเชพ), เชฎเซเช–เซเชฏ เชธเชฟเชธเซเชŸเชฎ เชŸเซเชฐเซ‡เชธเชฟเช‚เช— เชŸเซ‚เชฒ เช…เชจเซ‡ เช†เช‚เช•เชกเชพ เช•เชฒเซ‡เช•เซเชŸเชฐ เชคเชฐเซ€เช•เซ‡, เช‡เชจเซเชŸเซเชฐเซเชเชจ เชกเชฟเชŸเซ‡เช•เซเชถเชจ เชธเชฟเชธเซเชŸเชฎเซเชธ เช…เชจเซ‡ เชธเซ‡เชจเซเชกเชฌเซ‹เช•เซเชธ เชธเชฟเชธเซเชŸเชฎเซเชธ เชตเช—เซ‡เชฐเซ‡เชฎเชพเช‚.

เชšเชพเชฒเซ‹ เชฒเซ‡เช–เชจเชพ เชตเชฟเชนเช‚เช—เชพเชตเชฒเซ‹เช•เชจ เชญเชพเช—เชจเซ‡ เช…เชนเซ€เช‚ เชธเชฎเชพเชชเซเชค เช•เชฐเซ€เช เช…เชจเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เช…เชจเซ‡ BPF เช‡เช•เซ‹เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชœเซ‹เชˆเช.

เชตเชฟเชทเชฏเชพเช‚เชคเชฐ: เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“

เชจเซ€เชšเซ‡เชจเชพ เชตเชฟเชญเชพเช—เซ‹เชฎเชพเช‚ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเช•เซเชทเชฎ เชฅเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซ€ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ€ เชถเช•เซ‡ เช›เซ‡. llvm/clang bpf เช†เชงเชพเชฐ เชธเชพเชฅเซ‡ เช…เชจเซ‡ bpftool. เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชตเชฟเช•เชพเชธ เชธเชพเชงเชจเซ‹ เชคเชฎเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชธเซ‚เชšเชจเชพเช“ เชคเซ‡เชฎเชœ เชคเชฎเชพเชฐเซ€ เช•เชฐเซเชจเชฒ เชตเชพเช‚เชšเซ€ เชถเช•เซ‹ เช›เซ‹. เช…เชฎเชพเชฐเซ€ เชชเซเชฐเชธเซเชคเซเชคเชฟเชจเซ€ เชธเซเชฎเซ‡เชณเชฎเชพเช‚ เช–เชฒเซ‡เชฒ เชจ เชชเชนเซ‹เช‚เชšเซ‡ เชคเซ‡ เชฎเชพเชŸเซ‡ เช† เชตเชฟเชญเชพเช— เชจเซ€เชšเซ‡ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡.

BPF เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เชฐเชœเชฟเชธเซเชŸเชฐ เช…เชจเซ‡ เชธเซ‚เชšเชจเชพ เชธเชฟเชธเซเชŸเชฎ

BPF เชจเซ€ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช…เชจเซ‡ เช•เชฎเชพเชจเซเชก เชธเชฟเชธเซเชŸเชฎ เช เชนเช•เซ€เช•เชคเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฐเชพเช–เซ€เชจเซ‡ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ C เชญเชพเชทเชพเชฎเชพเช‚ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡, เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เชฅเชฏเชพ เชชเช›เซ€, เชฎเซ‚เชณ เช•เซ‹เชกเชฎเชพเช‚ เช…เชจเซเชตเชพเชฆเชฟเชค เชฅเชถเซ‡. เชคเซ‡เชฅเซ€, เช—เชพเชฃเชฟเชคเชฟเช• เช…เชฐเซเชฅเชฎเชพเช‚, เช†เชงเซเชจเชฟเช• เชฎเชถเซ€เชจเซ‹เชจเซ€ เช•เซเชทเชฎเชคเชพเช“เชจเชพ เช†เช‚เชคเชฐเช›เซ‡เชฆ เชชเชฐ เชจเชœเชฐ เชฐเชพเช–เซ€เชจเซ‡ เชฐเชœเชฟเชธเซเชŸเชฐเชจเซ€ เชธเช‚เช–เซเชฏเชพ เช…เชจเซ‡ เช†เชฆเซ‡เชถเซ‹เชจเซ‹ เชธเชฎเซ‚เชน เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹. เชตเชงเซเชฎเชพเช‚, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชชเชฐ เชตเชฟเชตเชฟเชง เชจเชฟเชฏเช‚เชคเซเชฐเชฃเซ‹ เชฒเชพเชฆเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชธเซเชงเซ€ เชฒเซ‚เชชเซเชธ เช…เชจเซ‡ เชธเชฌเชฐเซ‚เชŸเชฟเชจ เชฒเช–เชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชจ เชนเชคเซเช‚, เช…เชจเซ‡ เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ 4096 เชธเซเชงเซ€ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชนเชคเซ€ (เชนเชตเซ‡ เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เซƒเชค เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชเช• เชฎเชฟเชฒเชฟเชฏเชจ เชธเซ‚เชšเชจเชพเช“ เชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡).

BPF เชชเชพเชธเซ‡ เช…เช—เชฟเชฏเชพเชฐ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ-เชธเซเชฒเชญ 64-เชฌเซ€เชŸ เชฐเชœเชฟเชธเซเชŸเชฐ เช›เซ‡ r0-r10 เช…เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชพเช‰เชจเซเชŸเชฐ. เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ‹ r10 เชซเซเชฐเซ‡เชฎ เชชเซ‹เช‡เชจเซเชŸเชฐ เชงเชฐเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชซเช•เซเชค เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เช›เซ‡. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฐเชจเชŸเชพเช‡เชฎ เชชเชฐ 512-เชฌเชพเช‡เชŸ เชธเซเชŸเซ‡เช• เช…เชจเซ‡ เชจเช•เชถเชพเชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เช…เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฎเชพเชคเซเชฐเชพเชฎเชพเช‚ เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒ เชฎเซ‡เชฎเชฐเซ€เชจเซ€ เชเช•เซเชธเซ‡เชธ เชงเชฐเชพเชตเซ‡ เช›เซ‡.

BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ-เชชเซเชฐเช•เชพเชฐเชจเชพ เช•เชฐเซเชจเชฒ เชนเซ‡เชฒเซเชชเชฐเชจเชพ เชšเซ‹เช•เซเช•เชธ เชธเซ‡เชŸ เช…เชจเซ‡ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚, เชจเชฟเชฏเชฎเชฟเชค เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช›เซ‡. เชฆเชฐเซ‡เช• เช•เชนเซ‡เชตเชพเชฏ เชซเช‚เช•เซเชถเชจ เชชเชพเช‚เชš เชœเซ‡เชŸเชฒเซ€ เชฆเชฒเซ€เชฒเซ‹ เชฒเชˆ เชถเช•เซ‡ เช›เซ‡, เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เชชเชธเชพเชฐ เชฅเชพเชฏ เช›เซ‡ r1-r5, เช…เชจเซ‡ เชตเชณเชคเชฐ เชฎเซ‚เชฒเซเชฏเชจเซ‡ เชชเชธเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ r0. เชคเซ‡ เช–เชพเชคเชฐเซ€ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เซ‡ เช•เชพเชฐเซเชฏเชฎเชพเช‚เชฅเซ€ เชชเชพเช›เชพ เชซเชฐเซเชฏเชพ เชชเช›เซ€, เชฐเชœเชฟเชธเซเชŸเชฐเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เช“ r6-r9 เชฌเชฆเชฒเชพเชถเซ‡ เชจเชนเซ€เช‚.

เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช…เชจเซเชตเชพเชฆ เชฎเชพเชŸเซ‡, เชจเซ‹เช‚เชงเชฃเซ€เช“ r0-r11 เชตเชฐเซเชคเชฎเชพเชจ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ€ ABI เชตเชฟเชถเซ‡เชทเชคเชพเช“เชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฐเชพเช–เซ€เชจเซ‡, เชคเชฎเชพเชฎ เชธเชชเซ‹เชฐเซเชŸเซ‡เชก เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเซเชธ เชตเชพเชธเซเชคเชตเชฟเช• เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เช…เชจเชจเซเชฏ เชฐเซ€เชคเซ‡ เชฎเซ‡เชช เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฎเชพเชŸเซ‡ x86_64 เชฐเชœเซ€เชธเซเชŸเชฐ r1-r5, เชซเช‚เช•เซเชถเชจ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชชเชธเชพเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡, เชชเชฐ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡ rdi, rsi, rdx, rcx, r8, เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชซเช‚เช•เซเชถเชจเชฎเชพเช‚ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชชเชธเชพเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡ x86_64. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชกเชพเชฌเซ€ เชฌเชพเชœเซเชจเซ‹ เช•เซ‹เชก เชœเชฎเชฃเซ€ เชฌเชพเชœเซเชจเชพ เช•เซ‹เชกเชฎเชพเช‚ เช† เชฐเซ€เชคเซ‡ เช…เชจเซเชตเชพเชฆ เช•เชฐเซ‡ เช›เซ‡:

1:  (b7) r1 = 1                    mov    $0x1,%rdi
2:  (b7) r2 = 2                    mov    $0x2,%rsi
3:  (b7) r3 = 3                    mov    $0x3,%rdx
4:  (b7) r4 = 4                    mov    $0x4,%rcx
5:  (b7) r5 = 5                    mov    $0x5,%r8
6:  (85) call pc+1                 callq  0x0000000000001ee8

เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ‹ r0 เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ เชชเชฐเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซ‡ เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เชชเชฃ เชตเชชเชฐเชพเชฏ เช›เซ‡ r1 เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เชชเชธเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ - เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เชชเซเชฐเช•เชพเชฐ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ€เชจเซ‡, เช†, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชเช• เชฎเชพเชณเช–เซเช‚ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡ struct xdp_md (XDP เชฎเชพเชŸเซ‡) เช…เชฅเชตเชพ เชฎเชพเชณเช–เซเช‚ struct __sk_buff (เชตเชฟเชตเชฟเชง เชจเซ‡เชŸเชตเชฐเซเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฎเชพเชŸเซ‡) เช…เชฅเชตเชพ เชฎเชพเชณเช–เซเช‚ struct pt_regs (เชตเชฟเชตเชฟเชง เชชเซเชฐเช•เชพเชฐเชจเชพ เชŸเซเชฐเซ‡เชธเซ€เช‚เช— เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฎเชพเชŸเซ‡), เชตเช—เซ‡เชฐเซ‡.

เชคเซ‡เชฅเซ€, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชจเช•เชถเชพเชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชฐเชœเชฟเชธเซเชŸเชฐ, เช•เชฐเซเชจเชฒ เชนเซ‡เชฒเซเชชเชฐเซเชธ, เชธเซเชŸเซ‡เช•, เชเช• เชธเช‚เชฆเชฐเซเชญ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เช…เชจเซ‡ เชถเซ‡เชฐ เช•เชฐเซ‡เชฒเซ€ เชฎเซ‡เชฎเชฐเซ€เชจเซ‹ เชธเชฎเซ‚เชน เชนเชคเซ‹. เชเชตเซเช‚ เชจเชฅเซ€ เช•เซ‡ เชธเชซเชฐเชฎเชพเช‚ เช† เชฌเชงเซเช‚ เชเช•เชฆเชฎ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡, เชชเชฃ...

เชšเชพเชฒเซ‹ เชตเชฐเซเชฃเชจ เชšเชพเชฒเซ เชฐเชพเช–เซ€เช เช…เชจเซ‡ เช† เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฎเชพเชจเซเชก เชธเชฟเชธเซเชŸเชฎ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เช. เชฌเชงเชพ (เชฒเช—เชญเช— เชฌเชงเชพ) BPF เชธเซ‚เชšเชจเชพเช“เชฎเชพเช‚ เชจเชฟเชถเซเชšเชฟเชค 64-เชฌเซ€เชŸ เช•เชฆ เชนเซ‹เชฏ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ 64-เชฌเซ€เชŸ เชฌเชฟเช— เชเชจเซเชกเชฟเชฏเชจ เชฎเชถเซ€เชจ เชชเชฐเชจเซ€ เชเช• เชธเซ‚เชšเชจเชพ เชœเซ‹เชถเซ‹ เชคเซ‹ เชคเชฎเซ‡ เชœเซ‹เชถเซ‹

เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

เชคเซ‡ Code - เช† เชธเซ‚เชšเชจเชพเชจเซเช‚ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช›เซ‡, Dst/Src เช…เชจเซเช•เซเชฐเชฎเซ‡ เชฐเซ€เชธเซ€เชตเชฐ เช…เชจเซ‡ เชธเซเชคเซเชฐเซ‹เชคเชจเชพ เชเชจเซเช•เซ‹เชกเชฟเช‚เช—เซเชธ เช›เซ‡, Off - 16-เชฌเซ€เชŸ เชธเชนเซ€ เช•เชฐเซ‡เชฒ เช‡เชจเซเชกเซ‡เชจเซเชŸเซ‡เชถเชจ, เช…เชจเซ‡ Imm เช…เชฎเซเช• เชธเซ‚เชšเชจเชพเช“เชฎเชพเช‚ เชตเชชเชฐเชพเชฏเซ‡เชฒ 32-เชฌเซ€เชŸ เชนเชธเซเชคเชพเช•เซเชทเชฐเชฟเชค เชชเซ‚เชฐเซเชฃเชพเช‚เช• เช›เซ‡ (cBPF เชธเซเชฅเชฟเชฐ K เชจเซ€ เชœเซ‡เชฎ). เชเชจเซเช•เซ‹เชกเชฟเช‚เช— Code เชฌเซ‡เชฎเชพเช‚เชฅเซ€ เชเช• เชชเซเชฐเช•เชพเชฐ เช›เซ‡:

เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

เชธเซ‚เชšเชจเชพ เชตเชฐเซเช—เซ‹ 0, 1, 2, 3 เชฎเซ‡เชฎเชฐเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชฆเซ‡เชถเซ‹ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เช“ เชจเซ‡ เชฌเซ‹เชฒเชพเชตเซเชฏเชพ เชนเชคเชพ, BPF_LD, BPF_LDX, BPF_ST, BPF_STX, เช…เชจเซเช•เซเชฐเชฎเซ‡. เชตเชฐเซเช— 4, 7 (BPF_ALU, BPF_ALU64) ALU เชธเซ‚เชšเชจเชพเช“เชจเซ‹ เชธเชฎเซ‚เชน เชฌเชจเชพเชตเซ‡ เช›เซ‡. เชตเชฐเซเช— 5, 6 (BPF_JMP, BPF_JMP32) เชœเชฎเซเชช เชธเซ‚เชšเชจเชพเช“ เชงเชฐเชพเชตเซ‡ เช›เซ‡.

BPF เชธเซ‚เชšเชจเชพ เชชเซเชฐเชฃเชพเชฒเซ€เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เช†เช—เชณเชจเซ€ เชฏเซ‹เชœเชจเชพ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡: เชฌเชงเซ€ เชธเซ‚เชšเชจเชพเช“ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‡ เช•เชพเชณเชœเซ€เชชเซ‚เชฐเซเชตเช• เชธเซ‚เชšเชฟเชฌเชฆเซเชง เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เช…เชฎเซ‡ เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช•เซ‡เชŸเชฒเชพเช• เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชœเซ‹เชˆเชถเซเช‚ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชคเซ‡ เชธเซเชชเชทเซเชŸ เชฅเชˆ เชœเชถเซ‡ เช•เซ‡ เชธเซ‚เชšเชจเชพเช“ เช–เชฐเซ‡เช–เชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ BPF เชฎเชพเชŸเซ‡ เช•เซ‹เชˆเชชเชฃ เชฌเชพเชˆเชจเชฐเซ€ เชซเชพเช‡เชฒเชจเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เชกเชฟเชธเชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ‹. เชฒเซ‡เช–เชฎเชพเช‚ เชชเช›เซ€เชฅเซ€ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‡ เชเช•เซ€เช•เซƒเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ, JIT เช•เชฎเซเชชเชพเช‡เชฒเชฐ, เช•เซเชฒเชพเชธเชฟเช• BPF เชจเชพ เช…เชจเซเชตเชพเชฆ, เชคเซ‡เชฎเชœ เชจเช•เชถเชพ, เช•เซ‰เชฒเชฟเช‚เช— เชซเช‚เช•เซเชถเชจ เชตเช—เซ‡เชฐเซ‡เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชตเชฟเชญเชพเช—เซ‹เชฎเชพเช‚ เชตเซเชฏเช•เซเชคเชฟเช—เชค เชธเซ‚เชšเชจเชพเช“ เชธเชพเชฅเซ‡ เชชเชฃ เชฎเชณเซ€เชถเซเช‚.

เชœเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เชตเซเชฏเช•เซเชคเชฟเช—เชค เชธเซ‚เชšเชจเชพเช“ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เช เช›เซ€เช, เชคเซเชฏเชพเชฐเซ‡ เช…เชฎเซ‡ เชฎเซเช–เซเชฏ เชซเชพเช‡เชฒเซ‹เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เชฒเชˆเชถเซเช‚ bpf.h ะธ bpf_common.h, เชœเซ‡ BPF เชธเซ‚เชšเชจเชพเช“เชจเชพ เชธเช‚เช–เซเชฏเชพเชคเซเชฎเช• เช•เซ‹เชกเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชคเชฎเชพเชฐเซ€ เชœเชพเชคเซ‡ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซ‹ เช›เซ‹ เช…เชจเซ‡/เช…เชฅเชตเชพ เชฆเซเชตเชฟเชธเช‚เช—เซ€เชจเซเช‚ เชชเชฆเชšเซเช›เซ‡เชฆเชจ เช•เชฐเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชœเชŸเชฟเชฒเชคเชพเชจเชพ เช•เซเชฐเชฎเชฎเชพเช‚ เชธเซ‰เชฐเซเชŸ เช•เชฐเซ‡เชฒเชพ เชจเซ€เชšเซ‡เชจเชพ เชธเซเชคเซเชฐเซ‹เชคเซ‹เชฎเชพเช‚ เชธเชฟเชฎเซ‡เชจเซเชŸเชฟเช•เซเชธ เชถเซ‹เชงเซ€ เชถเช•เซ‹ เช›เซ‹: เชฌเชฟเชจเชธเชคเซเชคเชพเชตเชพเชฐ eBPF เชธเซเชชเซ‡เช•, BPF เช…เชจเซ‡ XDP เชธเช‚เชฆเชฐเซเชญ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ, เชธเซ‚เชšเชจเชพ เชธเซ‡เชŸ, เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ/networking/filter.txt เช…เชจเซ‡, เช…เชฒเชฌเชคเซเชค, Linux เชธเซ‹เชฐเซเชธ เช•เซ‹เชกเชฎเชพเช‚ - เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ, JIT, BPF เชฆเซเชญเชพเชทเชฟเชฏเชพ.

เช‰เชฆเชพเชนเชฐเชฃ: เชคเชฎเชพเชฐเชพ เชฎเชพเชฅเชพเชฎเชพเช‚ 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 เช›เซ‡ BPF_MOV. เชคเซ‡ เช—เช‚เชคเชตเซเชฏ เชฐเชœเชฟเชธเซเชŸเชฐเชจเซ‡ เชฎเซ‚เชฒเซเชฏ เช…เชธเชพเช‡เชจ เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เชฌเซ€เชŸ เชธเซ‡เชŸ เช›เซ‡ s (เชธเซเชฐเซ‹เชค), เชชเช›เซ€ เชฎเซ‚เชฒเซเชฏ เชธเซเชฐเซ‹เชค เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚เชฅเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชœเซ‹, เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชคเซ‡ เชธเซ‡เชŸ เชจเชฅเซ€, เชคเซ‹ เชฎเซ‚เชฒเซเชฏ เชซเซ€เชฒเซเชกเชฎเชพเช‚เชฅเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ Imm. เชคเซ‡เชฅเซ€ เชชเซเชฐเชฅเชฎ เช…เชจเซ‡ เชคเซเชฐเซ€เชœเซ€ เชธเซ‚เชšเชจเชพเช“เชฎเชพเช‚ เช…เชฎเซ‡ เช“เชชเชฐเซ‡เชถเชจ เช•เชฐเซ€เช เช›เซ€เช r0 = Imm. เช†เช—เชณ, JMP เชตเชฐเซเช— 1 เช“เชชเชฐเซ‡เชถเชจ เช›เซ‡ BPF_JEQ (เชœเซ‹ เชธเชฎเชพเชจ เชนเซ‹เชฏ เชคเซ‹ เช•เซ‚เชฆเช•เซ‹). เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฌเซ€เชŸ เชฅเซ€ S เชถเซ‚เชจเซเชฏ เช›เซ‡, เชคเซ‡ เช•เซเชทเซ‡เชคเซเชฐ เชธเชพเชฅเซ‡ เชธเซเชคเซเชฐเซ‹เชค เชฐเชœเซ€เชธเซเชŸเชฐเชจเชพ เชฎเซ‚เชฒเซเชฏเชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ‡ เช›เซ‡ Imm. เชœเซ‹ เชฎเซ‚เชฒเซเชฏเซ‹ เชเช•เชฐเซ‚เชช เชฅเชพเชฏ เช›เซ‡, เชคเซ‹ เชชเช›เซ€ เชธเช‚เช•เซเชฐเชฎเชฃ เชฅเชพเชฏ เช›เซ‡ PC + Offเชœเซเชฏเชพเช‚ PC, เชนเช‚เชฎเซ‡เชถเชจเซ€ เชœเซ‡เชฎ, เช†เช—เชณเชจเซ€ เชธเซ‚เชšเชจเชพเชจเซเช‚ เชธเชฐเชจเชพเชฎเซเช‚ เชธเชฎเชพเชตเซ‡ เช›เซ‡. เช›เซ‡เชฒเซเชฒเซ‡, JMP เชตเชฐเซเช— 9 เช“เชชเชฐเซ‡เชถเชจ เช›เซ‡ BPF_EXIT. เช† เชธเซ‚เชšเชจเชพ เช•เชฐเซเชจเชฒ เชชเชฐ เชชเชพเช›เชพ เชซเชฐเชคเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชธเชฎเชพเชชเซเชค เช•เชฐเซ‡ เช›เซ‡ r0. เชšเชพเชฒเซ‹ เช†เชชเชฃเชพ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เชเช• เชจเชตเซ€ เช•เซ‰เชฒเชฎ เช‰เชฎเซ‡เชฐเซ€เช:

Op    S  Class   Dst Src Off  Imm    Disassm
MOV   0  ALU64   0   0   0    1      r0 = 1
JEQ   0  JMP     0   1   1    0      if (r1 == 0) goto pc+1
MOV   0  ALU64   0   0   0    2      r0 = 2
EXIT  0  JMP     0   0   0    0      exit

เช…เชฎเซ‡ เช†เชจเซ‡ เชตเชงเซ เช…เชจเซเช•เซ‚เชณ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ€ เชถเช•เซ€เช เช›เซ€เช:

     r0 = 1
     if (r1 == 0) goto END
     r0 = 2
END:
     exit

เชœเซ‹ เช†เชชเชฃเซ‡ เชฏเชพเชฆ เชฐเชพเช–เซ€เช เช•เซ‡ เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เชถเซเช‚ เช›เซ‡ r1 เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เช•เชฐเซเชจเชฒ เช…เชจเซ‡ เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เชธเช‚เชฆเชฐเซเชญ เชฎเชพเชŸเซ‡ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เชชเชธเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ r0 เชฎเซ‚เชฒเซเชฏ เช•เชฐเซเชจเชฒ เชชเชฐ เชชเชพเช›เซเช‚ เช†เชตเซ‡ เช›เซ‡, เชชเช›เซ€ เช†เชชเชฃเซ‡ เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช เช•เซ‡ เชœเซ‹ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เชถเซ‚เชจเซเชฏ เช›เซ‡, เชคเซ‹ เช†เชชเชฃเซ‡ 1 เชชเชฐเชค เช•เชฐเซ€เช เช›เซ€เช, เช…เชจเซ‡ เช…เชจเซเชฏเชฅเชพ - 2. เชšเชพเชฒเซ‹ เชธเซเชคเซเชฐเซ‹เชคเชจเซ‡ เชœเซ‹เชˆเชจเซ‡ เชคเชชเชพเชธ เช•เชฐเซ€เช เช•เซ‡ เช†เชชเชฃเซ‡ เชธเชพเชšเชพ เช›เซ€เช:

$ cat readelf-example.c
int foo(void *ctx)
{
        return ctx ? 2 : 1;
}

เชนเชพ, เชคเซ‡ เชเช• เช…เชฐเซเชฅเชนเซ€เชจ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชฎเชพเชคเซเชฐ เชšเชพเชฐ เชธเชฐเชณ เชธเซ‚เชšเชจเชพเช“เชฎเชพเช‚ เช…เชจเซเชตเชพเชฆ เช•เชฐเซ‡ เช›เซ‡.

เช…เชชเชตเชพเชฆ เช‰เชฆเชพเชนเชฐเชฃ: 16-เชฌเชพเชˆเชŸ เชธเซ‚เชšเชจเชพ

เช…เชฎเซ‡ เช…เช—เชพเช‰ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเซ‹ เช›เซ‡ เช•เซ‡ เช•เซ‡เชŸเชฒเซ€เช• เชธเซ‚เชšเชจเชพเช“ 64 เชฌเชฟเชŸเซเชธ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชฒเซ‡ เช›เซ‡. เช†, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชธเซ‚เชšเชจเชพเช“เชจเซ‡ เชฒเชพเช—เซ เชชเชกเซ‡ เช›เซ‡ lddw (เช•เซ‹เชก = 0x18 = BPF_LD | BPF_DW | BPF_IMM) โ€” เช•เซเชทเซ‡เชคเซเชฐเซ‹เชฎเชพเช‚เชฅเซ€ เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เชกเชฌเชฒ เชถเชฌเซเชฆ เชฒเซ‹เชก เช•เชฐเซ‹ Imm... เชนเช•เซ€เช•เชค เช เช›เซ‡ เช•เซ‡ Imm เชคเซ‡เชจเซเช‚ เช•เชฆ 32 เช›เซ‡, เช…เชจเซ‡ เชกเชฌเชฒ เชถเชฌเซเชฆ 64 เชฌเชฟเชŸเซเชธ เช›เซ‡, เชคเซ‡เชฅเซ€ เชเช• 64-เชฌเซ€เชŸ เชธเซ‚เชšเชจเชพเชฎเชพเช‚ เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ 64-เชฌเซ€เชŸ เชคเชพเชคเซเช•เชพเชฒเชฟเช• เชฎเซ‚เชฒเซเชฏ เชฒเซ‹เชก เช•เชฐเชตเซเช‚ เช•เชพเชฎ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฌเซ‡ เชธเช‚เชฒเช—เซเชจ เชธเซ‚เชšเชจเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซเชทเซ‡เชคเซเชฐเชฎเชพเช‚ 64-เชฌเซ€เชŸ เชฎเซ‚เชฒเซเชฏเชจเชพ เชฌเซ€เชœเชพ เชญเชพเช—เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡ Imm. เช‰เชฆเชพเชนเชฐเชฃ:

$ cat x64.c
long foo(void *ctx)
{
        return 0x11223344aabbccdd;
}
$ clang -target bpf -c x64.c -o x64.o -O2
$ llvm-readelf -x .text x64.o
Hex dump of section '.text':
0x00000000 18000000 ddccbbaa 00000000 44332211 ............D3".
0x00000010 95000000 00000000                   ........

เชฌเชพเชˆเชจเชฐเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชฎเชพเชคเซเชฐ เชฌเซ‡ เชธเซ‚เชšเชจเชพเช“ เช›เซ‡:

Binary                                 Disassm
18000000 ddccbbaa 00000000 44332211    r0 = Imm[0]|Imm[1]
95000000 00000000                      exit

เช…เชฎเซ‡ เชธเซ‚เชšเชจเชพเช“ เชธเชพเชฅเซ‡ เชซเชฐเซ€ เชฎเชณเซ€เชถเซเช‚ lddw, เชœเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฃ เช…เชจเซ‡ เชจเช•เชถเชพ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เช เช›เซ€เช.

เช‰เชฆเชพเชนเชฐเชฃ: เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชธเชพเชงเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ BPF เชจเซ‡ เชกเชฟเชธเชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเซเช‚

เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ BPF เชฌเชพเชˆเชจเชฐเซ€ เช•เซ‹เชกเซเชธ เชตเชพเช‚เชšเชตเชพเชจเซเช‚ เชถเซ€เช–เซเชฏเชพ เช›เซ€เช เช…เชจเซ‡ เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹ เช•เซ‹เชˆเชชเชฃ เชธเซ‚เชšเชจเชพเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เช›เซ€เช. เชœเซ‹ เช•เซ‡, เชคเซ‡ เช•เชนเซ‡เชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชธเชพเชงเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‡ เชกเชฟเชธเชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเซเช‚ เชตเชงเซ เช…เชจเซเช•เซ‚เชณ เช…เชจเซ‡ เชเชกเชชเซ€ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡:

$ llvm-objdump -d x64.o

Disassembly of section .text:

0000000000000000 <foo>:
 0: 18 00 00 00 dd cc bb aa 00 00 00 00 44 33 22 11 r0 = 1234605617868164317 ll
 2: 95 00 00 00 00 00 00 00 exit

BPF เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธเชจเซเช‚ เชœเซ€เชตเชจเชšเช•เซเชฐ, bpffs เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎ

(เช† เชชเซ‡เชŸเชพเชตเชฟเชญเชพเช—เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เช•เซ‡เชŸเชฒเซ€เช• เชตเชฟเช—เชคเซ‹ เชฎเซ‡เช‚ เชธเซŒเชชเซเชฐเชฅเชฎ เชถเซ€เช–เซ€ เชชเซ‹เชธเซเชŸ เชเชฒเซ‡เช•เซเชธเซ€ เชธเซเชŸเชพเชฐเซ‹เชตเซ‹เช‡เชŸเซ‹เชต เชฎเชพเช‚ BPF เชฌเซเชฒเซ‹เช—.)

BPF เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ - เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช…เชจเซ‡ เชจเช•เชถเชพ - เช†เชฆเซ‡เชถเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชœเช—เซเชฏเชพเชฎเชพเช‚เชฅเซ€ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ BPF_PROG_LOAD ะธ BPF_MAP_CREATE เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ bpf(2), เช…เชฎเซ‡ เช†เช—เชณเชจเชพ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช† เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถเซเช‚. เช† เช•เชฐเซเชจเชฒ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชฆเชฐเซ‡เช• เชฎเชพเชŸเซ‡ refcount (เชธเช‚เชฆเชฐเซเชญ เช—เชฃเชคเชฐเซ€) เชเช• เชชเชฐ เชธเซ‡เชŸ เช›เซ‡, เช…เชจเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซ‡เชถ เช•เชฐเชคเซ€ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชนเซ‡เชจเซเชกเชฒ เชฌเช‚เชง เชฅเชฏเชพ เชชเช›เซ€ refcount เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชเช• เชฆเซเชตเชพเชฐเชพ เช˜เชŸเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชถเซ‚เชจเซเชฏ เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชจเชพเชถ เชชเชพเชฎเซ‡ เช›เซ‡.

เชœเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชจเช•เชถเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชคเซ‹ เชชเช›เซ€ refcount เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชก เช•เชฐเซเชฏเชพ เชชเช›เซ€ เช† เชจเช•เชถเชพเชฎเชพเช‚ เชเช•เชฅเซ€ เชเช• เชตเชงเชพเชฐเซ‹ เชฅเชพเชฏ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡. เชคเซ‡เชฎเชจเชพ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพเช“เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚เชฅเซ€ เช…เชจเซ‡ เชนเชœเซ เชชเชฃ เชฌเช‚เชง เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ refcount เชถเซ‚เชจเซเชฏ เชฌเชจเชถเซ‡ เชจเชนเซ€เช‚:

เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชฒเซ‹เชก เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชคเซ‡เชจเซ‡ เช…เชฎเซเช• เชชเซเชฐเช•เชพเชฐเชจเชพ เช‡เชตเซ‡เชจเซเชŸ เชœเชจเชฐเซ‡เชŸเชฐ เชธเชพเชฅเซ‡ เชœเซ‹เชกเซ€เช เช›เซ€เช. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชฎเซ‡ เช‡เชจเช•เชฎเชฟเช‚เช— เชชเซ‡เช•เซ‡เชŸเซ‹ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เช…เชฅเชตเชพ เชคเซ‡เชจเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เชฎเซ‚เช•เซ€ เชถเช•เซ€เช เช›เซ€เช tracepoint เช•เซ‹เชฐ เชฎเชพเช‚. เช† เชฌเชฟเช‚เชฆเซเช, เชธเช‚เชฆเชฐเซเชญ เช•เชพเช‰เชจเซเชŸเชฐ เชชเชฃ เชเช•เชฅเซ€ เชตเชงเชถเซ‡ เช…เชจเซ‡ เช…เชฎเซ‡ เชฒเซ‹เชกเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพเชจเซ‡ เชฌเช‚เชง เช•เชฐเซ€ เชถเช•เซ€เชถเซเช‚.

เชœเซ‹ เช†เชชเชฃเซ‡ เชนเชตเซ‡ เชฌเซเชŸเชฒเซ‹เชกเชฐ เชฌเช‚เชง เช•เชฐเซ€เช เชคเซ‹ เชถเซเช‚ เชฅเชถเซ‡? เชคเซ‡ เช‡เชตเซ‡เชจเซเชŸ เชœเชจเชฐเซ‡เชŸเชฐ (เชนเซ‚เช•) เชจเชพ เชชเซเชฐเช•เชพเชฐ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เชฒเซ‹เชกเชฐ เชชเซ‚เชฐเซเชฃ เชฅเชฏเชพ เชชเช›เซ€ เชฌเชงเชพ เชจเซ‡เชŸเชตเชฐเซเช• เชนเซเช•เซเชธ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชฐเชนเซ‡เชถเซ‡, เช† เช•เชนเซ‡เชตเชพเชคเชพ เชตเซˆเชถเซเชตเชฟเช• เชนเซเช•เซเชธ เช›เซ‡. เช…เชจเซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชŸเซเชฐเซ‡เชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชœเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชคเซ‡เชฎเชจเซ‡ เชฌเชจเชพเชตเซ‡เชฒ เช›เซ‡ เชคเซ‡ เชธเชฎเชพเชชเซเชค เชฅเชฏเชพ เชชเช›เซ€ เชฐเชฟเชฒเซ€เช เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ (เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชคเซ‡เชจเซ‡ "เชธเซเชฅเชพเชจเชฟเช• เชฅเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ" เชธเซเชงเซ€ เชธเซเชฅเชพเชจเชฟเช• เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡). เชŸเซ‡เช•เซเชจเชฟเช•เชฒ เชฐเซ€เชคเซ‡, เชธเซเชฅเชพเชจเชฟเช• เชนเซเช•เซเชธเชฎเชพเช‚ เชนเช‚เชฎเซ‡เชถเชพ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธเชฎเชพเช‚ เช…เชจเซเชฐเซ‚เชช เชซเชพเช‡เชฒ เชกเชฟเชธเซเช•เซเชฐเชฟเชชเซเชŸเชฐ เชนเซ‹เชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชœเซเชฏเชพเชฐเซ‡ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฌเช‚เชง เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชฌเช‚เชง เชฅเชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชตเซˆเชถเซเชตเชฟเช• เชนเซเช•เซเชธ เชเชตเซเช‚ เชจเชฅเซ€ เช•เชฐเชคเชพ. เชจเซ€เชšเซ‡เชจเซ€ เช†เช•เซƒเชคเชฟเชฎเชพเช‚, เชฐเซ‡เชก เช•เซเชฐเซ‹เชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชนเซเช‚ เชฌเชคเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซเช‚ เช›เซเช‚ เช•เซ‡ เชฒเซ‹เชกเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ€ เชธเชฎเชพเชชเซเชคเชฟ เชธเซเชฅเชพเชจเชฟเช• เช…เชจเซ‡ เชตเซˆเชถเซเชตเชฟเช• เชนเซเช•เซเชธเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเชพ เชœเซ€เชตเชจเช•เชพเชณเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช…เชธเชฐ เช•เชฐเซ‡ เช›เซ‡.

เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

เชธเซเชฅเชพเชจเชฟเช• เช…เชจเซ‡ เชตเซˆเชถเซเชตเชฟเช• เชนเซ‚เช• เชตเชšเซเชšเซ‡ เชถเชพ เชฎเชพเชŸเซ‡ เชคเชซเชพเชตเชค เช›เซ‡? เช…เชฎเซเช• เชชเซเชฐเช•เชพเชฐเชจเชพ เชจเซ‡เชŸเชตเชฐเซเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชšเชฒเชพเชตเชตเซเช‚ เช เชฏเซเชเชฐเชธเซเชชเซ‡เชธ เชตเชฟเชจเชพ เช…เชฐเซเชฅเชชเซ‚เชฐเซเชฃ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, DDoS เชธเซเชฐเช•เซเชทเชพเชจเซ€ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹ - เชฌเซเชŸเชฒเซ‹เชกเชฐ เชจเชฟเชฏเชฎเซ‹ เชฒเช–เซ‡ เช›เซ‡ เช…เชจเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชธเชพเชฅเซ‡ เชœเซ‹เชกเซ‡ เช›เซ‡, เชœเซ‡ เชชเช›เซ€ เชฌเซเชŸเชฒเซ‹เชกเชฐ เชœเชˆเชจเซ‡ เชชเซ‹เชคเชพเชจเซ€ เชœเชพเชคเชจเซ‡ เชฎเชพเชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชฌเซ€เชœเซ€ เชคเชฐเชซ, เชคเชฎเซ‡ เชฆเชธ เชฎเชฟเชจเชฟเชŸเชฎเชพเช‚ เชคเชฎเชพเชฐเชพ เช˜เซ‚เช‚เชŸเชฃ เชชเชฐ เชฒเช–เซ‡เชฒเชพ เชกเชฟเชฌเช—เซ€เช‚เช— เชŸเซเชฐเซ‡เชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ€ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹ - เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชชเซ‚เชฐเซเชฃ เชฅเชˆ เชœเชพเชฏ, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชˆเชšเซเช›เซ‹ เช›เซ‹ เช•เซ‡ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เช•เซ‹เชˆ เช•เชšเชฐเซ‹ เชฌเชพเช•เซ€ เชจ เชฐเชนเซ‡ เช…เชจเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชนเซเช•เซเชธ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชถเซ‡.

เชฌเซ€เชœเซ€ เชฌเชพเชœเซ, เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹ เช•เซ‡ เชคเชฎเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชŸเซเชฐเซ‡เชธเชชเซ‹เช‡เชจเซเชŸ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹ เช…เชจเซ‡ เช˜เชฃเชพ เชตเชฐเซเชทเซ‹เชฅเซ€ เช†เช‚เช•เชกเชพ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชคเชฎเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพ เชญเชพเช—เชจเซ‡ เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพ เช…เชจเซ‡ เชธเชฎเชฏเชพเช‚เชคเชฐเซ‡ เช†เช‚เช•เชกเชพ เชชเชฐ เชชเชพเช›เชพ เชซเชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹. bpf เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎ เช† เชคเช• เชชเซ‚เชฐเซ€ เชชเชพเชกเซ‡ เช›เซ‡. เชคเซ‡ เชเช• เช‡เชจ-เชฎเซ‡เชฎเชฐเซ€-เช“เชจเซเชฒเซ€ เชธเซเชฏเซเชกเซ‹-เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎ เช›เซ‡ เชœเซ‡ BPF เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธเชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เช†เชชเชคเซ€ เชซเชพเช‡เชฒเซ‹ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเชพ เช•เชพเชฐเชฃเซ‡ เชตเชงเชพเชฐเซ‹ เชฅเชพเชฏ เช›เซ‡. refcount เชตเชธเซเชคเซเช“ เช† เชชเช›เซ€, เชฒเซ‹เชกเชฐ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ€ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡เชฃเซ‡ เชฌเชจเชพเชตเซ‡เชฒเซ€ เชตเชธเซเชคเซเช“ เชœเซ€เชตเช‚เชค เชฐเชนเซ‡เชถเซ‡.

เชจเชพเชจเชพ เชฌเชพเชณเช•เซ‹ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชเช•: เชตเชฟเชธเซเชคเซƒเชค BPF

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. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เชœเซ‚เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเชจเชพ เชคเชฎเชพเชฎ เชธเช•เซเชฐเชฟเชฏ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชคเซ‡เชฎเชจเซเช‚ เช•เชพเชฐเซเชฏ เชชเซ‚เชฐเซเชฃ เช•เชฐเชถเซ‡, เช…เชจเซ‡ เชจเชตเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚เชฅเซ€ เชจเชตเชพ เช‡เชตเซ‡เชจเซเชŸ เชนเซ‡เชจเซเชกเชฒเชฐเซเชธ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เช…เชจเซ‡ เช…เชนเซ€เช‚ "เชเชŸเซ‰เชฎเชฟเชธเชฟเชŸเซ€" เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ เชเช• เชชเชฃ เช‡เชตเซ‡เชจเซเชŸ เชšเซ‚เช•เซ€ เชœเชถเซ‡ เชจเชนเซ€เช‚.

เช‡เชตเซ‡เชจเซเชŸ เชธเซเชคเซเชฐเซ‹เชคเซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹ เชœเซ‹เชกเชตเซเช‚

เช† เชฒเซ‡เช–เชฎเชพเช‚, เช…เชฎเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เช‡เชตเซ‡เชจเซเชŸ เชธเซเชคเซเชฐเซ‹เชคเซ‹ เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพเชจเซเช‚ เช…เชฒเช—เชฅเซ€ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เชถเซเช‚ เชจเชนเซ€เช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชšเซ‹เช•เซเช•เชธ เชชเซเชฐเช•เชพเชฐเชจเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ เช†เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเซ‹ เช…เชฐเซเชฅเชชเซ‚เชฐเซเชฃ เช›เซ‡. เชธเซ‡เชฎเซ€. เช‰เชฆเชพเชนเชฐเชฃ เชจเซ€เชšเซ‡, เชœเซ‡เชฎเชพเช‚ เช…เชฎเซ‡ XDP เชœเซ‡เชตเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒเชพ เช›เซ‡ เชคเซ‡ เชฌเชคเชพเชตเซ€เช เช›เซ€เช.

bpf เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธเชจเซ€ เชนเซ‡เชฐเชซเซ‡เชฐ เช•เชฐเชตเซ€

BPF เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹

เชฌเชงเชพ BPF เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชœเช—เซเชฏเชพเชฎเชพเช‚เชฅเซ€ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เชธเช‚เชšเชพเชฒเชฟเชค เชฅเชพเชฏ เช›เซ‡ bpf, เชจเซ€เชšเซ‡เชจเชพ เชชเซเชฐเซ‹เชŸเซ‹เชŸเชพเช‡เชช เชงเชฐเชพเชตเซ‡ เช›เซ‡:

#include <linux/bpf.h>

int bpf(int cmd, union bpf_attr *attr, unsigned int size);

เช† เชฐเชนเซ€ เชŸเซ€เชฎ cmd เชชเซเชฐเช•เชพเชฐเชจเชพ เชฎเซ‚เชฒเซเชฏเซ‹เชฎเชพเช‚เชจเซเช‚ เชเช• เช›เซ‡ enum bpf_cmd, attr โ€” เชšเซ‹เช•เซเช•เชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฎเชพเชŸเซ‡ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชฎเชพเชŸเซ‡ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เช…เชจเซ‡ size - เชชเซ‹เช‡เชจเซเชŸเชฐ เช…เชจเซเชธเชพเชฐ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซเช‚ เช•เชฆ, เชเชŸเชฒเซ‡ เช•เซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช† sizeof(*attr). เช•เชฐเซเชจเชฒ 5.8 เชฎเชพเช‚ เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฒ bpf 34 เชตเชฟเชตเชฟเชง เช†เชฆเซ‡เชถเซ‹เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพ union bpf_attr 200 เชฐเซ‡เช–เชพเช“ เชฐเซ‹เช•เซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เช†เชชเชฃเซ‡ เช†เชจเชพเชฅเซ€ เชกเชฐเชตเซเช‚ เชœเซ‹เชˆเช เชจเชนเซ€เช‚, เช•เชพเชฐเชฃ เช•เซ‡ เช†เชชเชฃเซ‡ เช˜เชฃเชพ เชฒเซ‡เช–เซ‹ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช†เชฆเซ‡เชถเซ‹ เช…เชจเซ‡ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชฅเซ€ เชชเซ‹เชคเชพเชจเซ‡ เชชเชฐเชฟเชšเชฟเชค เช•เชฐเซ€เชถเซเช‚.

เชšเชพเชฒเซ‹ เชŸเซ€เชฎ เชธเชพเชฅเซ‡ เชถเชฐเซ‚เช†เชค เช•เชฐเซ€เช BPF_PROG_LOAD, เชœเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฌเชจเชพเชตเซ‡ เช›เซ‡ - BPF เชธเซ‚เชšเชจเชพเช“เชจเซ‹ เชธเชฎเซ‚เชน เชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡. เชฒเซ‹เชกเชฟเช‚เช—เชจเซ€ เช•เซเชทเชฃเซ‡, เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชฒเซ‹เช‚เชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชชเช›เซ€ JIT เช•เชฎเซเชชเชพเช‡เชฒเชฐ เช…เชจเซ‡, เชธเชซเชณ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชชเช›เซ€, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช…เชฎเซ‡ เช…เช—เชพเช‰เชจเชพ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช†เช—เชณ เชถเซเช‚ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เชœเซ‹เชฏเซเช‚ BPF เชตเชธเซเชคเซเช“เชจเชพ เชœเซ€เชตเชจ เชšเช•เซเชฐ เชตเชฟเชถเซ‡.

เชนเชตเซ‡ เช†เชชเชฃเซ‡ เชเช• เช•เชธเซเชŸเชฎ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เซ€เชถเซเช‚ เชœเซ‡ เชเช• เชธเชพเชฆเซ‹ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชก เช•เชฐเชถเซ‡, เชชเชฐเช‚เชคเซ เชชเชนเซ‡เชฒเชพ เช†เชชเชฃเซ‡ เชจเช•เซเช•เซ€ เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡ เช•เซ‡ เช†เชชเชฃเซ‡ เช•เชฏเชพ เชชเซเชฐเช•เชพเชฐเชจเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช - เช†เชชเชฃเซ‡ เชชเชธเช‚เชฆ เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡. เชชเซเชฐเช•เชพเชฐ เช…เชจเซ‡ เช† เชชเซเชฐเช•เชพเชฐเชจเชพ เชฎเชพเชณเช–เชพเชฎเชพเช‚, เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เซ‹ เชœเซ‡ เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชŸเซ‡เชธเซเชŸ เชชเชพเชธ เช•เชฐเชถเซ‡. เชœเซ‹ เช•เซ‡, เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชœเชŸเชฟเชฒ เชจ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เช…เชนเซ€เช‚ เชเช• เชคเซˆเชฏเชพเชฐ เช‰เช•เซ‡เชฒ เช›เซ‡: เช…เชฎเซ‡ เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเชˆเชถเซเช‚ BPF_PROG_TYPE_XDP, เชœเซ‡ เชฎเซ‚เชฒเซเชฏ เชชเชฐเชค เช•เชฐเชถเซ‡ XDP_PASS (เชฌเชงเชพ เชชเซ‡เช•เซ‡เชœเซ‹ เช›เซ‹เชกเซ‹). BPF เชเชธเซ‡เชฎเซเชฌเชฒเชฐเชฎเชพเช‚ เชคเซ‡ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เชฒเชพเช—เซ‡ เช›เซ‡:

r0 = 2
exit

เช…เชฎเซ‡ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเชพ เชชเช›เซ€ เช•เซ‡ เช…เชฎเซ‡ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€เชถเซเช‚, เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เช•เชนเซ€ เชถเช•เซ€เช เช•เซ‡ เช…เชฎเซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซ€เชถเซเช‚:

#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/bpf.h>

static inline __u64 ptr_to_u64(const void *ptr)
{
        return (__u64) (unsigned long) ptr;
}

int main(void)
{
    struct bpf_insn insns[] = {
        {
            .code = BPF_ALU64 | BPF_MOV | BPF_K,
            .dst_reg = BPF_REG_0,
            .imm = XDP_PASS
        },
        {
            .code = BPF_JMP | BPF_EXIT
        },
    };

    union bpf_attr attr = {
        .prog_type = BPF_PROG_TYPE_XDP,
        .insns     = ptr_to_u64(insns),
        .insn_cnt  = sizeof(insns)/sizeof(insns[0]),
        .license   = ptr_to_u64("GPL"),
    };

    strncpy(attr.prog_name, "woo", sizeof(attr.prog_name));
    syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));

    for ( ;; )
        pause();
}

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชฐเชธเชชเซเชฐเชฆ เช˜เชŸเชจเชพเช“ เชเชฐเซ‡เชจเซ€ เชตเซเชฏเชพเช–เซเชฏเชพ เชธเชพเชฅเซ‡ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡ insns - เชฎเชถเซ€เชจ เช•เซ‹เชกเชฎเชพเช‚ เช…เชฎเชพเชฐเซ‹ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ€ เชฆเชฐเซ‡เช• เชธเซ‚เชšเชจเชพ เชฎเชพเชณเช–เชพเชฎเชพเช‚ เชชเซ‡เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ bpf_insn. เชชเซเชฐเชฅเชฎ เชคเชคเซเชต insns เชธเซ‚เชšเชจเชพเช“เชจเซเช‚ เชชเชพเชฒเชจ เช•เชฐเซ‡ เช›เซ‡ r0 = 2, เชฌเซ€เชœเซ€ - exit.

เชชเซ€เช›เซ‡เชนเช . เช•เชฐเซเชจเชฒ เชฎเชถเซ€เชจ เช•เซ‹เชก เชฒเช–เชตเชพ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชนเซ‡เชกเชฐ เชซเชพเช‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชงเซ เช…เชจเซเช•เซ‚เชณ เชฎเซ‡เช•เซเชฐเซ‹เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡ เช›เซ‡ tools/include/linux/filter.h เช…เชฎเซ‡ เชฒเช–เซ€ เชถเช•เซเชฏเชพ

struct bpf_insn insns[] = {
    BPF_MOV64_IMM(BPF_REG_0, XDP_PASS),
    BPF_EXIT_INSN()
};

เชชเชฐเช‚เชคเซ เชฎเซ‚เชณ เช•เซ‹เชกเชฎเชพเช‚ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฒเช–เชตเชพ เช เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เช…เชจเซ‡ BPF เชตเชฟเชถเซ‡เชจเชพ เชฒเซ‡เช–เซ‹ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชœ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชตเชพเชฅเซ€, เช† เชฎเซ‡เช•เซเชฐเซ‹เชจเซ€ เช—เซ‡เชฐเชนเชพเชœเชฐเซ€ เช–เชฐเซ‡เช–เชฐ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเชจเชพ เชœเซ€เชตเชจเชจเซ‡ เชœเชŸเชฟเชฒ เชฌเชจเชพเชตเชคเซ€ เชจเชฅเซ€.

BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เช—เชณ เชตเชงเซ€เช เช›เซ€เช. เช…เชฎเชพเชฐเชพ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‹ เชจเซเชฏเซ‚เชจเชคเชฎ เชธเชฎเซ‚เชน attr เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เชชเซเชฐเช•เชพเชฐ, เชธเซ‡เชŸ เช…เชจเซ‡ เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ, เชœเชฐเซ‚เชฐเซ€ เชฒเชพเช‡เชธเชจเซเชธ เช…เชจเซ‡ เชจเชพเชฎเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ "woo", เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชฎเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ€เช เช›เซ€เช. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ, เชตเชšเชจ เชฎเซเชœเชฌ, เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡ bpf.

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเชพ เช…เช‚เชคเซ‡ เช†เชชเชฃเซ‡ เช…เชจเช‚เชค เชฒเซ‚เชชเชฎเชพเช‚ เช†เชตเซ€เช เช›เซ€เช เชœเซ‡ เชชเซ‡เชฒเซ‹เชกเชจเซเช‚ เช…เชจเซเช•เชฐเชฃ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เชจเชพ เชตเชฟเชจเชพ, เชœเซเชฏเชพเชฐเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เช…เชฎเชจเซ‡ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชฌเช‚เชง เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เช•เชฐเซเชจเชฒ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชฎเชพเชฐเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. bpf, เช…เชจเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชœเซ‹เชˆเชถเซเช‚ เชจเชนเซ€เช‚.

เชธเชพเชฐเซเช‚, เช…เชฎเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เช›เซ€เช. เชšเชพเชฒเซ‹ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ€เช เช…เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชนเซ‡เช เชณ เชšเชฒเชพเชตเซ€เช straceเชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡ เชฌเชงเซเช‚ เชœเซ‹เชˆเช เชคเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡:

$ clang -g -O2 simple-prog.c -o simple-prog

$ sudo strace ./simple-prog
execve("./simple-prog", ["./simple-prog"], 0x7ffc7b553480 /* 13 vars */) = 0
...
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0x7ffe03c4ed50, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_V
ERSION(0, 0, 0), prog_flags=0, prog_name="woo", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS}, 72) = 3
pause(

เชฌเชงเซเช‚ เชฌเชฐเชพเชฌเชฐ เช›เซ‡, bpf(2) เช…เชฎเชจเซ‡ เชนเซ‡เชจเซเชกเชฒ 3 เชชเชฐเชค เช•เชฐเซเชฏเซเช‚ เช…เชจเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช…เชจเช‚เชค เชฒเซ‚เชชเชฎเชพเช‚ เช—เชฏเชพ pause(). เชšเชพเชฒเซ‹ เช†เชชเชฃเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชถเซ‹เชงเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เชฌเซ€เชœเชพ เชŸเชฐเซเชฎเชฟเชจเชฒ เชชเชฐ เชœเชˆเชถเซเช‚ เช…เชจเซ‡ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚ bpftool:

# bpftool prog | grep -A3 woo
390: xdp  name woo  tag 3b185187f1855c4c  gpl
        loaded_at 2020-08-31T24:66:44+0000  uid 0
        xlated 16B  jited 40B  memlock 4096B
        pids simple-prog(10381)

เช†เชชเชฃเซ‡ เชœเซ‹เชˆเช เช›เซ€เช เช•เซ‡ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เชฒเซ‹เชก เชฅเชฏเซ‡เชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช›เซ‡ woo เชœเซ‡เชจเซ€ เชตเซˆเชถเซเชตเชฟเช• ID 390 เช›เซ‡ เช…เชจเซ‡ เชนเชพเชฒเชฎเชพเช‚ เชคเซ‡ เชšเชพเชฒเซ เช›เซ‡ simple-prog เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ (เช…เชจเซ‡ เชœเซ‹ simple-prog เชชเช›เซ€ เช•เชพเชฎ เชชเซ‚เชฐเซเช‚ เช•เชฐเชถเซ‡ woo เช…เชฆเซƒเชถเซเชฏ เชฅเชˆ เชœเชถเซ‡). เช…เชชเซ‡เช•เซเชทเชพ เชฎเซเชœเชฌ, เช•เชพเชฐเซเชฏเช•เซเชฐเชฎ woo BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚ เชฆเซเชตเชฟเชธเช‚เช—เซ€ เช•เซ‹เชกเชจเชพ - เชฌเซ‡ เชธเซ‚เชšเชจเชพเช“ - 16 เชฌเชพเช‡เชŸเซเชธ เชฒเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเชพ เชฎเซ‚เชณ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ (x86_64) เชคเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ 40 เชฌเชพเช‡เชŸเซเชธ เช›เซ‡. เชšเชพเชฒเซ‹ เช†เชชเชฃเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชคเซ‡เชจเชพ เชฎเซ‚เชณ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชœเซ‹เชˆเช:

# bpftool prog dump xlated id 390
   0: (b7) r0 = 2
   1: (95) exit

เช•เซ‹เชˆ เช†เชถเซเชšเชฐเซเชฏ เชจเชฅเซ€. เชนเชตเซ‡ เชšเชพเชฒเซ‹ JIT เช•เชฎเซเชชเชพเชˆเชฒเชฐ เชฆเซเชตเชพเชฐเชพ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชพเชฏเซ‡เชฒ เช•เซ‹เชก เชœเซ‹เชˆเช:

# bpftool prog dump jited id 390
bpf_prog_3b185187f1855c4c_woo:
   0:   nopl   0x0(%rax,%rax,1)
   5:   push   %rbp
   6:   mov    %rsp,%rbp
   9:   sub    $0x0,%rsp
  10:   push   %rbx
  11:   push   %r13
  13:   push   %r14
  15:   push   %r15
  17:   pushq  $0x0
  19:   mov    $0x2,%eax
  1e:   pop    %rbx
  1f:   pop    %r15
  21:   pop    %r14
  23:   pop    %r13
  25:   pop    %rbx
  26:   leaveq
  27:   retq

เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เช…เชธเชฐเช•เชพเชฐเช• เชจเชฅเซ€ exit(2), เชชเชฐเช‚เชคเซ เชตเชพเชœเชฌเซ€เชคเชพเชฎเชพเช‚, เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เช›เซ‡, เช…เชจเซ‡ เชฌเชฟเชจ-เชคเซเชšเซเช› เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹ เชฎเชพเชŸเซ‡ JIT เช•เชฎเซเชชเชพเช‡เชฒเชฐ เชฆเซเชตเชพเชฐเชพ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เชชเซเชฐเชธเซเชคเชพเชตเชจเชพ เช…เชจเซ‡ เช‰เชชเชธเช‚เชนเชพเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชจเช•เชถเชพ

BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชก เชฎเซ‡เชฎเชฐเซ€ เชเชฐเชฟเชฏเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เชœเซ‡ เช…เชจเซเชฏ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช…เชจเซ‡ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธเชฎเชพเช‚ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฌเช‚เชจเซ‡ เชฎเชพเชŸเซ‡ เชธเซเชฒเชญ เช›เซ‡. เช† เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธเชจเซ‡ เชจเช•เชถเชพ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช…เชฎเซ‡ เชฌเชคเชพเชตเซ€เชถเซเช‚ เช•เซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชšเชพเชฒเชพเช•เซ€ เช•เชฐเชตเซ€ bpf.

เชšเชพเชฒเซ‹ เชคเชฐเชค เชœ เช•เชนเซ€เช เช•เซ‡ เชจเช•เชถเชพเชจเซ€ เช•เซเชทเชฎเชคเชพเช“ เชซเช•เซเชค เชถเซ‡เชฐ เช•เชฐเซ‡เชฒเซ€ เชฎเซ‡เชฎเชฐเซ€ เชธเซเชงเซ€ เชœ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชจเชฅเซ€. เชคเซเชฏเชพเช‚ เชตเชฟเชถเชฟเชทเซเชŸ เชนเซ‡เชคเซเชตเชพเชณเชพ เชจเช•เชถเชพ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช…เชฅเชตเชพ เชจเซ‡เชŸเชตเชฐเซเช• เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชฎเชพเชŸเซ‡เชจเชพ เชจเชฟเชฐเซเชฆเซ‡เชถเช•เซ‹, เชชเชฐเซเชซ เช‡เชตเซ‡เชจเซเชŸเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชจเช•เชถเชพ เชตเช—เซ‡เชฐเซ‡. เช…เชฎเซ‡ เช…เชนเซ€เช‚ เชคเซ‡เชฎเชจเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถเซเช‚ เชจเชนเซ€เช‚, เชœเซ‡เชฅเซ€ เชตเชพเชšเช•เชจเซ‡ เชฎเซ‚เช‚เชเชตเชฃเชฎเชพเช‚ เชจ เช†เชตเซ‡. เช† เชธเชฟเชตเชพเชฏ, เช…เชฎเซ‡ เชธเชฟเช‚เช•เซเชฐเซ‹เชจเชพเช‡เชเซ‡เชถเชจ เชฎเซเชฆเซเชฆเชพเช“เชจเซ‡ เช…เชตเช—เชฃเซ€เช เช›เซ€เช, เช•เชพเชฐเชฃ เช•เซ‡ เช† เช…เชฎเชพเชฐเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชฎเชพเชŸเซ‡ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชจเชฅเซ€. เช‰เชชเชฒเชฌเซเชง เชจเช•เชถเชพ เชชเซเชฐเช•เชพเชฐเซ‹เชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซ‚เชšเชฟ เช†เชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ <linux/bpf.h>, เช…เชจเซ‡ เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช†เชชเชฃเซ‡ เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชเชคเชฟเชนเชพเชธเชฟเช• เชฐเซ€เชคเซ‡ เชชเซเชฐเชฅเชฎ เชชเซเชฐเช•เชพเชฐ, เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชฒเชˆเชถเซเช‚ BPF_MAP_TYPE_HASH.

เชœเซ‹ เชคเชฎเซ‡ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเซ‹ เช›เซ‹, เชคเซ‹ เช•เชนเซ‹, C++, เชคเชฎเซ‡ เช•เชนเซ‡เชถเซ‹ unordered_map<int,long> woo, เชœเซ‡เชจเซ‹ เชฐเชถเชฟเชฏเชจ เช…เชฐเซเชฅ เชฅเชพเชฏ เช›เซ‡ โ€œเชฎเชจเซ‡ เชŸเซ‡เชฌเชฒเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ woo เช…เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชฆ, เชœเซ‡เชจเซ€ เชšเชพเชตเซ€เช“ เชชเซเชฐเช•เชพเชฐเชจเซ€ เช›เซ‡ int, เช…เชจเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹ เชชเซเชฐเช•เชพเชฐ เช›เซ‡ long" BPF เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เช†เชชเชฃเซ‡ เช˜เชฃเซเช‚ เชฌเชงเซเช‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชธเชฟเชตเชพเชฏ เช•เซ‡ เช†เชชเชฃเซ‡ เช•เซ‹เชทเซเชŸเช•เชจเซเช‚ เชฎเชนเชคเซเชคเชฎ เช•เชฆ เชธเซเชชเชทเซเชŸ เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡, เช…เชจเซ‡ เช•เซ€เชจเชพ เชชเซเชฐเช•เชพเชฐเซ‹ เช…เชจเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เช†เชชเชฃเซ‡ เชคเซ‡เชฎเชจเชพ เช•เชฆเชจเซ‡ เชฌเชพเชˆเชŸเชฎเชพเช‚ เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. . เชจเช•เชถเชพ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ BPF_MAP_CREATE เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ bpf. เชšเชพเชฒเซ‹ เชตเชงเซ เช•เซ‡ เช“เช›เชพ เชจเซเชฏเซ‚เชจเชคเชฎ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชœเซ‹เชˆเช เชœเซ‡ เชจเช•เชถเซ‹ เชฌเชจเชพเชตเซ‡ เช›เซ‡. เชฌเซ€เชชเซ€เชเชซ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชก เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพเชจเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเช›เซ€, เช† เชคเชฎเชจเซ‡ เชธเชฐเชณ เชฒเชพเช—เชตเซเช‚ เชœเซ‹เชˆเช:

$ cat simple-map.c
#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/bpf.h>

int main(void)
{
    union bpf_attr attr = {
        .map_type = BPF_MAP_TYPE_HASH,
        .key_size = sizeof(int),
        .value_size = sizeof(int),
        .max_entries = 4,
    };
    strncpy(attr.map_name, "woo", sizeof(attr.map_name));
    syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));

    for ( ;; )
        pause();
}

เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‹ เชธเชฎเซ‚เชน เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ€เช เช›เซ€เช attr, เชœเซ‡เชฎเชพเช‚ เช†เชชเชฃเซ‡ เช•เชนเซ€เช เช›เซ€เช เช•เซ‡ "เชฎเชจเซ‡ เช•เซ€ เช…เชจเซ‡ เช•เชฆเชจเชพ เชฎเซ‚เชฒเซเชฏเซ‹ เชธเชพเชฅเซ‡ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ sizeof(int), เชœเซ‡เชฎเชพเช‚ เชนเซเช‚ เชตเชงเซเชฎเชพเช‚ เชตเชงเซ เชšเชพเชฐ เชคเชคเซเชตเซ‹ เชฎเซ‚เช•เซ€ เชถเช•เซเช‚ เช›เซเช‚." BPF เชจเช•เชถเชพ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡, เชคเชฎเซ‡ เช…เชจเซเชฏ เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเชพเชฅเซ‡เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ€ เชœเซ‡เชฎ, เช…เชฎเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซเช‚ เชจเชพเชฎ เช† เชฐเซ€เชคเซ‡ เชธเซเชชเชทเซเชŸ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ "woo".

เชšเชพเชฒเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชฎเซเชชเชพเชˆเชฒ เช…เชจเซ‡ เชฐเชจ เช•เชฐเซ€เช:

$ clang -g -O2 simple-map.c -o simple-map
$ sudo strace ./simple-map
execve("./simple-map", ["./simple-map"], 0x7ffd40a27070 /* 14 vars */) = 0
...
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH, key_size=4, value_size=4, max_entries=4, map_name="woo", ...}, 72) = 3
pause(

เช† เชฐเชนเซเชฏเซ‹ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ bpf(2) เช…เชฎเชจเซ‡ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชจเช•เชถเซ‹ เชจเช‚เชฌเชฐ เชชเชฐเชค เช•เชฐเซเชฏเซ‹ 3 เช…เชจเซ‡ เชชเช›เซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ, เช…เชชเซ‡เช•เซเชทเชพ เชฎเซเชœเชฌ, เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชฎเชพเช‚ เชตเชงเซ เชธเซ‚เชšเชจเชพเช“เชจเซ€ เชฐเชพเชน เชœเซเช เช›เซ‡ pause(2).

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เช†เชชเชฃเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชฌเซ‡เช•เช—เซเชฐเชพเช‰เชจเซเชกเชฎเชพเช‚ เชฎเซ‹เช•เชฒเซ€เช เช…เชฅเชตเชพ เชฌเซ€เชœเซเช‚ เชŸเชฐเซเชฎเชฟเชจเชฒ เช–เซ‹เชฒเซ€เช เช…เชจเซ‡ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช†เชชเชฃเชพ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‡ เชœเซ‹เชˆเช bpftool (เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชจเช•เชถเชพเชจเซ‡ เชคเซ‡เชจเชพ เชจเชพเชฎเชฅเซ€ เช…เชจเซเชฏ เชฒเซ‹เช•เซ‹เชฅเซ€ เช…เชฒเช— เชชเชพเชกเซ€ เชถเช•เซ€เช เช›เซ€เช):

$ sudo bpftool map
...
114: hash  name woo  flags 0x0
        key 4B  value 4B  max_entries 4  memlock 4096B
...

เชจเช‚เชฌเชฐ 114 เช เช†เชชเชฃเชพ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซเช‚ เชตเซˆเชถเซเชตเชฟเช• ID เช›เซ‡. เชธเชฟเชธเซเชŸเชฎ เชชเชฐเชจเซ‹ เช•เซ‹เชˆเชชเชฃ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชนเชพเชฒเชจเชพ เชจเช•เชถเชพเชจเซ‡ เช–เซ‹เชฒเชตเชพ เชฎเชพเชŸเซ‡ เช† ID เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ BPF_MAP_GET_FD_BY_ID เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ bpf.

เชนเชตเซ‡ เช†เชชเชฃเซ‡ เช†เชชเชฃเชพ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชธเชพเชฅเซ‡ เชฐเชฎเซ€ เชถเช•เซ€เช เช›เซ€เช. เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€เช“ เชœเซ‹เชˆเช:

$ sudo bpftool map dump id 114
Found 0 elements

เช–เชพเชฒเซ€. เชšเชพเชฒเซ‹ เชคเซ‡เชฎเชพเช‚ เชเช• เชฎเซ‚เชฒเซเชฏ เชฎเซ‚เช•เซ€เช hash[1] = 1:

$ sudo bpftool map update id 114 key 1 0 0 0 value 1 0 0 0

เชšเชพเชฒเซ‹ เชซเชฐเซ€เชฅเซ€ เชŸเซ‡เชฌเชฒ เชœเซ‹เชˆเช:

$ sudo bpftool map dump id 114
key: 01 00 00 00  value: 01 00 00 00
Found 1 element

เชนเซเชฐเซ‡! เช…เชฎเซ‡ เชเช• เช˜เชŸเช• เช‰เชฎเซ‡เชฐเชตเชพ เชตเซเชฏเชตเชธเซเชฅเชพเชชเชฟเชค. เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เชฌเชพเชˆเชŸ เชธเซเชคเชฐเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡, เชคเซเชฏเชพเชฐเชฅเซ€ bptftool เชนเซ‡เชถ เชŸเซ‡เชฌเชฒเชฎเชพเช‚ เช•เชฏเชพ เชชเซเชฐเช•เชพเชฐเชจเชพเช‚ เชฎเซ‚เชฒเซเชฏเซ‹ เช›เซ‡ เชคเซ‡ เช–เชฌเชฐ เชจเชฅเซ€. (เช† เชœเซเชžเชพเชจ เชคเซ‡เชฃเซ€เชจเซ‡ BTF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชนเชตเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชตเชงเซ.)

bpftool เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชฐเชพเชฌเชฐ เชตเชพเช‚เชšเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเชคเซเชตเซ‹ เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡? เชšเชพเชฒเซ‹ เชนเซ‚เชก เชนเซ‡เช เชณ เชเช• เชจเชœเชฐ เช•เชฐเซ€เช:

$ sudo strace -e bpf bpftool map dump id 114
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0x55856ab65280}, 120) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0x55856ab65280, value=0x55856ab652a0}, 120) = 0
key: 01 00 00 00  value: 01 00 00 00
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0x55856ab65280, next_key=0x55856ab65280}, 120) = -1 ENOENT

เชชเชนเซ‡เชฒเชพ เช†เชชเชฃเซ‡ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเชพ เชตเซˆเชถเซเชตเชฟเช• ID เชฆเซเชตเชพเชฐเชพ เชจเช•เชถเซ‹ เช–เซ‹เชฒเซเชฏเซ‹ BPF_MAP_GET_FD_BY_ID ะธ bpf(2) เช…เชฎเชจเซ‡ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ 3 เชชเชฐเชค เช•เชฐเซเชฏเซเช‚. เช†เช—เชณ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ BPF_MAP_GET_NEXT_KEY เช…เชฎเชจเซ‡ เชชเชพเชธ เช•เชฐเซ€เชจเซ‡ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เชชเซเชฐเชฅเชฎ เช•เซ€ เชฎเชณเซ€ NULL "เช…เช—เชพเช‰เชจเซ€" เช•เซ€เชจเชพ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เชคเชฐเซ€เช•เซ‡. เชœเซ‹ เช†เชชเชฃเซ€ เชชเชพเชธเซ‡ เชšเชพเชตเซ€ เชนเซ‹เชฏ เชคเซ‹ เช†เชชเชฃเซ‡ เช•เชฐเซ€ เชถเช•เซ€เช BPF_MAP_LOOKUP_ELEMเชœเซ‡ เชจเชฟเชฐเซเชฆเซ‡เชถเช•เชจเซ‡ เชฎเซ‚เชฒเซเชฏ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡ value. เช†เช—เชณเชจเซเช‚ เชชเช—เชฒเซเช‚ เช เช›เซ‡ เช•เซ‡ เช†เชชเชฃเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เช•เซ€ เชชเชฐ เชชเซ‹เช‡เชจเซเชŸเชฐ เชชเชธเชพเชฐ เช•เชฐเซ€เชจเซ‡ เช†เช—เชฒเซเช‚ เชคเชคเซเชต เชถเซ‹เชงเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช เช›เซ€เช, เชชเชฐเช‚เชคเซ เช…เชฎเชพเชฐเชพ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เชฎเชพเชคเซเชฐ เชเช• เชคเชคเซเชต เช…เชจเซ‡ เช†เชฆเซ‡เชถ เช›เซ‡. BPF_MAP_GET_NEXT_KEY เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡ ENOENT.

เช เซ€เช• เช›เซ‡, เชšเชพเชฒเซ‹ เช•เซ€ 1 เชฆเซเชตเชพเชฐเชพ เชฎเซ‚เชฒเซเชฏ เชฌเชฆเชฒเซ€เช, เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เช…เชฎเชพเชฐเชพ เชตเซเชฏเชตเชธเชพเชฏเชจเชพ เชคเชฐเซเช•เชจเซ‡ เชจเซ‹เช‚เชงเชฃเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ hash[1] = 2:

$ sudo strace -e bpf bpftool map update id 114 key 1 0 0 0 value 2 0 0 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=3, key=0x55dcd72be260, value=0x55dcd72be280, flags=BPF_ANY}, 120) = 0

เช…เชชเซ‡เช•เซเชทเชพ เชฎเซเชœเชฌ, เชคเซ‡ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เช›เซ‡: เช†เชฆเซ‡เชถ BPF_MAP_GET_FD_BY_ID ID เช…เชจเซ‡ เช†เชฆเซ‡เชถ เชฆเซเชตเชพเชฐเชพ เช†เชชเชฃเซ‹ เชจเช•เชถเซ‹ เช–เซ‹เชฒเซ‡ เช›เซ‡ BPF_MAP_UPDATE_ELEM เชคเชคเซเชต เชชเชฐ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ‡ เช›เซ‡.

เชคเซ‡เชฅเซ€, เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚เชฅเซ€ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเซเชฏเชพ เชชเช›เซ€, เช†เชชเชฃเซ‡ เชฌเซ€เชœเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚เชฅเซ€ เชคเซ‡เชจเชพ เชตเชฟเชทเชฏเชตเชธเซเชคเซเชจเซ‡ เชตเชพเช‚เชšเซ€ เช…เชจเซ‡ เชฒเช–เซ€ เชถเช•เซ€เช เช›เซ€เช. เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เชœเซ‹ เช†เชชเชฃเซ‡ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจเชฅเซ€ เช† เช•เชฐเชตเชพ เชธเช•เซเชทเชฎ เชนเชคเชพ, เชคเซ‹ เชธเชฟเชธเซเชŸเชฎ เชชเชฐเชจเซ‹ เช•เซ‹เชˆเชชเชฃ เช…เชจเซเชฏ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชคเซ‡ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เช‰เชชเชฐ เชตเชฐเซเชฃเชตเซ‡เชฒ เช†เชฆเซ‡เชถเซ‹ เช‰เชชเชฐเชพเช‚เชค, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชœเช—เซเชฏเชพเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชจเซ€เชšเซ‡เชจเชพ:

  • BPF_MAP_LOOKUP_ELEM: เช•เซ€ เชฆเซเชตเชพเชฐเชพ เชฎเซ‚เชฒเซเชฏ เชถเซ‹เชงเซ‹
  • BPF_MAP_UPDATE_ELEM: เช…เชชเชกเซ‡เชŸ/เช•เซเชฐเชฟเชเชŸ เชตเซ‡เชฒเซเชฏเซ
  • BPF_MAP_DELETE_ELEM: เช•เซ€ เชฆเซ‚เชฐ เช•เชฐเซ‹
  • BPF_MAP_GET_NEXT_KEY: เช†เช—เชฒเซ€ (เช…เชฅเชตเชพ เชชเซเชฐเชฅเชฎ) เช•เซ€ เชถเซ‹เชงเซ‹
  • BPF_MAP_GET_NEXT_ID: เชคเชฎเชจเซ‡ เชนเชพเชฒเชจเชพ เชคเชฎเชพเชฎ เชจเช•เชถเชพเชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เชคเซ‡ เช† เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ bpftool map
  • BPF_MAP_GET_FD_BY_ID: เชนเชพเชฒเชจเชพ เชจเช•เชถเชพเชจเซ‡ เชคเซ‡เชจเชพ เชตเซˆเชถเซเชตเชฟเช• ID เชฆเซเชตเชพเชฐเชพ เช–เซ‹เชฒเซ‹
  • BPF_MAP_LOOKUP_AND_DELETE_ELEM: เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ€ เช•เชฟเช‚เชฎเชค เชชเชฐเชฎเชพเชฃเซ เชฐเซ€เชคเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ‹ เช…เชจเซ‡ เชœเซ‚เชจเซเช‚ เชชเชฐเชค เช•เชฐเซ‹
  • BPF_MAP_FREEZE: เชฏเซเชเชฐเชธเซเชชเซ‡เชธเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพเชจเซ‡ เช…เชชเชฐเชฟเชตเชฐเซเชคเชจเชถเซ€เชฒ เชฌเชจเชพเชตเซ‹ (เช† เช•เชพเชฎเช—เซ€เชฐเซ€ เชชเซ‚เชฐเซเชตเชตเชคเซ เช•เชฐเซ€ เชถเช•เชพเชคเซ€ เชจเชฅเซ€)
  • BPF_MAP_LOOKUP_BATCH, BPF_MAP_LOOKUP_AND_DELETE_BATCH, BPF_MAP_UPDATE_BATCH, BPF_MAP_DELETE_BATCH: เชธเชพเชฎเซ‚เชนเชฟเช• เช•เชพเชฎเช—เซ€เชฐเซ€. เชฆเชพเช–เซเชฒเชพ เชคเชฐเซ€เช•เซ‡, BPF_MAP_LOOKUP_AND_DELETE_BATCH - เชจเช•เชถเชพเชฎเชพเช‚เชฅเซ€ เชคเชฎเชพเชฎ เชฎเซ‚เชฒเซเชฏเซ‹ เชตเชพเช‚เชšเชตเชพ เช…เชจเซ‡ เชฐเซ€เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เช† เชเช•เชฎเชพเชคเซเชฐ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชฐเซ€เชค เช›เซ‡

เช† เชคเชฎเชพเชฎ เช†เชฆเซ‡เชถเซ‹ เชคเชฎเชพเชฎ เชจเช•เชถเชพ เชชเซเชฐเช•เชพเชฐเซ‹ เชฎเชพเชŸเซ‡ เช•เชพเชฎ เช•เชฐเชคเชพ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชœเช—เซเชฏเชพเชฎเชพเช‚เชฅเซ€ เช…เชจเซเชฏ เชชเซเชฐเช•เชพเชฐเชจเชพ เชจเช•เชถเชพ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เช เชนเซ‡เชถ เช•เซ‹เชทเซเชŸเช•เซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชœเซ‡เชตเซเช‚ เชœ เชฆเซ‡เช–เชพเชฏ เช›เซ‡.

เช“เชฐเซเชกเชฐ เช–เชพเชคเชฐ, เชšเชพเชฒเซ‹ เช…เชฎเชพเชฐเชพ เชนเซ‡เชถ เชŸเซ‡เชฌเชฒ เชชเซเชฐเชฏเซ‹เช—เซ‹ เชธเชฎเชพเชชเซเชค เช•เชฐเซ€เช. เชฏเชพเชฆ เชฐเชพเช–เซ‹ เช•เซ‡ เช…เชฎเซ‡ เชเช• เชŸเซ‡เชฌเชฒ เชฌเชจเชพเชตเซเชฏเซเช‚ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชšเชพเชฐ เชธเซเชงเซ€ เช•เซ€ เชธเชฎเชพเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡? เชšเชพเชฒเซ‹ เชฅเซ‹เชกเชพ เชตเชงเซ เช˜เชŸเช•เซ‹ เช‰เชฎเซ‡เชฐเซ€เช:

$ sudo bpftool map update id 114 key 2 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 3 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 4 0 0 0 value 1 0 0 0

เช…เชคเซเชฏเชพเชฐ เชธเซเชงเซ€ เช–เซ‚เชฌ เชธเชพเชฐเซเช‚:

$ sudo bpftool map dump id 114
key: 01 00 00 00  value: 01 00 00 00
key: 02 00 00 00  value: 01 00 00 00
key: 04 00 00 00  value: 01 00 00 00
key: 03 00 00 00  value: 01 00 00 00
Found 4 elements

เชšเชพเชฒเซ‹ เชเช• เชตเชงเซ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช:

$ sudo bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
Error: update failed: Argument list too long

เช…เชชเซ‡เช•เซเชทเชพ เชฎเซเชœเชฌ, เช…เชฎเซ‡ เชธเชซเชณ เชฅเชฏเชพ เชจเชฅเซ€. เชšเชพเชฒเซ‹ เชญเซ‚เชฒเชจเซ‡ เชตเชงเซ เชตเชฟเช—เชคเชฎเชพเช‚ เชœเซ‹เชˆเช:

$ sudo strace -e bpf bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, info_len=80, info=0x7ffe6c626da0}}, 120) = 0
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=3, key=0x56049ded5260, value=0x56049ded5280, flags=BPF_ANY}, 120) = -1 E2BIG (Argument list too long)
Error: update failed: Argument list too long
+++ exited with 255 +++

เชฌเชงเซเช‚ เชธเชพเชฐเซเช‚ เช›เซ‡: เช…เชชเซ‡เช•เซเชทเชพ เชฎเซเชœเชฌ, เชŸเซ€เชฎ BPF_MAP_UPDATE_ELEM เชจเชตเซ€, เชชเชพเช‚เชšเชฎเซ€, เช•เซ€ เชฌเชจเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เช•เซเชฐเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ E2BIG.

เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฌเชจเชพเชตเซ€ เช…เชจเซ‡ เชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช, เชคเซ‡เชฎเชœ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพ เชฌเชจเชพเชตเซ€ เช…เชจเซ‡ เชฎเซ‡เชจเซ‡เชœ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช. เชนเชตเซ‡ เช†เชชเชฃเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซ€ เชถเช•เซ€เช เชคเซ‡ เชœเซ‹เชตเชพเชจเซเช‚ เชคเชพเชฐเซเช•เชฟเช• เช›เซ‡. เช…เชฎเซ‡ เชฎเชถเซ€เชจ เชฎเซ‡เช•เซเชฐเซ‹ เช•เซ‹เชกเซเชธเชฎเชพเช‚ เชนเชพเชฐเซเชก-เชŸเซ-เชฐเซ€เชก เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ€ เชญเชพเชทเชพเชฎเชพเช‚ เช† เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช, เชชเชฐเช‚เชคเซ เชนเช•เซ€เช•เชคเชฎเชพเช‚ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช–เชฐเซ‡เช–เชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชœเชพเชณเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชคเซ‡ เชฌเชคเชพเชตเชตเชพเชจเซ‹ เชธเชฎเชฏ เช†เชตเซ€ เช—เชฏเซ‹ เช›เซ‡ - เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ libbpf.

(เชจเชฟเชฎเซเชจ-เชธเซเชคเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเชพ เช…เชญเชพเชตเชฅเซ€ เช…เชธเช‚เชคเซเชทเซเชŸ เชตเชพเชšเช•เซ‹ เชฎเชพเชŸเซ‡: เช…เชฎเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เชถเซเช‚ เชœเซ‡ เชจเช•เชถเชพ เช…เชจเซ‡ เชธเชนเชพเชฏเช• เช•เชพเชฐเซเชฏเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฌเชจเชพเชตเซ‡เชฒ เช›เซ‡. libbpf เช…เชจเซ‡ เชธเซ‚เชšเชจเชพ เชธเซเชคเชฐเซ‡ เชถเซเช‚ เชฅเชพเชฏ เช›เซ‡ เชคเซ‡ เชคเชฎเชจเซ‡ เชœเชฃเชพเชตเชถเซ‡. เช…เชธเช‚เชคเซเชทเซเชŸ เชตเชพเชšเช•เซ‹ เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เช–เซ‚เชฌ, เช…เชฎเซ‡ เช‰เชฎเซ‡เชฐเซเชฏเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชฒเซ‡เช–เชฎเชพเช‚ เชฏเซ‹เช—เซเชฏ เชœเช—เซเชฏเชพเช.)

libbpf เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฒเช–เชตเชพ

เชฎเชถเซ€เชจ เช•เซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฒเช–เชตเซเช‚ เช เชชเซเชฐเชฅเชฎ เชตเช–เชค เชœ เชฐเชธเชชเซเชฐเชฆ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เชชเช›เซ€ เชธเช‚เชคเซƒเชชเซเชคเชฟ เชธเซ‡เชŸ เชฅเชˆ เชœเชพเชฏ เช›เซ‡. เช† เช•เซเชทเชฃเซ‡ เชคเชฎเชพเชฐเซ‡ เชคเชฎเชพเชฐเซเช‚ เชงเซเชฏเชพเชจ เชคเซ‡เชจเชพ เชชเชฐ เชซเซ‡เชฐเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ llvm, เชœเซ‡ BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชฎเชพเชŸเซ‡ เช•เซ‹เชก เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฌเซ‡เช•เชเชจเซเชก เชงเชฐเชพเชตเซ‡ เช›เซ‡, เชคเซ‡เชฎเชœ เชชเซเชธเซเชคเช•เชพเชฒเชฏ libbpf, เชœเซ‡ เชคเชฎเชจเซ‡ BPF เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชจเซ€ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชพเชœเซ เชฒเช–เชตเชพ เช…เชจเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡เชฒเชพ เช•เซ‹เชกเชจเซ‡ เชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. llvm/clang.

เชนเช•เซ€เช•เชคเชฎเชพเช‚, เชœเซ‡เชฎ เช†เชชเชฃเซ‡ เช† เช…เชจเซ‡ เชชเช›เซ€เชจเชพ เชฒเซ‡เช–เซ‹เชฎเชพเช‚ เชœเซ‹เชˆเชถเซเช‚, libbpf เชคเซ‡เชจเชพ เชตเชฟเชจเชพ เช˜เชฃเซเช‚ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ (เช…เชฅเชตเชพ เชธเชฎเชพเชจ เชธเชพเชงเชจเซ‹ - iproute2, libbcc, libbpf-go, เชตเช—เซ‡เชฐเซ‡) เชœเซ€เชตเชตเซเช‚ เช…เชถเช•เซเชฏ เช›เซ‡. เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ€ เช–เซ‚เชจเซ€ เชตเชฟเชถเซ‡เชทเชคเชพเช“เชฎเชพเช‚เชจเซ€ เชเช• libbpf BPF CO-RE เช›เซ‡ (เชตเชจเซเชธ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซ‹, เชฆเชฐเซ‡เช• เชœเช—เซเชฏเชพเช เชšเชฒเชพเชตเซ‹) - เชเช• เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชœเซ‡ เชคเชฎเชจเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฒเช–เชตเชพเชจเซ€ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡ เชœเซ‡ เชเช• เช•เชฐเซเชจเชฒเชฅเซ€ เชฌเซ€เชœเชพ เช•เชฐเซเชจเชฒ เชชเชฐ เชชเซ‹เชฐเซเชŸเซ‡เชฌเชฒ เชนเซ‹เชฏ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชตเชฟเชตเชฟเชง API เชชเชฐ เชšเชฒเชพเชตเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชนเซ‹เชฏ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเซเชฏเชพเชฐเซ‡ เช•เชฐเซเชจเชฒเชจเซเช‚ เชฎเชพเชณเช–เซเช‚ เชธเช‚เชธเซเช•เชฐเชฃเชฅเซ€ เชฌเชฆเชฒเชพเชฏ เช›เซ‡. เชธเช‚เชธเซเช•เชฐเชฃ เชธเซเชงเซ€). CO-RE เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเช•เซเชทเชฎ เชฅเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ€ เช•เชฐเซเชจเชฒ BTF เชธเชชเซ‹เชฐเซเชŸ เชธเชพเชฅเซ‡ เชธเช‚เช•เชฒเชฟเชค เชนเซ‹เชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡ (เช† เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚ เชคเซ‡ เช…เชฎเซ‡ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ€เช เช›เซ€เช. เชตเชฟเช•เชพเชธ เชธเชพเชงเชจเซ‹. เชคเชฎเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชซเชพเช‡เชฒเชจเซ€ เชนเชพเชœเชฐเซ€ เชฆเซเชตเชพเชฐเชพ - เชคเชฎเชพเชฐเซ€ เช•เชฐเซเชจเชฒ 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]. เชœเซ‹ เช•เซ‡, เช•เชฐเซเชจเชฒเชจเซ€ เชฌเชนเชพเชฐ เชฐเชนเซ‡เชคเชพ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹เชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹ เชฎเชพเชŸเซ‡ เช…เชฒเช— เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เชœเชพเชณเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ https://github.com/libbpf/libbpf เชœเซ‡เชฎเชพเช‚ เช•เชฐเซเชจเชฒ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€ เชตเชงเซ เช•เซ‡ เช“เช›เชพ เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเชคเชฟเชฌเชฟเช‚เชฌเชฟเชค เช›เซ‡.

เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช…เชฎเซ‡ เชœเซ‹เชˆเชถเซเช‚ เช•เซ‡ เชคเชฎเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ libbpf, เชšเชพเชฒเซ‹ เช•เซ‡เชŸเชฒเชพเช• (เชตเชงเซ เช•เซ‡ เช“เช›เชพ เช…เชฐเซเชฅเชนเซ€เชจ) เชชเชฐเซ€เช•เซเชทเชฃ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹ เชฒเช–เซ€เช เช…เชจเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ€เช เช•เซ‡ เชคเซ‡ เชฌเชงเซเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡. เช† เช…เชฎเชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชตเชฟเชญเชพเช—เซ‹เชฎเชพเช‚ เชตเชงเซ เชธเชฐเชณเชคเชพเชฅเซ€ เชธเชฎเชœเชพเชตเชตเชพ เชฆเซ‡เชถเซ‡ เช•เซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชจเช•เชถเชพ, เช•เชฐเซเชจเชฒ เชนเซ‡เชฒเซเชชเชฐเซเชธ, BTF เชตเช—เซ‡เชฐเซ‡ เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‡ เช›เซ‡.

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ libbpf เช—เชฟเชŸ เชธเชฌเชฎเซ‹เชกเซเชฏเซเชฒ เชคเชฐเซ€เช•เซ‡ GitHub เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เช‰เชฎเซ‡เชฐเซ‹, เช…เชฎเซ‡ เชคเซ‡ เชœ เช•เชฐเซ€เชถเซเช‚:

$ mkdir /tmp/libbpf-example
$ cd /tmp/libbpf-example/
$ git init-db
Initialized empty Git repository in /tmp/libbpf-example/.git/
$ git submodule add https://github.com/libbpf/libbpf.git
Cloning into '/tmp/libbpf-example/libbpf'...
remote: Enumerating objects: 200, done.
remote: Counting objects: 100% (200/200), done.
remote: Compressing objects: 100% (103/103), done.
remote: Total 3354 (delta 101), reused 118 (delta 79), pack-reused 3154
Receiving objects: 100% (3354/3354), 2.05 MiB | 10.22 MiB/s, done.
Resolving deltas: 100% (2176/2176), done.

เชœเชˆ เชฐเชนเซเชฏเซ‹ เช›เซ libbpf เช˜เชฃเซเช‚ เชธเชฐเชณ:

$ cd libbpf/src
$ mkdir build
$ OBJDIR=build DESTDIR=root make -s install
$ find root
root
root/usr
root/usr/include
root/usr/include/bpf
root/usr/include/bpf/bpf_tracing.h
root/usr/include/bpf/xsk.h
root/usr/include/bpf/libbpf_common.h
root/usr/include/bpf/bpf_endian.h
root/usr/include/bpf/bpf_helpers.h
root/usr/include/bpf/btf.h
root/usr/include/bpf/bpf_helper_defs.h
root/usr/include/bpf/bpf.h
root/usr/include/bpf/libbpf_util.h
root/usr/include/bpf/libbpf.h
root/usr/include/bpf/bpf_core_read.h
root/usr/lib64
root/usr/lib64/libbpf.so.0.1.0
root/usr/lib64/libbpf.so.0
root/usr/lib64/libbpf.a
root/usr/lib64/libbpf.so
root/usr/lib64/pkgconfig
root/usr/lib64/pkgconfig/libbpf.pc

เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช…เชฎเชพเชฐเซ€ เช†เช—เชพเชฎเซ€ เชฏเซ‹เชœเชจเชพ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡: เช…เชฎเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เซ€เชถเซเช‚ BPF_PROG_TYPE_XDP, เช…เช—เชพเช‰เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ€ เชœเซ‡เชฎ เชœ, เชชเชฐเช‚เชคเซ C เชฎเชพเช‚, เช…เชฎเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซ€เช เช›เซ€เช clang, เช…เชจเซ‡ เชธเชนเชพเชฏเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เซ‹ เชœเซ‡ เชคเซ‡เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเชถเซ‡. เชจเซ€เชšเซ‡เชจเชพ เชตเชฟเชญเชพเช—เซ‹เชฎเชพเช‚ เช…เชฎเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช…เชจเซ‡ เช†เชธเชฟเชธเซเชŸเชจเซเชŸ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฌเช‚เชจเซ‡เชจเซ€ เช•เซเชทเชฎเชคเชพเช“เชจเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ€เชถเซเช‚.

เช‰เชฆเชพเชนเชฐเชฃ: libbpf เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเชตเซ€

เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชซเชพเช‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช /sys/kernel/btf/vmlinux, เชœเซ‡เชจเซ‹ เช‰เชชเชฐ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹, เช…เชจเซ‡ เชนเซ‡เชกเชฐ เชซเชพเช‡เชฒเชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชคเซ‡เชจเซ€ เชธเชฎเช•เช•เซเชท เชฌเชจเชพเชตเซ‹:

$ bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h

เช† เชซเชพเช‡เชฒ เช…เชฎเชพเชฐเชพ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เช‰เชชเชฒเชฌเซเชง เชคเชฎเชพเชฎ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชถเซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เชฐเซเชจเชฒเชฎเชพเช‚ IPv4 เชนเซ‡เชกเชฐเชจเซ‡ เช† เชฐเซ€เชคเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡:

$ grep -A 12 'struct iphdr {' vmlinux.h
struct iphdr {
    __u8 ihl: 4;
    __u8 version: 4;
    __u8 tos;
    __be16 tot_len;
    __be16 id;
    __be16 frag_off;
    __u8 ttl;
    __u8 protocol;
    __sum16 check;
    __be32 saddr;
    __be32 daddr;
};

เชนเชตเซ‡ เช†เชชเชฃเซ‡ เช…เชฎเชพเชฐเซ‹ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ C เชฎเชพเช‚ เชฒเช–เซ€เชถเซเช‚:

$ cat xdp-simple.bpf.c
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>

SEC("xdp/simple")
int simple(void *ctx)
{
        return XDP_PASS;
}

char LICENSE[] SEC("license") = "GPL";

เชœเซ‹ เช•เซ‡ เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เชนเชคเซ‹, เชคเซ‡เชฎ เช›เชคเชพเช‚ เช…เชฎเชพเชฐเซ‡ เช˜เชฃเซ€ เชตเชฟเช—เชคเซ‹ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเซเชฐเชฅเชฎ, เช…เชฎเซ‡ เชธเชฎเชพเชตเชฟเชทเซเชŸ เชชเซเชฐเชฅเชฎ เชนเซ‡เชกเชฐ เชซเชพเชˆเชฒ เช›เซ‡ vmlinux.h, เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชฎเซ‡ เชนเชฎเชฃเชพเช‚ เชœ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซเชฏเซ‹ เช›เซ‡ bpftool btf dump - เชนเชตเซ‡ เช•เชฐเซเชจเชฒ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เช•เซ‡เชตเชพ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ เชคเซ‡ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เช•เชฐเซเชจเชฒ-เชนเซ‡เชกเชฐ เชชเซ‡เช•เซ‡เชœ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€. เชจเซ€เชšเซ‡เชจเซ€ เชนเซ‡เชกเชฐ เชซเชพเช‡เชฒ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชฎเชพเช‚เชฅเซ€ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช†เชตเซ‡ เช›เซ‡ libbpf. เชนเชตเซ‡ เช†เชชเชฃเชจเซ‡ เชซเช•เซเชค เชฎเซ‡เช•เซเชฐเซ‹เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ SEC, เชœเซ‡ เชชเชพเชคเซเชฐเชจเซ‡ ELF เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชซเชพเช‡เชฒเชจเชพ เชฏเซ‹เช—เซเชฏ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡. เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชธเชฎเชพเชฏเซ‡เชฒ เช›เซ‡ xdp/simple, เชœเซเชฏเชพเช‚ เชธเซเชฒเซ‡เชถ เชชเชนเซ‡เชฒเชพเช‚ เช†เชชเชฃเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเซเชฐเช•เชพเชฐ BPF เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ€เช เช›เซ€เช - เช†เชฎเชพเช‚ เชตเชชเชฐเชพเชฏเซ‡เชฒ เชธเช‚เชฎเซ‡เชฒเชจ เช›เซ‡ libbpf, เชตเชฟเชญเชพเช—เชจเชพ เชจเชพเชฎเชจเชพ เช†เชงเชพเชฐเซ‡ เชคเซ‡ เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชตเช–เชคเซ‡ เชฏเซ‹เช—เซเชฏ เชชเซเชฐเช•เชพเชฐเชจเซ‡ เชฌเชฆเชฒเซ‡ เช›เซ‡ bpf(2). BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเซ‹เชคเซ‡ เช›เซ‡ C - เช–เซ‚เชฌ เชœ เชธเชฐเชณ เช…เชจเซ‡ เชเช• เชฒเซ€เชŸเซ€ เชงเชฐเชพเชตเซ‡ เช›เซ‡ return XDP_PASS. เช…เช‚เชคเซ‡, เชเช• เช…เชฒเช— เชตเชฟเชญเชพเช— "license" เชฒเชพเชฏเชธเชจเซเชธเชจเซเช‚ เชจเชพเชฎ เชธเชฎเชพเชตเซ‡ เช›เซ‡.

เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ llvm/clang, เชตเชฐเซเชเชจ >= 10.0.0, เช…เชฅเชตเชพ เชนเชœเซ เชตเชงเซ เชธเชพเชฐเชพ, เชตเชงเซเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช (เชตเชฟเชญเชพเช— เชœเซเช“ เชตเชฟเช•เชพเชธ เชธเชพเชงเชจเซ‹):

$ clang --version
clang version 11.0.0 (https://github.com/llvm/llvm-project.git afc287e0abec710398465ee1f86237513f2b5091)
...

$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o

เชฐเชธเชชเซเชฐเชฆ เชฒเช•เซเชทเชฃเซ‹ เชชเซˆเช•เซ€: เช…เชฎเซ‡ เชฒเช•เซเชทเซเชฏ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชธเซ‚เชšเชตเซ‡ เช›เซ‡ -target bpf เช…เชจเซ‡ เชนเซ‡เชกเชฐเซ‹เชจเซ‹ เชฎเชพเชฐเซเช— libbpf, เชœเซ‡ เช…เชฎเซ‡ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซเชฏเซเช‚ เช›เซ‡. เช‰เชชเชฐเชพเช‚เชค, เชตเชฟเชถเซ‡ เชญเซ‚เชฒเชถเซ‹ เชจเชนเซ€เช‚ -O2, เช† เชตเชฟเช•เชฒเซเชช เชตเชฟเชจเชพ เชคเชฎเซ‡ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เช†เชถเซเชšเชฐเซเชฏเชœเชจเช• เชฌเชจเซ€ เชถเช•เซ‹ เช›เซ‹. เชšเชพเชฒเซ‹ เช†เชชเชฃเซ‹ เช•เซ‹เชก เชœเซ‹เชˆเช, เชถเซเช‚ เช†เชชเชฃเซ‡ เชœเซ‹เชˆเชคเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เชตเชพเชจเซเช‚ เชฎเซ‡เชจเซ‡เชœ เช•เชฐเซเชฏเซเช‚?

$ llvm-objdump --section=xdp/simple --no-show-raw-insn -D xdp-simple.bpf.o

xdp-simple.bpf.o:       file format elf64-bpf

Disassembly of section xdp/simple:

0000000000000000 <simple>:
       0:       r0 = 2
       1:       exit

เชนเชพ, เชคเซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚! เชนเชตเซ‡, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเชพเชฅเซ‡ เชฌเชพเชˆเชจเชฐเซ€ เชซเชพเช‡เชฒ เช›เซ‡, เช…เชจเซ‡ เช…เชฎเซ‡ เชเช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช เชœเซ‡ เชคเซ‡เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเชถเซ‡. เช† เชนเซ‡เชคเซ เชฎเชพเชŸเซ‡ เชชเซเชธเซเชคเช•เชพเชฒเชฏ libbpf เช…เชฎเชจเซ‡ เชฌเซ‡ เชตเชฟเช•เชฒเซเชชเซ‹ เช“เชซเชฐ เช•เชฐเซ‡ เช›เซ‡ - เชจเซ€เชšเชฒเชพ-เชธเซเชคเชฐเชจเชพ API เช…เชฅเชตเชพ เช‰เชšเซเชš-เชธเซเชคเชฐเชจเชพ APIเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹. เช…เชฎเซ‡ เชฌเซ€เชœเซ€ เชฐเซ€เชคเซ‡ เชœเชˆเชถเซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เช…เชฎเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชคเซ‡เชฎเชจเชพ เช…เชจเซเช—เชพเชฎเซ€ เช…เชญเซเชฏเชพเชธ เชฎเชพเชŸเซ‡ เชจเซเชฏเซ‚เชจเชคเชฎ เชชเซเชฐเชฏเชคเซเชจเซ‹ เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพ, เชฒเซ‹เชก เช•เชฐเชตเชพ เช…เชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพ เชคเซ‡ เชถเซ€เช–เชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช.

เชชเซเชฐเชฅเชฎ, เช†เชชเชฃเซ‡ เชธเชฎเชพเชจ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเชพ เชฆเซเชตเชฟเชธเช‚เช—เซ€เชฎเชพเช‚เชฅเซ€ เช†เชชเชฃเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซเช‚ "เชนเชพเชกเชชเชฟเช‚เชœเชฐ" เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. bpftool - BPF เชตเชฟเชถเซเชตเชจเซ€ เชธเซเชตเชฟเชธ เช›เชฐเซ€ (เชœเซ‡เชจเซ‡ เชถเชพเชฌเซเชฆเชฟเช• เชฐเซ€เชคเซ‡ เชฒเชˆ เชถเช•เชพเชฏ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ BPFเชจเชพ เชธเชฐเซเชœเช•เซ‹ เช…เชจเซ‡ เชœเชพเชณเชตเชฃเซ€เช•เชพเชฐเซ‹เชฎเชพเช‚เชจเชพ เชเช• เชกเซ‡เชจเชฟเชฏเชฒ เชฌเซ‹เชฐเซเช•เชฎเซ‡เชจ เชธเซเชตเชฟเชธ เช›เซ‡):

$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h

เชซเชพเชˆเชฒเชฎเชพเช‚ xdp-simple.skel.h เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เชฌเชพเชˆเชจเชฐเซ€ เช•เซ‹เชก เช…เชจเซ‡ เชฎเซ‡เชจเซ‡เชœ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เช•เชพเชฐเซเชฏเซ‹ เชธเชฎเชพเชตเซ‡ เช›เซ‡ - เช…เชฎเชพเชฐเชพ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‡ เชฒเซ‹เชก เช•เชฐเชตเชพ, เชœเซ‹เชกเชตเชพ, เช•เชพเชขเซ€ เชจเชพเช–เชตเชพ. เช…เชฎเชพเชฐเชพ เชธเชพเชฆเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช† เช“เชตเชฐเช•เชฟเชฒ เชœเซ‡เชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡ เชเชตเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชชเชฃ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชซเชพเช‡เชฒเชฎเชพเช‚ เช˜เชฃเชพ เชฌเชงเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช…เชจเซ‡ เชจเช•เชถเชพ เชนเซ‹เชฏ เช›เซ‡ เช…เชจเซ‡ เช† เชตเชฟเชถเชพเชณ ELF เชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เชซเช•เซเชค เชนเชพเชกเชชเชฟเช‚เชœเชฐ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เช•เชธเซเชŸเชฎ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚เชฅเซ€ เชเช• เช•เซ‡ เชฌเซ‡ เชซเช‚เช•เซเชถเชจเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฒเช–เซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช เชšเชพเชฒเซ‹ เชนเชตเซ‡ เช†เช—เชณ เชตเชงเซ€เช.

เช•เชกเช• เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เช•เชนเซ€เช เชคเซ‹, เช…เชฎเชพเชฐเซ‹ เชฒเซ‹เชกเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชจเชœเซ€เชตเซ‹ เช›เซ‡:

#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"

int main(int argc, char **argv)
{
    struct xdp_simple_bpf *obj;

    obj = xdp_simple_bpf__open_and_load();
    if (!obj)
        err(1, "failed to open and/or load BPF objectn");

    pause();

    xdp_simple_bpf__destroy(obj);
}

เชคเซ‡ struct xdp_simple_bpf เชซเชพเชˆเชฒเชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡เชฒ เช›เซ‡ xdp-simple.skel.h เช…เชจเซ‡ เช…เชฎเชพเชฐเซ€ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชซเชพเช‡เชฒเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡:

struct xdp_simple_bpf {
    struct bpf_object_skeleton *skeleton;
    struct bpf_object *obj;
    struct {
        struct bpf_program *simple;
    } progs;
    struct {
        struct bpf_link *simple;
    } links;
};

เช†เชชเชฃเซ‡ เช…เชนเซ€เช‚ เชจเชฟเชฎเซเชจ-เชธเซเชคเชฐเชจเชพ API เชจเชพ เชจเชฟเชถเชพเชจ เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช: เชฎเชพเชณเช–เซเช‚ struct bpf_program *simple ะธ struct bpf_link *simple. เชชเซเชฐเชฅเชฎ เชฎเชพเชณเช–เซเช‚ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เชฒเช–เซ‡เชฒเชพ เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡ xdp/simple, เช…เชจเซ‡ เชฌเซ€เชœเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช‡เชตเซ‡เชจเซเชŸ เชธเซเชคเซเชฐเซ‹เชค เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเซ‹เชกเชพเชฏ เช›เซ‡.

เช•เชพเชฐเซเชฏ xdp_simple_bpf__open_and_load, เชเช• ELF เช‘เชฌเซเชœเซ‡เช•เซเชŸ เช–เซ‹เชฒเซ‡ เช›เซ‡, เชคเซ‡เชจเซ‡ เชชเชพเชฐเซเชธ เช•เชฐเซ‡ เช›เซ‡, เชคเชฎเชพเชฎ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เช…เชจเซ‡ เชธเชฌเชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เชฌเชจเชพเชตเซ‡ เช›เซ‡ (เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช‰เชชเชฐเชพเช‚เชค, ELF เชฎเชพเช‚ เช…เชจเซเชฏ เชตเชฟเชญเชพเช—เซ‹ เชชเชฃ เชนเซ‹เชฏ เช›เซ‡ - เชกเซ‡เชŸเชพ, เชซเช•เซเชค เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เชกเซ‡เชŸเชพ, เชกเชฟเชฌเช—เซ€เช‚เช— เชฎเชพเชนเชฟเชคเซ€, เชฒเชพเช‡เชธเชจเซเชธ, เชตเช—เซ‡เชฐเซ‡), เช…เชจเซ‡ เชชเช›เซ€ เชธเชฟเชธเซเชŸเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡. เช•เซ‰เชฒ bpf, เชœเซ‡เชจเซ‡ เช†เชชเชฃเซ‡ เช•เชฎเซเชชเชพเชˆเชฒ เช•เชฐเซ€เชจเซ‡ เช…เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเซ€เชจเซ‡ เชšเช•เชพเชธเซ€ เชถเช•เซ€เช เช›เซ€เช:

$ clang -O2 -I ./libbpf/src/root/usr/include/ xdp-simple.c -o xdp-simple ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz

$ sudo strace -e bpf ./xdp-simple
...
bpf(BPF_BTF_LOAD, 0x7ffdb8fd9670, 120)  = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0xdfd580, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(5, 8, 0), prog_flags=0, prog_name="simple", prog_ifindex=0, expected_attach_type=0x25 /* BPF_??? */, ...}, 120) = 4

เชšเชพเชฒเซ‹ เชนเชตเซ‡ เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเซ‹เชˆเช bpftool. เชšเชพเชฒเซ‹ เชคเซ‡เชฃเซ€เชจเซเช‚ ID เชถเซ‹เชงเซ€เช:

# bpftool p | grep -A4 simple
463: xdp  name simple  tag 3b185187f1855c4c  gpl
        loaded_at 2020-08-01T01:59:49+0000  uid 0
        xlated 16B  jited 40B  memlock 4096B
        btf_id 185
        pids xdp-simple(16498)

เช…เชจเซ‡ เชกเชฎเซเชช (เช†เชชเชฃเซ‡ เช†เชฆเซ‡เชถเชจเชพ เชŸเซ‚เช‚เช•เชพ เชธเซเชตเชฐเซ‚เชชเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช bpftool prog dump xlated):

# bpftool p d x id 463
int simple(void *ctx):
; return XDP_PASS;
   0: (b7) r0 = 2
   1: (95) exit

เช•เชˆเช• เชจเชตเซเช‚! เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซ‡ เช…เชฎเชพเชฐเซ€ เชธเซ€ เชธเซ‹เชฐเซเชธ เชซเชพเชˆเชฒเชจเชพ เชนเชฟเชธเซเชธเชพเชจเซ‡ เชฎเซเชฆเซเชฐเชฟเชค เช•เชฐเซเชฏเชพ เช›เซ‡. เช† เชฒเชพเชˆเชฌเซเชฐเซ‡เชฐเซ€ เชฆเซเชตเชพเชฐเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ libbpf, เชœเซ‡เชจเซ‡ เชฌเชพเชˆเชจเชฐเซ€เชฎเชพเช‚ เชกเซ€เชฌเช— เชตเชฟเชญเชพเช— เชฎเชณเซเชฏเซ‹, เชคเซ‡เชจเซ‡ BTF เช‘เชฌเซเชœเซ‡เช•เซเชŸเชฎเชพเช‚ เช•เชฎเซเชชเชพเชˆเชฒ เช•เชฐเซเชฏเซ‹, เชคเซ‡เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซเชฏเซ‹ BPF_BTF_LOAD, เช…เชจเซ‡ เชชเช›เซ€ เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชก เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชชเชฐเชฟเชฃเชพเชฎเซ€ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‹ BPG_PROG_LOAD.

เช•เชฐเซเชจเชฒ เชนเซ‡เชฒเซเชชเชฐเซเชธ

BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ "เชฌเชพเชนเซเชฏ" เช•เชพเชฐเซเชฏเซ‹ เชšเชฒเชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡ - เช•เชฐเซเชจเชฒ เชนเซ‡เชฒเซเชชเชฐเซเชธ. เช† เชธเชนเชพเชฏเช• เช•เชพเชฐเซเชฏเซ‹ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‡ เช•เชฐเซเชจเชฒ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ, เชจเช•เชถเชพเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเชพ เช…เชจเซ‡ "เชตเชพเชธเซเชคเชตเชฟเช• เชตเชฟเชถเซเชต" เชธเชพเชฅเซ‡ เชตเชพเชคเชšเซ€เชค เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ - เชชเชฐเซเชซ เช‡เชตเซ‡เชจเซเชŸเซเชธ เชฌเชจเชพเชตเซ‹, เชนเชพเชฐเซเชกเชตเซ‡เชฐเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเซ‹ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชชเซ‡เช•เซ‡เชŸเซ‹ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เช•เชฐเซ‹), เชตเช—เซ‡เชฐเซ‡.

เช‰เชฆเชพเชนเชฐเชฃ: bpf_get_smp_processor_id

"เช‰เชฆเชพเชนเชฐเชฃ เชฆเซเชตเชพเชฐเชพ เชถเซ€เช–เชตเซเช‚" เชชเซ‡เชฐเชพเชกเชพเชˆเชฎเชจเชพ เชฎเชพเชณเช–เชพเชฎเชพเช‚, เชšเชพเชฒเซ‹ เชเช• เชธเชนเชพเชฏเช• เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเชˆเช, bpf_get_smp_processor_id(), เชšเซ‹เช•เซเช•เชธ เชซเชพเช‡เชฒเชฎเชพเช‚ kernel/bpf/helpers.c. เชคเซ‡ เชชเซเชฐเซ‹เชธเซ‡เชธเชฐเชจเซ‹ เชจเช‚เชฌเชฐ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชœเซ‡ เชคเซ‡เชจเซ‡ เช•เชนเซ‡เชตเชพเชฏ เช›เซ‡ เชคเซ‡ เชšเชพเชฒเซ€ เชฐเชนเซเชฏเซ‹ เช›เซ‡. เชชเชฐเช‚เชคเซ เช…เชฎเชจเซ‡ เชคเซ‡เชจเชพ เชธเชฟเชฎเซ‡เชจเซเชŸเชฟเช•เซเชธเชฎเชพเช‚ เชเชŸเชฒเซ‹ เชฐเชธ เชจเชฅเซ€ เชœเซ‡เชŸเชฒเซ‹ เช เชนเช•เซ€เช•เชคเชฎเชพเช‚ เช›เซ‡ เช•เซ‡ เชคเซ‡เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชฎเชพเช‚ เชเช• เชฒเซ€เชŸเซ€ เชฒเชพเช—เซ‡ เช›เซ‡:

BPF_CALL_0(bpf_get_smp_processor_id)
{
    return smp_processor_id();
}

BPF เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจ เชตเซเชฏเชพเช–เซเชฏเชพเช“ Linux เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฒ เชตเซเชฏเชพเช–เซเชฏเชพเช“ เชœเซ‡เชตเซ€ เชœ เช›เซ‡. เช…เชนเซ€เช‚, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชซเช‚เช•เซเชถเชจเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช•เซ‹เชˆ เชฆเชฒเซ€เชฒเซ‹ เชจเชฅเซ€. (เชเช• เช•เชพเชฐเซเชฏ เชœเซ‡ เชฒเซ‡ เช›เซ‡, เช•เชนเซ‹, เชคเซเชฐเชฃ เชฆเชฒเซ€เชฒเซ‹ เชฎเซ‡เช•เซเชฐเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ BPF_CALL_3. เชฆเชฒเซ€เชฒเซ‹เชจเซ€ เชฎเชนเชคเซเชคเชฎ เชธเช‚เช–เซเชฏเชพ เชชเชพเช‚เชš เช›เซ‡.) เชœเซ‹ เช•เซ‡, เช† เชตเซเชฏเชพเช–เซเชฏเชพเชจเซ‹ เชฎเชพเชคเซเชฐ เชชเซเชฐเชฅเชฎ เชญเชพเช— เช›เซ‡. เชฌเซ€เชœเซ‹ เชญเชพเช— เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชฎเชพเชณเช–เซเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เช›เซ‡ struct bpf_func_proto, เชœเซ‡เชฎเชพเช‚ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจเชจเซเช‚ เชตเชฐเซเชฃเชจ เช›เซ‡ เชœเซ‡ เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชธเชฎเชœเซ‡ เช›เซ‡:

const struct bpf_func_proto bpf_get_smp_processor_id_proto = {
    .func     = bpf_get_smp_processor_id,
    .gpl_only = false,
    .ret_type = RET_INTEGER,
};

เชนเซ‡เชฒเซเชชเชฐ เช•เชพเชฐเซเชฏเซ‹เชจเซ€ เชจเซ‹เช‚เชงเชฃเซ€

เช† เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชšเซ‹เช•เซเช•เชธ เชชเซเชฐเช•เชพเชฐเชจเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฎเชพเชŸเซ‡, เชคเซ‡เช“เช เชคเซ‡เชจเซ€ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชพเชตเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชชเซเชฐเช•เชพเชฐ เชฎเชพเชŸเซ‡ BPF_PROG_TYPE_XDP เช•เชฐเซเชจเชฒเชฎเชพเช‚ เช•เชพเชฐเซเชฏ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฅเชฏเซ‡เชฒ เช›เซ‡ xdp_func_proto, เชœเซ‡ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจ ID เชชเชฐเชฅเซ€ เชจเช•เซเช•เซ€ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ XDP เช† เชซเช‚เช•เซเชถเชจเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชจเชนเซ€เช‚. เช…เชฎเชพเชฐเซเช‚ เช•เชพเชฐเซเชฏ เช›เซ‡ เช†เชงเชพเชฐ เช†เชชเซ‡ เช›เซ‡:

static const struct bpf_func_proto *
xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
{
    switch (func_id) {
    ...
    case BPF_FUNC_get_smp_processor_id:
        return &bpf_get_smp_processor_id_proto;
    ...
    }
}

เชจเชตเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเซเชฐเช•เชพเชฐเซ‹ เชซเชพเช‡เชฒเชฎเชพเช‚ "เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค" เช›เซ‡ include/linux/bpf_types.h เชฎเซ‡เช•เซเชฐเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ BPF_PROG_TYPE. เช…เชตเชคเชฐเชฃเชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชเช• เชคเชพเชฐเซเช•เชฟเช• เชตเซเชฏเชพเช–เซเชฏเชพ เช›เซ‡, เช…เชจเซ‡ C เชญเชพเชทเชพเชจเซ€ เชถเชฐเชคเซ‹เชฎเชพเช‚ เช•เซ‹เช‚เช•เซเชฐเชฟเชŸ เชฎเชพเชณเช–เชพเชจเชพ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเชฎเซ‚เชนเชจเซ€ เชตเซเชฏเชพเช–เซเชฏเชพ เช…เชจเซเชฏ เชธเซเชฅเชณเซ‹เช เชฅเชพเชฏ เช›เซ‡. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชซเชพเช‡เชฒเชฎเชพเช‚ kernel/bpf/verifier.c เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชฌเชงเซ€ เชตเซเชฏเชพเช–เซเชฏเชพเช“ bpf_types.h เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธเชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡ bpf_verifier_ops[]:

static const struct bpf_verifier_ops *const bpf_verifier_ops[] = {
#define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type) 
    [_id] = & _name ## _verifier_ops,
#include <linux/bpf_types.h>
#undef BPF_PROG_TYPE
};

เชเชŸเชฒเซ‡ เช•เซ‡, เชฆเชฐเซ‡เช• เชชเซเชฐเช•เชพเชฐเชจเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฎเชพเชŸเซ‡, เชชเซเชฐเช•เชพเชฐเชจเชพ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐ เชฎเชพเชŸเซ‡ เชจเชฟเชฐเซเชฆเซ‡เชถเช• เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ struct bpf_verifier_ops, เชœเซ‡ เชฎเซ‚เชฒเซเชฏ เชธเชพเชฅเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เชฅเชพเชฏ เช›เซ‡ _name ## _verifier_ops, เชเชŸเชฒเซ‡ เช•เซ‡, xdp_verifier_ops เชฎเชพเชŸเซ‡ xdp... เชฎเชพเชณเช–เซเช‚ xdp_verifier_ops เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชซเชพเช‡เชฒเชฎเชพเช‚ net/core/filter.c เชจเซ€เชšเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เช›เซ‡:

const struct bpf_verifier_ops xdp_verifier_ops = {
    .get_func_proto     = xdp_func_proto,
    .is_valid_access    = xdp_is_valid_access,
    .convert_ctx_access = xdp_convert_ctx_access,
    .gen_prologue       = bpf_noop_prologue,
};

เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เช†เชชเชฃเซเช‚ เชชเชฐเชฟเชšเชฟเชค เช•เชพเชฐเซเชฏ เชœเซ‹เชˆเช เช›เซ€เช xdp_func_proto, เชœเซ‡ เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐเชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชชเชฃ เชชเชกเช•เชพเชฐเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชถเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ เชšเชฒเชพเชตเชถเซ‡ เช…เชฎเซเช• เชชเซเชฐเช•เชพเชฐเชจเซ€ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ€ เช…เช‚เชฆเชฐเชจเชพ เช•เชพเชฐเซเชฏเซ‹, เชœเซเช“ verifier.c.

เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช…เชจเซเชฎเชพเชจเชฟเชค BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ bpf_get_smp_processor_id. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เชชเชพเช›เชฒเชพ เชตเชฟเชญเชพเช—เชฎเชพเช‚เชฅเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชจเซ€เชšเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ€เช เช›เซ€เช:

#include "vmlinux.h"
#include <bpf/bpf_helpers.h>

SEC("xdp/simple")
int simple(void *ctx)
{
    if (bpf_get_smp_processor_id() != 0)
        return XDP_DROP;
    return XDP_PASS;
}

char LICENSE[] SEC("license") = "GPL";

ะกะธะผะฒะพะป bpf_get_smp_processor_id เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค ะฒ <bpf/bpf_helper_defs.h> เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹ libbpf เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡

static u32 (*bpf_get_smp_processor_id)(void) = (void *) 8;

เชคเซ‡ เชœ, bpf_get_smp_processor_id เชซเช‚เช•เซเชถเชจ เชชเซ‹เช‡เชจเซเชŸเชฐ เช›เซ‡ เชœเซ‡เชจเซ€ เช•เชฟเช‚เชฎเชค 8 เช›เซ‡, เชœเซเชฏเชพเช‚ 8 เช เชฎเซ‚เชฒเซเชฏ เช›เซ‡ BPF_FUNC_get_smp_processor_id เชชเซเชฐเช•เชพเชฐ enum bpf_fun_id, เชœเซ‡ เช†เชชเชฃเชพ เชฎเชพเชŸเซ‡ เชซเชพเชˆเชฒเชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฅเชฏเซ‡เชฒ เช›เซ‡ vmlinux.h (เชซเชพเชˆเชฒ bpf_helper_defs.h เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฆเซเชตเชพเชฐเชพ เชœเชจเชฐเซ‡เชŸ เชฅเชพเชฏ เช›เซ‡, เชคเซ‡เชฅเซ€ "เชฎเซ‡เชœเชฟเช•" เชจเช‚เชฌเชฐเซ‹ เชฌเชฐเชพเชฌเชฐ เช›เซ‡). เช† เชซเช‚เช•เซเชถเชจ เช•เซ‹เชˆ เชฆเชฒเซ€เชฒเซ‹ เชฒเซ‡เชคเซเช‚ เชจเชฅเซ€ เช…เชจเซ‡ เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชฎเซ‚เชฒเซเชฏ เช†เชชเซ‡ เช›เซ‡ __u32. เชœเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เชคเซ‡เชจเซ‡ เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชšเชฒเชพเชตเซ€เช เช›เซ€เช, clang เชเช• เชธเซ‚เชšเชจเชพ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ BPF_CALL "เชธเชพเชšเซ‹ เชชเซเชฐเช•เชพเชฐ" เชšเชพเชฒเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซเช‚ เชธเช‚เช•เชฒเชจ เช•เชฐเซ€เช เช…เชจเซ‡ เชตเชฟเชญเชพเช— เชœเซ‹เชˆเช xdp/simple:

$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
$ llvm-objdump -D --section=xdp/simple xdp-simple.bpf.o

xdp-simple.bpf.o:       file format elf64-bpf

Disassembly of section xdp/simple:

0000000000000000 <simple>:
       0:       85 00 00 00 08 00 00 00 call 8
       1:       bf 01 00 00 00 00 00 00 r1 = r0
       2:       67 01 00 00 20 00 00 00 r1 <<= 32
       3:       77 01 00 00 20 00 00 00 r1 >>= 32
       4:       b7 00 00 00 02 00 00 00 r0 = 2
       5:       15 01 01 00 00 00 00 00 if r1 == 0 goto +1 <LBB0_2>
       6:       b7 00 00 00 01 00 00 00 r0 = 1

0000000000000038 <LBB0_2>:
       7:       95 00 00 00 00 00 00 00 exit

เชชเซเชฐเชฅเชฎ เชฒเซ€เชŸเซ€เชฎเชพเช‚ เช†เชชเชฃเซ‡ เชธเซ‚เชšเชจเชพเช“ เชœเซ‹เชˆเช เช›เซ€เช call, เชชเชฐเชฟเชฎเชพเชฃ IMM เชœเซ‡ 8 เชจเซ€ เชฌเชฐเชพเชฌเชฐ เช›เซ‡, เช…เชจเซ‡ SRC_REG - เชถเซ‚เชจเซเชฏ. เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชฆเซเชตเชพเชฐเชพ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ ABI เชเช—เซเชฐเซ€เชฎเซ‡เชจเซเชŸ เช…เชจเซเชธเชพเชฐ, เช† เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจ เชจเช‚เชฌเชฐ เช†เช  เชชเชฐ เช•เซ‹เชฒ เช›เซ‡. เชเช•เชตเชพเชฐ เชคเซ‡ เชฒเซ‹เชจเซเชš เชฅเชˆ เชœเชพเชฏ, เชคเชฐเซเช• เชธเชฐเชณ เช›เซ‡. เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚เชฅเซ€ เชตเชณเชคเชฐ เชฎเซ‚เชฒเซเชฏ r0 เชชเชฐ เชจเช•เชฒ เช•เชฐเซ€ r1 เช…เชจเซ‡ เชฒเซ€เชŸเซ€เช“ 2,3 เชชเชฐ เชคเซ‡ เชชเซเชฐเช•เชพเชฐเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡ u32 - เช‰เชชเชฒเชพ 32 เชฌเชฟเชŸเซเชธ เชธเชพเชซ เชฅเชพเชฏ เช›เซ‡. เชฒเซ€เชŸเซ€เช“ 4,5,6,7 เชชเชฐ เช†เชชเชฃเซ‡ 2 เชชเชฐเชค เช•เชฐเซ€เช เช›เซ€เช (XDP_PASS) เช…เชฅเชตเชพ 1 (XDP_DROP) เชฒเชพเช‡เชจ 0 เชฅเซ€ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจ เชถเซ‚เชจเซเชฏ เช…เชฅเชตเชพ เชฌเชฟเชจ-เชถเซ‚เชจเซเชฏ เชฎเซ‚เชฒเซเชฏ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเชพ เช†เชงเชพเชฐเซ‡.

เชšเชพเชฒเซ‹ เช†เชชเชฃเซ€ เชœเชพเชคเชจเซ‡ เชšเช•เชพเชธเซ€เช: เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชก เช•เชฐเซ‹ เช…เชจเซ‡ เช†เช‰เชŸเชชเซเชŸ เชœเซเช“ bpftool prog dump xlated:

$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
$ clang -O2 -g -I ./libbpf/src/root/usr/include/ -o xdp-simple xdp-simple.c ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo ./xdp-simple &
[2] 10914

$ sudo bpftool p | grep simple
523: xdp  name simple  tag 44c38a10c657e1b0  gpl
        pids xdp-simple(10915)

$ sudo bpftool p d x id 523
int simple(void *ctx):
; if (bpf_get_smp_processor_id() != 0)
   0: (85) call bpf_get_smp_processor_id#114128
   1: (bf) r1 = r0
   2: (67) r1 <<= 32
   3: (77) r1 >>= 32
   4: (b7) r0 = 2
; }
   5: (15) if r1 == 0x0 goto pc+1
   6: (b7) r0 = 1
   7: (95) exit

เช“เช•เซ‡, เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐเชจเซ‡ เชฏเซ‹เช—เซเชฏ เช•เชฐเซเชจเชฒ-เชธเชนเชพเชฏเช• เชฎเชณเซเชฏเซ‹.

เช‰เชฆเชพเชนเชฐเชฃ: เชฆเชฒเซ€เชฒเซ‹ เชชเชธเชพเชฐ เช•เชฐเชตเซ€ เช…เชจเซ‡ เช…เช‚เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเชตเซ‹!

เชฌเชงเชพ เชฐเชจ-เชฒเซ‡เชตเชฒ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจเชฎเชพเช‚ เชชเซเชฐเซ‹เชŸเซ‹เชŸเชพเช‡เชช เชนเซ‹เชฏ เช›เซ‡

u64 fn(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5)

เชธเชนเชพเชฏเช• เช•เชพเชฐเซเชฏเซ‹เชจเชพ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชฐเชœเซ€เชธเซเชŸเชฐเชฎเชพเช‚ เชชเชธเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ r1-r5, เช…เชจเซ‡ เชฎเซ‚เชฒเซเชฏ เชฐเชœเซ€เชธเซเชŸเชฐเชฎเชพเช‚ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ r0. เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชซเช‚เช•เซเชถเชจ เชจเชฅเซ€ เช•เซ‡ เชœเซ‡ เชชเชพเช‚เชš เช•เชฐเชคเชพเช‚ เชตเชงเซ เชฆเชฒเซ€เชฒเซ‹ เชฒเซ‡ เช›เซ‡, เช…เชจเซ‡ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชฅเชจ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‡เชตเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชจเชฅเซ€.

เชšเชพเชฒเซ‹ เชจเชตเชพ เช•เชฐเซเชจเชฒ เชนเซ‡เชฒเซเชชเชฐ เชชเชฐ เชเช• เชจเชœเชฐ เช•เชฐเซ€เช เช…เชจเซ‡ BPF เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชชเชธเชพเชฐ เช•เชฐเซ‡ เช›เซ‡. เชšเชพเชฒเซ‹ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ€เช xdp-simple.bpf.c เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ (เชฌเชพเช•เซ€เชจเซ€ เชฒเซ€เชŸเซ€เช“ เชฌเชฆเชฒเชพเชˆ เชจเชฅเซ€):

SEC("xdp/simple")
int simple(void *ctx)
{
    bpf_printk("running on CPU%un", bpf_get_smp_processor_id());
    return XDP_PASS;
}

เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ CPU เชจเซ‹ เชจเช‚เชฌเชฐ เช›เชพเชชเซ‡ เช›เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชคเซ‡ เชšเชพเชฒเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡. เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เช•เชฎเซเชชเชพเชˆเชฒ เช•เชฐเซ€เช เช…เชจเซ‡ เช•เซ‹เชก เชœเซ‹เชˆเช:

$ llvm-objdump -D --section=xdp/simple --no-show-raw-insn xdp-simple.bpf.o

0000000000000000 <simple>:
       0:       r1 = 10
       1:       *(u16 *)(r10 - 8) = r1
       2:       r1 = 8441246879787806319 ll
       4:       *(u64 *)(r10 - 16) = r1
       5:       r1 = 2334956330918245746 ll
       7:       *(u64 *)(r10 - 24) = r1
       8:       call 8
       9:       r1 = r10
      10:       r1 += -24
      11:       r2 = 18
      12:       r3 = r0
      13:       call 6
      14:       r0 = 2
      15:       exit

0-7 เชฒเซ€เชŸเซ€เช“เชฎเชพเช‚ เช†เชชเชฃเซ‡ เชถเชฌเซเชฆเชฎเชพเชณเชพ เชฒเช–เซ€เช เช›เซ€เช running on CPU%un, เช…เชจเซ‡ เชชเช›เซ€ เชฒเซ€เชŸเซ€ 8 เชชเชฐ เช†เชชเชฃเซ‡ เชชเชฐเชฟเชšเชฟเชคเชจเซ‡ เชšเชฒเชพเชตเซ€เช เช›เซ€เช bpf_get_smp_processor_id. เชฒเซ€เชŸเซ€เช“ 9-12 เชชเชฐ เช…เชฎเซ‡ เชฎเชฆเชฆเช—เชพเชฐ เชฆเชฒเซ€เชฒเซ‹ เชคเซˆเชฏเชพเชฐ เช•เชฐเซ€เช เช›เซ€เช bpf_printk - เชฐเชœเซ€เชธเซเชŸเชฐ r1, r2, r3. เชถเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชคเซเชฐเชฃ เช›เซ‡ เช…เชจเซ‡ เชฌเซ‡ เชจเชฅเซ€? เช•เชพเชฐเชฃ เช•เซ‡ bpf_printkเช† เชเช• เชฎเซ‡เช•เซเชฐเซ‹ เชฐเซ‡เชชเชฐ เช›เซ‡ เชตเชพเชธเซเชคเชตเชฟเช• เชธเชนเชพเชฏเช•เชจเซ€ เช†เชธเชชเชพเชธ bpf_trace_printk, เชœเซ‡เชจเซ‡ เชซเซ‹เชฐเซเชฎเซ‡เชŸ เชธเซเชŸเซเชฐเชฟเช‚เช—เชจเซเช‚ เช•เชฆ เชชเชธเชพเชฐ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชšเชพเชฒเซ‹ เชนเชตเซ‡ เชคเซ‡เชฎเชพเช‚ เชฌเซ‡ เชฒเซ€เชŸเซ€เช“ เช‰เชฎเซ‡เชฐเซ€เช xdp-simple.cเชœเซ‡เชฅเซ€ เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏ lo เช…เชจเซ‡ เช–เชฐเซ‡เช–เชฐ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚!

$ cat xdp-simple.c
#include <linux/if_link.h>
#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"

int main(int argc, char **argv)
{
    __u32 flags = XDP_FLAGS_SKB_MODE;
    struct xdp_simple_bpf *obj;

    obj = xdp_simple_bpf__open_and_load();
    if (!obj)
        err(1, "failed to open and/or load BPF objectn");

    bpf_set_link_xdp_fd(1, -1, flags);
    bpf_set_link_xdp_fd(1, bpf_program__fd(obj->progs.simple), flags);

cleanup:
    xdp_simple_bpf__destroy(obj);
}

เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช bpf_set_link_xdp_fd, เชœเซ‡ XDP-เชชเซเชฐเช•เชพเชฐ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชธเชพเชฅเซ‡ เชœเซ‹เชกเซ‡ เช›เซ‡. เช…เชฎเซ‡ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชจเช‚เชฌเชฐ เชนเชพเชฐเซเชกเช•เซ‹เชก เช•เชฐเซเชฏเซ‹ เช›เซ‡ lo, เชœเซ‡ เชนเช‚เชฎเซ‡เชถเชพ 1 เชนเซ‹เชฏ เช›เซ‡. เชœเซ‹ เชœเซ‚เชจเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เชนเซ‹เชฏ เชคเซ‹ เชคเซ‡เชจเซ‡ เช…เชฒเช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชฌเซ‡ เชตเชพเชฐ เชซเช‚เช•เซเชถเชจ เชšเชฒเชพเชตเซ€เช เช›เซ€เช. เชจเซ‹เช‚เชง เชฒเซ‹ เช•เซ‡ เชนเชตเซ‡ เช†เชชเชฃเชจเซ‡ เช•เซ‹เชˆ เชชเชกเช•เชพเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€ pause เช…เชฅเชตเชพ เช…เชจเช‚เชค เชฒเซ‚เชช: เช…เชฎเชพเชฐเซ‹ เชฒเซ‹เชกเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ€ เชœเชถเซ‡, เชชเชฐเช‚เชคเซ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชฎเชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เช‡เชตเซ‡เชจเซเชŸ เชธเซเชคเซเชฐเซ‹เชค เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เช›เซ‡. เชธเชซเชณ เชกเชพเช‰เชจเชฒเซ‹เชก เช…เชจเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชชเช›เซ€, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชฆเชฐเซ‡เช• เชจเซ‡เชŸเชตเชฐเซเช• เชชเซ‡เช•เซ‡เชŸ เชฎเชพเชŸเซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ lo.

เชšเชพเชฒเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€เช เช…เชจเซ‡ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชœเซ‹เชˆเช lo:

$ sudo ./xdp-simple
$ sudo bpftool p | grep simple
669: xdp  name simple  tag 4fca62e77ccb43d6  gpl
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    prog/xdp id 669

เช…เชฎเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‡เชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ ID 669 เช›เซ‡ เช…เชจเซ‡ เช…เชฎเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เชธเชฎเชพเชจ ID เชœเซ‹เชˆเช เช›เซ€เช lo. เช…เชฎเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชชเซ‡เช•เซ‡เชœเซ‹ เชฎเซ‹เช•เชฒเซ€เชถเซเช‚ 127.0.0.1 (เชตเชฟเชจเช‚เชคเซ€ + เชœเชตเชพเชฌ):

$ ping -c1 localhost

เช…เชจเซ‡ เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชกเซ€เชฌเช— เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชซเชพเชˆเชฒเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชœเซ‹เชˆเช /sys/kernel/debug/tracing/trace_pipe, เชœเซ‡เชฎเชพเช‚ bpf_printk เชคเซ‡เชจเชพ เชธเช‚เชฆเซ‡เชถเชพเช“ เชฒเช–เซ‡ เช›เซ‡:

# cat /sys/kernel/debug/tracing/trace_pipe
ping-13937 [000] d.s1 442015.377014: bpf_trace_printk: running on CPU0
ping-13937 [000] d.s1 442015.377027: bpf_trace_printk: running on CPU0

เชฌเซ‡ เชชเซ‡เช•เซ‡เชœ เชชเชฐ เชœเซ‹เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ lo เช…เชจเซ‡ CPU0 เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ - เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเชฅเชฎ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซเชตเชฟเชงเชพเชฏเซเช•เซเชค เช…เชฐเซเชฅเชนเซ€เชจ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡!

เชคเซ‡ เชจเซ‹เช‚เชงเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ bpf_printk เชคเซ‡ เช•เช‚เชˆเชชเชฃ เชฎเชพเชŸเซ‡ เชจเชฅเซ€ เช•เซ‡ เชคเซ‡ เชกเซ€เชฌเช— เชซเชพเช‡เชฒ เชชเชฐ เชฒเช–เซ‡ เช›เซ‡: เช‰เชคเซเชชเชพเชฆเชจเชฎเชพเช‚ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡ เช† เชธเซŒเชฅเซ€ เชธเชซเชณ เชธเชนเชพเชฏเช• เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช…เชฎเชพเชฐเซเช‚ เชฒเช•เซเชทเซเชฏ เช•เช‚เชˆเช• เชธเชฐเชณ เชฌเชคเชพเชตเชตเชพเชจเซเช‚ เชนเชคเซเช‚.

BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‡

เช‰เชฆเชพเชนเชฐเชฃ: BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เช…เช—เชพเช‰เชจเชพ เชตเชฟเชญเชพเช—เซ‹เชฎเชพเช‚ เช†เชชเชฃเซ‡ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซเช‚ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชคเซ‡ เชถเซ€เช–เซเชฏเชพ, เช…เชจเซ‡ เชนเชตเซ‡ เชšเชพเชฒเซ‹ เช•เชฐเซเชจเชฒ เชญเชพเช— เชœเซ‹เชˆเช. เชšเชพเชฒเซ‹, เชนเช‚เชฎเซ‡เชถเชจเซ€ เชœเซ‡เชฎ, เช‰เชฆเชพเชนเชฐเชฃ เชธเชพเชฅเซ‡ เชถเชฐเซ‚ เช•เชฐเซ€เช. เชšเชพเชฒเซ‹ เช†เชชเชฃเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ€เช xdp-simple.bpf.c เชจเซ€เชšเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เช›เซ‡:

#include "vmlinux.h"
#include <bpf/bpf_helpers.h>

struct {
    __uint(type, BPF_MAP_TYPE_ARRAY);
    __uint(max_entries, 8);
    __type(key, u32);
    __type(value, u64);
} woo SEC(".maps");

SEC("xdp/simple")
int simple(void *ctx)
{
    u32 key = bpf_get_smp_processor_id();
    u32 *val;

    val = bpf_map_lookup_elem(&woo, &key);
    if (!val)
        return XDP_ABORTED;

    *val += 1;

    return XDP_PASS;
}

char LICENSE[] SEC("license") = "GPL";

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เช…เชฎเซ‡ เชจเช•เชถเชพเชจเซ€ เชตเซเชฏเชพเช–เซเชฏเชพ เช‰เชฎเซ‡เชฐเซ€ woo: เช† เชเช• 8-เชคเชคเซเชต เชเชฐเซ‡ เช›เซ‡ เชœเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ‡ เช›เซ‡ u64 (C เชฎเชพเช‚ เช†เชชเชฃเซ‡ เช†เชตเชพ เชเชฐเซ‡เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ€เชถเซเช‚ u64 woo[8]). เชเช• เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเชฎเชพเช‚ "xdp/simple" เช†เชชเชฃเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชชเซเชฐเซ‹เชธเซ‡เชธเชฐ เชจเช‚เชฌเชฐเชจเซ‡ เชตเซ‡เชฐเซ€เชเชฌเชฒเชฎเชพเช‚ เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช key เช…เชจเซ‡ เชชเช›เซ€ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ bpf_map_lookup_element เช†เชชเชฃเชจเซ‡ เชเชฐเซ‡เชฎเชพเช‚ เช…เชจเซเชฐเซ‚เชช เชเชจเซเชŸเซเชฐเซ€ เชฎเชพเชŸเซ‡ เชชเซ‹เช‡เชจเซเชŸเชฐ เชฎเชณเซ‡ เช›เซ‡, เชœเซ‡เชจเซ‡ เช†เชชเชฃเซ‡ เชเช• เชตเชกเซ‡ เชตเชงเชพเชฐเซ€เช เช›เซ€เช. เชฐเชถเชฟเชฏเชจเชฎเชพเช‚ เช…เชจเซเชตเชพเชฆเชฟเชค: เช…เชฎเซ‡ เช†เช‚เช•เชกเชพเช“เชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ€เช เช›เซ€เช เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ CPU เช‡เชจเช•เชฎเชฟเช‚เช— เชชเซ‡เช•เซ‡เชŸ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ‡ เช›เซ‡. เชšเชพเชฒเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชฒเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช:

$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
$ clang -O2 -g -I ./libbpf/src/root/usr/include/ -o xdp-simple xdp-simple.c ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo ./xdp-simple

เชšเชพเชฒเซ‹ เชคเชชเชพเชธเซ€เช เช•เซ‡ เชคเซ‡เชฃเซ€ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒเซ€ เช›เซ‡ lo เช…เชจเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเซ‹เช•เชฒเซ‹:

$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    prog/xdp id 108

$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done

เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชเชฐเซ‡เชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชœเซ‹เชˆเช:

$ sudo bpftool map dump name woo
[
    { "key": 0, "value": 0 },
    { "key": 1, "value": 400 },
    { "key": 2, "value": 0 },
    { "key": 3, "value": 0 },
    { "key": 4, "value": 0 },
    { "key": 5, "value": 0 },
    { "key": 6, "value": 0 },
    { "key": 7, "value": 46400 }
]

เชฒเช—เชญเช— เชคเชฎเชพเชฎ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ CPU7 เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เช† เช…เชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชจเชฅเซ€, เชฎเซเช–เซเชฏ เชตเชธเซเชคเซ เช เช›เซ‡ เช•เซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเซ‡ เชธเชฎเชœเซ€เช เช›เซ€เช เช•เซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ - เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ ั…ะตะปะฟะตั€ะพะฒ bpf_mp_*.

เชฐเชนเชธเซเชฏเชตเชพเชฆเซ€ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ

เชคเซ‡เชฅเซ€, เช…เชฎเซ‡ เช•เซ‰เชฒเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚เชฅเซ€ เชจเช•เชถเชพเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช

val = bpf_map_lookup_elem(&woo, &key);

เชœเซเชฏเชพเช‚ เชนเซ‡เชฒเซเชชเชฐ เชซเช‚เช•เซเชถเชจ เชœเซ‡เชตเซเช‚ เชฆเซ‡เช–เชพเชฏ เช›เซ‡

void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)

เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เชเช• เชจเชฟเชฐเซเชฆเซ‡เชถเช• เชชเชธเชพเชฐ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช &woo เชเช• เช…เชจเชพเชฎเซ€ เชฐเชšเชจเชพ เชฎเชพเชŸเซ‡ struct { ... }...

เชœเซ‹ เช†เชชเชฃเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชเชธเซ‡เชฎเซเชฌเชฒเชฐเชจเซ‡ เชœเซ‹เชˆเช, เชคเซ‹ เช†เชชเชฃเซ‡ เชœเซ‹เชˆเช เช›เซ€เช เช•เซ‡ เชฎเซ‚เชฒเซเชฏ &woo เชตเชพเชธเซเชคเชตเชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชจเชฅเซ€ (เชฒเชพเช‡เชจ 4):

llvm-objdump -D --section xdp/simple xdp-simple.bpf.o

xdp-simple.bpf.o:       file format elf64-bpf

Disassembly of section xdp/simple:

0000000000000000 <simple>:
       0:       85 00 00 00 08 00 00 00 call 8
       1:       63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
       2:       bf a2 00 00 00 00 00 00 r2 = r10
       3:       07 02 00 00 fc ff ff ff r2 += -4
       4:       18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
       6:       85 00 00 00 01 00 00 00 call 1
...

เช…เชจเซ‡ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฃเชฎเชพเช‚ เชธเชฎเชพเชฏเซ‡เชฒ เช›เซ‡:

$ llvm-readelf -r xdp-simple.bpf.o | head -4

Relocation section '.relxdp/simple' at offset 0xe18 contains 1 entries:
    Offset             Info             Type               Symbol's Value  Symbol's Name
0000000000000020  0000002700000001 R_BPF_64_64            0000000000000000 woo

เชชเชฐเช‚เชคเซ เชœเซ‹ เช†เชชเชฃเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชฒเซ‹เชก เชฅเชฏเซ‡เชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชœเซ‹เชˆเช, เชคเซ‹ เช†เชชเชฃเชจเซ‡ เชธเชพเชšเชพ เชจเช•เชถเชพ (เชฒเชพเชˆเชจ 4) เชฎเชพเชŸเซ‡ เชเช• เชจเชฟเชฐเซเชฆเซ‡เชถเช• เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

$ sudo bpftool prog dump x name simple
int simple(void *ctx):
   0: (85) call bpf_get_smp_processor_id#114128
   1: (63) *(u32 *)(r10 -4) = r0
   2: (bf) r2 = r10
   3: (07) r2 += -4
   4: (18) r1 = map[id:64]
...

เช†เชฎ, เช…เชฎเซ‡ เชจเชฟเชทเซเช•เชฐเซเชท เชชเชฐ เช†เชตเซ€ เชถเช•เซ€เช เช›เซ€เช เช•เซ‡ เช…เชฎเชพเชฐเซ‹ เชฒเซ‹เชกเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เช‚เชš เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชคเซ‡เชจเซ€ เชฒเชฟเช‚เช• &woo เชชเซเชธเซเชคเช•เชพเชฒเชฏ เชธเชพเชฅเซ‡ เช•เช‚เชˆเช• เชฆเซเชตเชพเชฐเชพ เชฌเชฆเชฒเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ libbpf. เชชเชนเซ‡เชฒเชพ เช†เชชเชฃเซ‡ เช†เช‰เชŸเชชเซเชŸ เชœเซ‹เชˆเชถเซเช‚ strace:

$ sudo strace -e bpf ./xdp-simple
...
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, key_size=4, value_size=8, max_entries=8, map_name="woo", ...}, 120) = 4
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, prog_name="simple", ...}, 120) = 5

เชคเซ‡ เช†เชชเชฃเซ‡ เชœเซ‹เชˆเช เช›เซ€เช libbpf เชจเช•เชถเซ‹ เชฌเชจเชพเชตเซเชฏเซ‹ woo เช…เชจเซ‡ เชชเช›เซ€ เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซเชฏเซ‹ simple. เชšเชพเชฒเซ‹ เช†เชชเชฃเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเซ‹เชก เช•เชฐเซ€เช เช›เซ€เช เชคเซ‡เชจเชพ เชชเชฐ เชจเชœเซ€เช•เชฅเซ€ เชจเชœเชฐ เช•เชฐเซ€เช:

  • เช•เซ‰เชฒ xdp_simple_bpf__open_and_load เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ xdp-simple.skel.h
  • เชœเซ‡เชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ‡ เช›เซ‡ xdp_simple_bpf__load เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ xdp-simple.skel.h
  • เชœเซ‡เชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ‡ เช›เซ‡ bpf_object__load_skeleton เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ libbpf/src/libbpf.c
  • เชœเซ‡เชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ‡ เช›เซ‡ bpf_object__load_xattr เชฅเซ€ libbpf/src/libbpf.c

เช›เซ‡เชฒเซเชฒเซเช‚ เช•เชพเชฐเซเชฏ, เช…เชจเซเชฏ เชตเชธเซเชคเซเช“เชจเซ€ เชตเชšเซเชšเซ‡, เช•เซ‰เชฒ เช•เชฐเชถเซ‡ bpf_object__create_maps, เชœเซ‡ เชนเชพเชฒเชจเชพ เชจเช•เชถเชพ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช…เชฅเชตเชพ เช–เซ‹เชฒเซ‡ เช›เซ‡, เชคเซ‡เชฎเชจเซ‡ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพเช“เชฎเชพเช‚ เชซเซ‡เชฐเชตเซ‡ เช›เซ‡. (เช† เชคเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เช†เชชเชฃเซ‡ เชœเซ‹เชˆเช เช›เซ€เช BPF_MAP_CREATE เช†เช‰เชŸเชชเซเชŸ เชฎเชพเช‚ strace.) เช†เช—เชณ เชซเช‚เช•เซเชถเชจ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ bpf_object__relocate เช…เชจเซ‡ เชคเซ‡ เชคเซ‡ เช›เซ‡ เชœเซ‡ เช…เชฎเชจเซ‡ เชฐเชธ เชงเชฐเชพเชตเซ‡ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช…เชฎเซ‡ เชœเซ‡ เชœเซ‹เชฏเซเช‚ เชคเซ‡ เช…เชฎเชจเซ‡ เชฏเชพเชฆ เช›เซ‡ woo เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฃ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚. เชคเซ‡เชจเซเช‚ เช…เชจเซเชตเซ‡เชทเชฃ เช•เชฐเซ€เชจเซ‡, เช†เชชเชฃเซ‡ เช†เช–เชฐเซ‡ เชชเซ‹เชคเชพเชจเซ‡ เช•เชพเชฐเซเชฏเชฎเชพเช‚ เชถเซ‹เชงเซ€เช เช›เซ€เช bpf_program__relocate, เชœเซ‡ เชจเช•เชถเชพ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฃ เชธเชพเชฅเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เช•เชฐเซ‡ เช›เซ‡:

case RELO_LD64:
    insn[0].src_reg = BPF_PSEUDO_MAP_FD;
    insn[0].imm = obj->maps[relo->map_idx].fd;
    break;

เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เช…เชฎเชพเชฐเซ€ เชธเซ‚เชšเชจเชพเช“ เชฒเชˆเช เช›เซ€เช

18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll

เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชธเซ‹เชฐเซเชธ เชฐเชœเชฟเชธเซเชŸเชฐ เชฌเชฆเชฒเซ‹ BPF_PSEUDO_MAP_FD, เช…เชจเซ‡ เช…เชฎเชพเชฐเชพ เชจเช•เชถเชพเชจเชพ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพเชฎเชพเช‚ เชชเซเชฐเชฅเชฎ IMM เช…เชจเซ‡, เชœเซ‹ เชคเซ‡ เชธเชฎเชพเชจ เชนเซ‹เชฏ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, 0xdeadbeef, เชชเช›เซ€ เชชเชฐเชฟเชฃเชพเชฎเซ‡ เช…เชฎเชจเซ‡ เชธเซ‚เชšเชจเชพ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡

18 11 00 00 ef eb ad de 00 00 00 00 00 00 00 00 r1 = 0 ll

เช† เชฐเซ€เชคเซ‡ เชจเช•เชถเชพเชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เชšเซ‹เช•เซเช•เชธ เชฒเซ‹เชก เช•เชฐเซ‡เชฒเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชฅเชพเชฏ เช›เซ‡. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชจเช•เชถเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฌเชจเชพเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡ BPF_MAP_CREATE, เช…เชจเซ‡ ID เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช–เซ‹เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ BPF_MAP_GET_FD_BY_ID.

เช•เซเชฒ, เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ libbpf เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡:

  • เชธเช‚เช•เชฒเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชจเช•เชถเชพเชจเซ€ เชฒเชฟเช‚เช•เซเชธ เชฎเชพเชŸเซ‡ เชฐเชฟเชฒเซ‹เช•เซ‡เชถเชจ เชŸเซ‡เชฌเชฒเชฎเชพเช‚ เชฐเซ‡เช•เซ‹เชฐเซเชก เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡
  • libbpf ELF เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฌเซเช• เช–เซ‹เชฒเซ‡ เช›เซ‡, เชฌเชงเชพ เชตเชชเชฐเชพเชฏเซ‡เชฒ เชจเช•เชถเชพ เชถเซ‹เชงเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ‡ เช›เซ‡
  • เชธเซ‚เชšเชจเชพเชจเชพ เชญเชพเช—เชฐเซ‚เชชเซ‡ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡ LD64

เชœเซ‡เชฎ เชคเชฎเซ‡ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชคเซเชฏเชพเช‚ เช˜เชฃเซเช‚ เชฌเชงเซเช‚ เช†เชตเชตเชพเชจเซเช‚ เช›เซ‡ เช…เชจเซ‡ เช†เชชเชฃเซ‡ เชฎเซ‚เชณเชฎเชพเช‚ เชœเซ‹เชตเซเช‚ เชชเชกเชถเซ‡. เชธเชฆเชจเชธเซ€เชฌเซ‡, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเช• เชšเชพเชตเซ€ เช›เซ‡ - เช…เชฎเซ‡ เช…เชฐเซเชฅ เชฒเช–เซเชฏเซ‹ เช›เซ‡ BPF_PSEUDO_MAP_FD เชธเซเชคเซเชฐเซ‹เชค เชฐเชœเชฟเชธเซเชŸเชฐเชฎเชพเช‚ เช…เชจเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชฆเชซเชจเชพเชตเซ€ เชถเช•เซ€เช เช›เซ€เช, เชœเซ‡ เช†เชชเชฃเชจเซ‡ เชฌเชงเชพ เชธเช‚เชคเซ‹เชจเชพ เชชเชตเชฟเชคเซเชฐ เชคเชฐเชซ เชฆเซ‹เชฐเซ€ เชœเชถเซ‡ - kernel/bpf/verifier.c, เชœเซเชฏเชพเช‚ เชตเชฟเชถเชฟเชทเซเชŸ เชจเชพเชฎ เชธเชพเชฅเซ‡เชจเซเช‚ เชซเช‚เช•เซเชถเชจ เชซเชพเช‡เชฒ เชกเชฟเชธเซเช•เซเชฐเซ€เชชเซเชŸเชฐเชจเซ‡ เชŸเชพเชˆเชชเชจเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเชพ เชเชกเซเชฐเซ‡เชธ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเซ‡ เช›เซ‡ struct bpf_map:

static int replace_map_fd_with_map_ptr(struct bpf_verifier_env *env) {
    ...

    f = fdget(insn[0].imm);
    map = __bpf_map_get(f);
    if (insn->src_reg == BPF_PSEUDO_MAP_FD) {
        addr = (unsigned long)map;
    }
    insn[0].imm = (u32)addr;
    insn[1].imm = addr >> 32;

(เชธเช‚เชชเซ‚เชฐเซเชฃ เช•เซ‹เชก เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เชฒเชฟเช‚เช•). เชคเซ‡เชฅเซ€ เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเซ‹ เชตเชฟเชธเซเชคเชพเชฐ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช:

  • เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชก เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชจเช•เชถเชพเชจเซ‹ เชธเชพเชšเซ‹ เช‰เชชเชฏเซ‹เช— เชคเชชเชพเชธเซ‡ เช›เซ‡ เช…เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชฌเช‚เชงเชพเชฐเชฃเชจเซเช‚ เชธเชฐเชจเชพเชฎเซเช‚ เชฒเช–เซ‡ เช›เซ‡ struct bpf_map

เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ ELF เชฌเชพเชˆเชจเชฐเซ€ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ libbpf เชคเซเชฏเชพเช‚ เช˜เชฃเซเช‚ เชฌเชงเซเช‚ เชšเชพเชฒเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เช…เชจเซเชฏ เชฒเซ‡เช–เซ‹เชฎเชพเช‚ เชคเซ‡เชจเซ€ เชšเชฐเซเชšเชพ เช•เชฐเซ€เชถเซเช‚.

libbpf เชตเชฟเชจเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช…เชจเซ‡ เชจเช•เชถเชพ เชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชตเชšเชจ เชฎเซเชœเชฌ, เช…เชนเซ€เช‚ เชเชตเชพ เชตเชพเชšเช•เซ‹ เชฎเชพเชŸเซ‡ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡ เช•เซ‡ เชœเซ‡เช“ เชฎเชฆเชฆ เชตเช—เชฐ เชจเช•เชถเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซ‹ เช…เชจเซ‡ เชฒเซ‹เชก เช•เชฐเชตเชพ เชคเซ‡ เชœเชพเชฃเชตเชพ เชฎเชพเช—เซ‡ เช›เซ‡. libbpf. เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชเชตเชพ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เชนเซ‹เชต เช•เซ‡ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชจ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹, เช…เชฅเชตเชพ เชฆเชฐเซ‡เช• เชฅเซ‹เชกเซ€ เชฌเชšเชค เช•เชฐเซ€ เชถเช•เซ‹, เช…เชฅเชตเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เซ€ เชถเช•เซ‹ เชคเซเชฏเชพเชฐเซ‡ เช† เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡. ply, เชœเซ‡ เชซเซเชฒเชพเชฏ เชชเชฐ BPF เชฌเชพเชˆเชจเชฐเซ€ เช•เซ‹เชก เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡.

เชคเชฐเซเช•เชจเซ‡ เช…เชจเซเชธเชฐเชตเชพเชจเซเช‚ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เช† เชนเซ‡เชคเซเช“ เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ€เชถเซเช‚ xdp-simple. เช† เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚ เชšเชฐเซเชšเชพ เช•เชฐเซ‡เชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เชธเช‚เชชเซ‚เชฐเซเชฃ เช…เชจเซ‡ เชฅเซ‹เชกเซ‹ เชตเชฟเชธเซเชคเซƒเชค เช•เซ‹เชก เช†เชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เชญเชพเชตเชพเชฐเซเชฅ.

เช…เชฎเชพเชฐเซ€ เช…เชฐเชœเซ€เชจเซ‹ เชคเชฐเซเช• เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡:

  • เชเช• เชชเซเชฐเช•เชพเชฐเชจเซ‹ เชจเช•เชถเซ‹ เชฌเชจเชพเชตเซ‹ BPF_MAP_TYPE_ARRAY เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ BPF_MAP_CREATE,
  • เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฌเชจเชพเชตเซ‹ เชœเซ‡ เช† เชจเช•เชถเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡,
  • เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชฅเซ€ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ‹ lo,

เชœเซ‡ เชฎเชพเชจเชตเชฎเชพเช‚ เชญเชพเชทเชพเช‚เชคเชฐ เช•เชฐเซ‡ เช›เซ‡

int main(void)
{
    int map_fd, prog_fd;

    map_fd = map_create();
    if (map_fd < 0)
        err(1, "bpf: BPF_MAP_CREATE");

    prog_fd = prog_load(map_fd);
    if (prog_fd < 0)
        err(1, "bpf: BPF_PROG_LOAD");

    xdp_attach(1, prog_fd);
}

เชคเซ‡ map_create เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชตเชฟเชถเซ‡ เช†เชชเชฃเซ‡ เชชเซเชฐเชฅเชฎ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚ เช•เชฐเซเชฏเซเช‚ เชคเซ‡ เชœ เชฐเซ€เชคเซ‡ เชจเช•เชถเซ‹ เชฌเชจเชพเชตเซ‡ เช›เซ‡ bpf - โ€œเช•เชฐเซเชจเชฒ, เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชฎเชจเซ‡ 8 เชคเชคเซเชตเซ‹เชจเซ€ เชเชฐเซ‡เชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชจเชตเซ‹ เชจเช•เชถเซ‹ เชฌเชจเชพเชตเซ‹ __u64 เช…เชจเซ‡ เชฎเชจเซ‡ เชซเชพเชˆเชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชชเชพเช›เซเช‚ เช†เชชเซ‹":

static int map_create()
{
    union bpf_attr attr;

    memset(&attr, 0, sizeof(attr));
    attr.map_type = BPF_MAP_TYPE_ARRAY,
    attr.key_size = sizeof(__u32),
    attr.value_size = sizeof(__u64),
    attr.max_entries = 8,
    strncpy(attr.map_name, "woo", sizeof(attr.map_name));
    return syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
}

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฃ เชธเชฐเชณ เช›เซ‡:

static int prog_load(int map_fd)
{
    union bpf_attr attr;
    struct bpf_insn insns[] = {
        ...
    };

    memset(&attr, 0, sizeof(attr));
    attr.prog_type = BPF_PROG_TYPE_XDP;
    attr.insns     = ptr_to_u64(insns);
    attr.insn_cnt  = sizeof(insns)/sizeof(insns[0]);
    attr.license   = ptr_to_u64("GPL");
    strncpy(attr.prog_name, "woo", sizeof(attr.prog_name));
    return syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
}

เชฎเซเชถเซเช•เซ‡เชฒ เชญเชพเช— prog_load เชฎเชพเชณเช–เชพเช“เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€ เชคเชฐเซ€เช•เซ‡ เช…เชฎเชพเชฐเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ€ เชตเซเชฏเชพเช–เซเชฏเชพ เช›เซ‡ struct bpf_insn insns[]. เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ C เชฎเชพเช‚ เช›เซ‡ เชคเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เชนเซ‹เชตเชพเชฅเซ€, เช…เชฎเซ‡ เชฅเซ‹เชกเซ€ เช›เซ‡เชคเชฐเชชเชฟเช‚เชกเซ€ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช:

$ llvm-objdump -D --section xdp/simple xdp-simple.bpf.o

0000000000000000 <simple>:
       0:       85 00 00 00 08 00 00 00 call 8
       1:       63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
       2:       bf a2 00 00 00 00 00 00 r2 = r10
       3:       07 02 00 00 fc ff ff ff r2 += -4
       4:       18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
       6:       85 00 00 00 01 00 00 00 call 1
       7:       b7 01 00 00 00 00 00 00 r1 = 0
       8:       15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2>
       9:       61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0)
      10:       07 01 00 00 01 00 00 00 r1 += 1
      11:       63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1
      12:       b7 01 00 00 02 00 00 00 r1 = 2

0000000000000068 <LBB0_2>:
      13:       bf 10 00 00 00 00 00 00 r0 = r1
      14:       95 00 00 00 00 00 00 00 exit

เช•เซเชฒ เชฎเชณเซ€เชจเซ‡, เช†เชชเชฃเซ‡ 14 เชธเซ‚เชšเชจเชพเช“ เชœเซ‡เชตเซ€ เชฐเชšเชจเชพเช“เชจเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชฒเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ struct bpf_insn (เชธเชฒเชพเชน: เช‰เชชเชฐเชฅเซ€ เชกเชฎเซเชช เชฒเซ‹, เชธเซ‚เชšเชจเชพ เชตเชฟเชญเชพเช—เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชตเชพเช‚เชšเซ‹, เช–เซ‹เชฒเซ‹ linux/bpf.h ะธ linux/bpf_common.h เช…เชจเซ‡ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‹ struct bpf_insn insns[] เชชเซ‹เชคเชพเชจเชพ เชชเชฐ):

struct bpf_insn insns[] = {
    /* 85 00 00 00 08 00 00 00 call 8 */
    {
        .code = BPF_JMP | BPF_CALL,
        .imm = 8,
    },

    /* 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0 */
    {
        .code = BPF_MEM | BPF_STX,
        .off = -4,
        .src_reg = BPF_REG_0,
        .dst_reg = BPF_REG_10,
    },

    /* bf a2 00 00 00 00 00 00 r2 = r10 */
    {
        .code = BPF_ALU64 | BPF_MOV | BPF_X,
        .src_reg = BPF_REG_10,
        .dst_reg = BPF_REG_2,
    },

    /* 07 02 00 00 fc ff ff ff r2 += -4 */
    {
        .code = BPF_ALU64 | BPF_ADD | BPF_K,
        .dst_reg = BPF_REG_2,
        .imm = -4,
    },

    /* 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll */
    {
        .code = BPF_LD | BPF_DW | BPF_IMM,
        .src_reg = BPF_PSEUDO_MAP_FD,
        .dst_reg = BPF_REG_1,
        .imm = map_fd,
    },
    { }, /* placeholder */

    /* 85 00 00 00 01 00 00 00 call 1 */
    {
        .code = BPF_JMP | BPF_CALL,
        .imm = 1,
    },

    /* b7 01 00 00 00 00 00 00 r1 = 0 */
    {
        .code = BPF_ALU64 | BPF_MOV | BPF_K,
        .dst_reg = BPF_REG_1,
        .imm = 0,
    },

    /* 15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2> */
    {
        .code = BPF_JMP | BPF_JEQ | BPF_K,
        .off = 4,
        .src_reg = BPF_REG_0,
        .imm = 0,
    },

    /* 61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0) */
    {
        .code = BPF_MEM | BPF_LDX,
        .off = 0,
        .src_reg = BPF_REG_0,
        .dst_reg = BPF_REG_1,
    },

    /* 07 01 00 00 01 00 00 00 r1 += 1 */
    {
        .code = BPF_ALU64 | BPF_ADD | BPF_K,
        .dst_reg = BPF_REG_1,
        .imm = 1,
    },

    /* 63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1 */
    {
        .code = BPF_MEM | BPF_STX,
        .src_reg = BPF_REG_1,
        .dst_reg = BPF_REG_0,
    },

    /* b7 01 00 00 02 00 00 00 r1 = 2 */
    {
        .code = BPF_ALU64 | BPF_MOV | BPF_K,
        .dst_reg = BPF_REG_1,
        .imm = 2,
    },

    /* <LBB0_2>: bf 10 00 00 00 00 00 00 r0 = r1 */
    {
        .code = BPF_ALU64 | BPF_MOV | BPF_X,
        .src_reg = BPF_REG_1,
        .dst_reg = BPF_REG_0,
    },

    /* 95 00 00 00 00 00 00 00 exit */
    {
        .code = BPF_JMP | BPF_EXIT
    },
};

เชœเซ‡เชฎเชฃเซ‡ เช† เชœเชพเชคเซ‡ เชฒเช–เซเชฏเซเช‚ เชจเชฅเซ€ เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡ เชเช• เช•เชตเชพเชฏเชค - เชถเซ‹เชงเซ‹ map_fd.

เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เชเช• เชตเชงเซ เช…เชชเซเชฐเช—เชŸ เชญเชพเช— เชฌเชพเช•เซ€ เช›เซ‡ - xdp_attach. เช•เชฎเชจเชธเซ€เชฌเซ‡, XDP เชœเซ‡เชตเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ€ เชถเช•เชพเชคเชพ เชจเชฅเซ€ bpf. เชœเซ‡ เชฒเซ‹เช•เซ‹ BPF เช…เชจเซ‡ XDP เชฌเชจเชพเชตเชคเชพ เชนเชคเชพ เชคเซ‡เช“ เช“เชจเชฒเชพเชˆเชจ Linux เชธเชฎเซเชฆเชพเชฏเชฎเชพเช‚เชฅเซ€ เชนเชคเชพ, เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡ เช•เซ‡ เชคเซ‡เช“ เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡ เชธเซŒเชฅเซ€ เชตเชงเซ เชชเชฐเชฟเชšเชฟเชค เชนเชคเชพ (เชชเชฐเช‚เชคเซ เชจเชนเซ€เช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฒเซ‹เช•เซ‹) เช•เชฐเซเชจเชฒ เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ: เชจเซ‡เชŸเชฒเชฟเช‚เช• เชธเซ‹เช•เซ‡เชŸเซเชธ, เช† เชชเชฃ เชœเซเช“ เช†เชฐเชเชซเชธเซ€ 3549. เช…เชฎเชฒ เช•เชฐเชตเชพเชจเซ€ เชธเซŒเชฅเซ€ เชธเชฐเชณ เชฐเซ€เชค xdp_attach เชฅเซ€ เช•เซ‹เชก เช•เซ‹เชชเซ€ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡ libbpf, เชเชŸเชฒเซ‡ เช•เซ‡, เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ netlink.c, เชœเซ‡ เช…เชฎเซ‡ เช•เชฐเซเชฏเซเช‚ เช›เซ‡, เชคเซ‡เชจเซ‡ เชฅเซ‹เชกเซเช‚ เชŸเซ‚เช‚เช•เซเช‚ เช•เชฐเซ€เชจเซ‡:

เชจเซ‡เชŸเชฒเชฟเช‚เช• เชธเซ‹เช•เซ‡เชŸเซเชธเชจเซ€ เชฆเซเชจเชฟเชฏเชพเชฎเชพเช‚ เช†เชชเชจเซเช‚ เชธเซเชตเชพเช—เชค เช›เซ‡

เชจเซ‡เชŸเชฒเชฟเช‚เช• เชธเซ‹เช•เซ‡เชŸ เชชเซเชฐเช•เชพเชฐ เช–เซ‹เชฒเซ‹ NETLINK_ROUTE:

int netlink_open(__u32 *nl_pid)
{
    struct sockaddr_nl sa;
    socklen_t addrlen;
    int one = 1, ret;
    int sock;

    memset(&sa, 0, sizeof(sa));
    sa.nl_family = AF_NETLINK;

    sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    if (sock < 0)
        err(1, "socket");

    if (setsockopt(sock, SOL_NETLINK, NETLINK_EXT_ACK, &one, sizeof(one)) < 0)
        warnx("netlink error reporting not supported");

    if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0)
        err(1, "bind");

    addrlen = sizeof(sa);
    if (getsockname(sock, (struct sockaddr *)&sa, &addrlen) < 0)
        err(1, "getsockname");

    *nl_pid = sa.nl_pid;
    return sock;
}

เช…เชฎเซ‡ เช† เชธเซ‹เช•เซ‡เชŸเชฎเชพเช‚เชฅเซ€ เชตเชพเช‚เชšเซ€เช เช›เซ€เช:

static int bpf_netlink_recv(int sock, __u32 nl_pid, int seq)
{
    bool multipart = true;
    struct nlmsgerr *errm;
    struct nlmsghdr *nh;
    char buf[4096];
    int len, ret;

    while (multipart) {
        multipart = false;
        len = recv(sock, buf, sizeof(buf), 0);
        if (len < 0)
            err(1, "recv");

        if (len == 0)
            break;

        for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, len);
                nh = NLMSG_NEXT(nh, len)) {
            if (nh->nlmsg_pid != nl_pid)
                errx(1, "wrong pid");
            if (nh->nlmsg_seq != seq)
                errx(1, "INVSEQ");
            if (nh->nlmsg_flags & NLM_F_MULTI)
                multipart = true;
            switch (nh->nlmsg_type) {
                case NLMSG_ERROR:
                    errm = (struct nlmsgerr *)NLMSG_DATA(nh);
                    if (!errm->error)
                        continue;
                    ret = errm->error;
                    // libbpf_nla_dump_errormsg(nh); too many code to copy...
                    goto done;
                case NLMSG_DONE:
                    return 0;
                default:
                    break;
            }
        }
    }
    ret = 0;
done:
    return ret;
}

เช›เซ‡เชฒเซเชฒเซ‡, เช…เชนเซ€เช‚ เช…เชฎเชพเชฐเซเช‚ เช•เชพเชฐเซเชฏ เช›เซ‡ เชœเซ‡ เชธเซ‹เช•เซ‡เชŸ เช–เซ‹เชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชงเชฐเชพเชตเชคเซ‹ เชตเชฟเชถเชฟเชทเซเชŸ เชธเช‚เชฆเซ‡เชถ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡:

static int xdp_attach(int ifindex, int prog_fd)
{
    int sock, seq = 0, ret;
    struct nlattr *nla, *nla_xdp;
    struct {
        struct nlmsghdr  nh;
        struct ifinfomsg ifinfo;
        char             attrbuf[64];
    } req;
    __u32 nl_pid = 0;

    sock = netlink_open(&nl_pid);
    if (sock < 0)
        return sock;

    memset(&req, 0, sizeof(req));
    req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
    req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
    req.nh.nlmsg_type = RTM_SETLINK;
    req.nh.nlmsg_pid = 0;
    req.nh.nlmsg_seq = ++seq;
    req.ifinfo.ifi_family = AF_UNSPEC;
    req.ifinfo.ifi_index = ifindex;

    /* started nested attribute for XDP */
    nla = (struct nlattr *)(((char *)&req)
            + NLMSG_ALIGN(req.nh.nlmsg_len));
    nla->nla_type = NLA_F_NESTED | IFLA_XDP;
    nla->nla_len = NLA_HDRLEN;

    /* add XDP fd */
    nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
    nla_xdp->nla_type = IFLA_XDP_FD;
    nla_xdp->nla_len = NLA_HDRLEN + sizeof(int);
    memcpy((char *)nla_xdp + NLA_HDRLEN, &prog_fd, sizeof(prog_fd));
    nla->nla_len += nla_xdp->nla_len;

    /* if user passed in any flags, add those too */
    __u32 flags = XDP_FLAGS_SKB_MODE;
    nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
    nla_xdp->nla_type = IFLA_XDP_FLAGS;
    nla_xdp->nla_len = NLA_HDRLEN + sizeof(flags);
    memcpy((char *)nla_xdp + NLA_HDRLEN, &flags, sizeof(flags));
    nla->nla_len += nla_xdp->nla_len;

    req.nh.nlmsg_len += NLA_ALIGN(nla->nla_len);

    if (send(sock, &req, req.nh.nlmsg_len, 0) < 0)
        err(1, "send");
    ret = bpf_netlink_recv(sock, nl_pid, seq);

cleanup:
    close(sock);
    return ret;
}

เชคเซ‡เชฅเซ€, เชฌเชงเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เช›เซ‡:

$ cc nolibbpf.c -o nolibbpf
$ sudo strace -e bpf ./nolibbpf
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, map_name="woo", ...}, 72) = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=15, prog_name="woo", ...}, 72) = 4
+++ exited with 0 +++

เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชจเซ‡เช•เซเชŸ เชฅเชฏเซ‹ เช›เซ‡ เช•เซ‡ เชจเชนเซ€เช‚ lo:

$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    prog/xdp id 160

เชšเชพเชฒเซ‹ เชชเชฟเช‚เช—เซเชธ เชฎเซ‹เช•เชฒเซ€เช เช…เชจเซ‡ เชจเช•เชถเซ‹ เชœเซ‹เชˆเช:

$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done
$ sudo bpftool m dump name woo
key: 00 00 00 00  value: 90 01 00 00 00 00 00 00
key: 01 00 00 00  value: 00 00 00 00 00 00 00 00
key: 02 00 00 00  value: 00 00 00 00 00 00 00 00
key: 03 00 00 00  value: 00 00 00 00 00 00 00 00
key: 04 00 00 00  value: 00 00 00 00 00 00 00 00
key: 05 00 00 00  value: 00 00 00 00 00 00 00 00
key: 06 00 00 00  value: 40 b5 00 00 00 00 00 00
key: 07 00 00 00  value: 00 00 00 00 00 00 00 00
Found 8 elements

เชนเซเชฐเซ‡, เชฌเชงเซเช‚ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡. เชจเซ‹เช‚เชง เช•เชฐเซ‹, เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เช…เชฎเชพเชฐเซ‹ เชจเช•เชถเซ‹ เชซเชฐเซ€เชฅเซ€ เชฌเชพเชˆเชŸเชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡. เช† เช เชนเช•เซ€เช•เชคเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช›เซ‡ เช•เซ‡, เชตเชฟเชชเชฐเซ€เชค libbpf เช…เชฎเซ‡ เชชเซเชฐเช•เชพเชฐ เชฎเชพเชนเชฟเชคเซ€ (BTF) เชฒเซ‹เชก เช•เชฐเซ€ เชจเชฅเซ€. เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เช†เช—เชฒเซ€ เชตเช–เชคเซ‡ เช† เชตเชฟเชถเซ‡ เชตเชงเซ เชตเชพเชค เช•เชฐเซ€เชถเซเช‚.

เชตเชฟเช•เชพเชธ เชธเชพเชงเชจเซ‹

เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚, เช…เชฎเซ‡ เชจเซเชฏเซ‚เชจเชคเชฎ BPF เชกเซ‡เชตเชฒเชชเชฐ เชŸเซ‚เชฒเช•เซ€เชŸ เชœเซ‹เชˆเชถเซเช‚.

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช•เชนเซ€เช เชคเซ‹, เชคเชฎเชพเชฐเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชตเชฟเช•เชธเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช–เชพเชธ เช•เช‚เชˆเชชเชฃเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€ - BPF เช•เซ‹เชˆเชชเชฃ เชฏเซ‹เช—เซเชฏ เชตเชฟเชคเชฐเชฃ เช•เชฐเซเชจเชฒ เชชเชฐ เชšเชพเชฒเซ‡ เช›เซ‡, เช…เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ clang, เชœเซ‡ เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚เชฅเซ€ เชธเชชเซเชฒเชพเชฏ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชœเซ‹ เช•เซ‡, BPF เชตเชฟเช•เชพเชธ เชนเซ‡เช เชณ เช›เซ‡ เชคเซ‡ เชนเช•เซ€เช•เชคเชจเซ‡ เช•เชพเชฐเชฃเซ‡, เช•เชฐเซเชจเชฒ เช…เชจเซ‡ เชŸเซ‚เชฒเซเชธ เชธเชคเชค เชฌเชฆเชฒเชพเชคเชพ เชฐเชนเซ‡ เช›เซ‡, เชœเซ‹ เชคเชฎเซ‡ 2019 เชฅเซ€ เชœเซ‚เชจเชพ เชœเชฎเชพเชจเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชฒเช–เชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจเชฅเซ€, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡.

  • llvm/clang
  • pahole
  • เชคเซ‡เชจเซ‹ เชฎเซเช–เซเชฏ เชญเชพเช—
  • bpftool

(เชธเช‚เชฆเชฐเซเชญ เชฎเชพเชŸเซ‡, เช† เชตเชฟเชญเชพเช— เช…เชจเซ‡ เชฒเซ‡เช–เชจเชพ เชคเชฎเชพเชฎ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เชกเซ‡เชฌเชฟเชฏเชจ 10 เชชเชฐ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ.)

llvm/clang

BPF LLVM เชธเชพเชฅเซ‡ เชฎเซˆเชคเซเชฐเซ€เชชเซ‚เชฐเซเชฃ เช›เซ‡ เช…เชจเซ‡, เชœเซ‹ เช•เซ‡ เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ BPF เชฎเชพเชŸเซ‡เชจเชพ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹ gcc เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเช‚เช•เชฒเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชคเชฎเชพเชฎ เชตเชฐเซเชคเชฎเชพเชจ เชตเชฟเช•เชพเชธ เชเชฒเชเชฒเชตเซ€เชเชฎ เชฎเชพเชŸเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€, เชธเซŒ เชชเซเชฐเชฅเชฎ, เช…เชฎเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชธเช‚เชธเซเช•เชฐเชฃ เชฌเชจเชพเชตเซ€เชถเซเช‚ clang เช—เชฟเชŸเชฎเชพเช‚เชฅเซ€:

$ sudo apt install ninja-build
$ git clone --depth 1 https://github.com/llvm/llvm-project.git
$ mkdir -p llvm-project/llvm/build/install
$ cd llvm-project/llvm/build
$ cmake .. -G "Ninja" -DLLVM_TARGETS_TO_BUILD="BPF;X86" 
                      -DLLVM_ENABLE_PROJECTS="clang" 
                      -DBUILD_SHARED_LIBS=OFF 
                      -DCMAKE_BUILD_TYPE=Release 
                      -DLLVM_BUILD_RUNTIME=OFF
$ time ninja
... ะผะฝะพะณะพ ะฒั€ะตะผะตะฝะธ ัะฟัƒัั‚ั
$

เชนเชตเซ‡ เช†เชชเชฃเซ‡ เชšเช•เชพเชธเซ€ เชถเช•เซ€เช เช›เซ€เช เช•เซ‡ เชฌเชงเซเช‚ เชฌเชฐเชพเชฌเชฐ เชเช•เชธเชพเชฅเซ‡ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ:

$ ./bin/llc --version
LLVM (http://llvm.org/):
  LLVM version 11.0.0git
  Optimized build.
  Default target: x86_64-unknown-linux-gnu
  Host CPU: znver1

  Registered Targets:
    bpf    - BPF (host endian)
    bpfeb  - BPF (big endian)
    bpfel  - BPF (little endian)
    x86    - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64

(เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชธเซ‚เชšเชจเชพเช“ clang เชฎเชพเชฐเชพ เชฆเซเชตเชพเชฐเชพ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เช›เซ‡ bpf_devel_QA.)

เช…เชฎเซ‡ เชนเชฎเชฃเชพเช‚ เชœ เชฌเชจเชพเชตเซ‡เชฒเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€เชถเซเช‚ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡ เชซเช•เซเชค เชคเซ‡เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ‹ PATH, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡:

export PATH="`pwd`/bin:$PATH"

(เช†เชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ .bashrc เช…เชฅเชตเชพ เช…เชฒเช— เชซเชพเช‡เชฒเชฎเชพเช‚. เช…เช‚เช—เชค เชฐเซ€เชคเซ‡, เชนเซเช‚ เช†เชจเชพ เชœเซ‡เชตเซ€ เชตเชธเซเชคเซเช“ เช‰เชฎเซ‡เชฐเซเช‚ เช›เซเช‚ ~/bin/activate-llvm.sh เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชนเซเช‚ เชคเซ‡ เช•เชฐเซเช‚ เช›เซเช‚ . activate-llvm.sh.)

Pahole เช…เชจเซ‡ BTF

เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ pahole BTF เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชกเซ€เชฌเช—เซ€เช‚เช— เชฎเชพเชนเชฟเชคเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซเชจเชฒ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡. เช…เชฎเซ‡ เช† เชฒเซ‡เช–เชฎเชพเช‚ BTF เชคเช•เชจเซ€เช•เชจเซ€ เชตเชฟเช—เชคเซ‹ เชตเชฟเชถเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชœเชˆเชถเซเช‚ เชจเชนเซ€เช‚, เชคเซ‡ เชนเช•เซ€เช•เชค เชธเชฟเชตเชพเชฏ เช•เซ‡ เชคเซ‡ เช…เชจเซเช•เซ‚เชณ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช. เชคเซ‡เชฅเซ€ เชœเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเซ€ เช•เชฐเซเชจเชฒ เชฌเชจเชพเชตเชตเชพ เชœเชˆ เชฐเชนเซเชฏเชพ เช›เซ‹, เชคเซ‹ เชชเชนเซ‡เชฒเชพ เชฌเชจเชพเชตเซ‹ pahole (เชตเช—เชฐ pahole เชคเชฎเซ‡ เชตเชฟเช•เชฒเซเชช เชธเชพเชฅเซ‡ เช•เชฐเซเชจเชฒ เชฌเชจเชพเชตเซ€ เชถเช•เชถเซ‹ เชจเชนเซ€เช‚ CONFIG_DEBUG_INFO_BTF:

$ git clone https://git.kernel.org/pub/scm/devel/pahole/pahole.git
$ cd pahole/
$ sudo apt install cmake
$ mkdir build
$ cd build/
$ cmake -D__LIB=lib ..
$ make
$ sudo make install
$ which pahole
/usr/local/bin/pahole

BPF เชธเชพเชฅเซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซเชจเชฒเซเชธ

BPF เชจเซ€ เชถเช•เซเชฏเชคเชพเช“ เชถเซ‹เชงเชคเซ€ เชตเช–เชคเซ‡, เชนเซเช‚ เชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เช•เซ‹เชฐ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช•เชนเซ€เช เชคเซ‹, เช† เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชคเชฎเซ‡ เชตเชฟเชคเชฐเชฃ เช•เชฐเซเชจเชฒ เชชเชฐ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เช•เชฎเซเชชเชพเช‡เชฒ เช…เชจเซ‡ เชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เชถเซ‹, เชœเซ‹ เช•เซ‡, เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ เช•เชฐเซเชจเชฒ เชฐเชพเช–เชตเชพเชฅเซ€ เชคเชฎเซ‡ เชจเชตเซ€เชจเชคเชฎ BPF เชธเซเชตเชฟเชงเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชถเซ‹, เชœเซ‡ เชคเชฎเชพเชฐเชพ เชตเชฟเชคเชฐเชฃเชฎเชพเช‚ เชฎเชนเชฟเชจเชพเชฎเชพเช‚ เชถเซเชฐเซ‡เชทเซเช  เชฐเซ€เชคเซ‡ เชฆเซ‡เช–เชพเชถเซ‡. , เช…เชฅเชตเชพ, เช•เซ‡เชŸเชฒเชพเช• เชกเชฟเชฌเช—เซ€เช‚เช— เชŸเซ‚เชฒเซเชธเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชจเชœเซ€เช•เชจเชพ เชญเชตเชฟเชทเซเชฏเชฎเชพเช‚ เชฌเชฟเชฒเช•เซเชฒ เชชเซ‡เช•เซ‡เชœ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚. เช‰เชชเชฐเชพเช‚เชค, เชคเซ‡เชจเซ‹ เชชเซ‹เชคเชพเชจเซ‹ เช•เซ‹เชฐ เช•เซ‹เชก เชธเชพเชฅเซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชฒเชพเช—เซ‡ เช›เซ‡.

เช•เชฐเซเชจเชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชชเซเชฐเชฅเชฎ, เช•เชฐเซเชจเชฒ เชชเซ‹เชคเซ‡, เช…เชจเซ‡ เชฌเซ€เชœเซเช‚, เช•เชฐเซเชจเชฒ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. BPF เชธเชพเชฅเซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เชธเชพเชฎเชพเชจเซเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช เชตเซ‡เชจเซ€เชฒเชพ เช•เชฐเซเชจเชฒ เช…เชฅเชตเชพ เชตเชฟเช•เชพเชธ เช•เชฐเซเชจเชฒเชฎเชพเช‚เชฅเซ€ เชเช•. เชเชคเชฟเชนเชพเชธเชฟเช• เชฐเซ€เชคเซ‡, BPF เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ Linux เชจเซ‡เชŸเชตเชฐเซเช•เชฟเช‚เช— เชธเชฎเซเชฆเชพเชฏเชฎเชพเช‚ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชฌเชงเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชตเชนเซ‡เชฒเชพ เช•เซ‡ เชชเช›เซ€ เชฒเชฟเชจเช•เซเชธ เชจเซ‡เชŸเชตเชฐเซเช•เชฟเช‚เช— เชœเชพเชณเชตเชฃเซ€เช•เชพเชฐ เชกเซ‡เชตเชฟเชก เชฎเชฟเชฒเชฐ เชฆเซเชตเชพเชฐเชพ เชฅเชพเชฏ เช›เซ‡. เชคเซ‡เชฎเชจเชพ เชธเซเชตเชญเชพเชตเชจเชพ เช†เชงเชพเชฐเซ‡ - เชธเช‚เชชเชพเชฆเชจเซ‹ เช…เชฅเชตเชพ เชจเชตเซ€ เชธเซเชตเชฟเชงเชพเช“ - เชจเซ‡เชŸเชตเชฐเซเช• เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชฌเซ‡เชฎเชพเช‚เชฅเซ€ เชเช•เชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ - net เช…เชฅเชตเชพ net-next. BPF เชฎเชพเชŸเซ‡เชจเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชตเชšเซเชšเซ‡ เชธเชฎเชพเชจ เชฐเซ€เชคเซ‡ เชตเชนเซ‡เช‚เชšเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ bpf ะธ bpf-next, เชœเซ‡ เชชเช›เซ€ เช…เชจเซเช•เซเชฐเชฎเซ‡ เชจเซ‡เชŸ เช…เชจเซ‡ เชจเซ‡เช•เซเชธเซเชŸ-เชจเซ‡เช•เซเชธเซเชŸเชฎเชพเช‚ เชชเซ‚เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชตเชงเซ เชตเชฟเช—เชคเซ‹ เชฎเชพเชŸเซ‡, เชœเซเช“ bpf_devel_QA ะธ netdev-FAQ. เชคเซ‡เชฅเซ€ เชคเชฎเชพเชฐเชพ เชธเซเชตเชพเชฆ เช…เชจเซ‡ เชคเชฎเซ‡ เชœเซ‡ เชธเชฟเชธเซเชŸเชฎเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‹ เชคเซ‡เชจเซ€ เชธเซเชฅเชฟเชฐเชคเชพ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹เชจเซ‡ เช†เชงเชพเชฐเซ‡ เช•เชฐเซเชจเชฒ เชชเชธเช‚เชฆ เช•เชฐเซ‹ (*-next เช•เชฐเซเชจเชฒเซ‹ เชธเซ‚เชšเชฟเชฌเชฆเซเชง เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชธเซŒเชฅเซ€ เช…เชธเซเชฅเชฟเชฐ เช›เซ‡).

เช•เชฐเซเชจเชฒ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเซ‹เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚ เชคเซ‡ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเซ€ เช† เชฒเซ‡เช–เชจเชพ เช…เชตเช•เชพเชถเชจเซ€ เชฌเชนเชพเชฐ เช›เซ‡ - เชเชตเซเช‚ เชฎเชพเชจเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เซ‡ เชคเชฎเซ‡ เช† เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚ เชคเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชœเชพเชฃเซ‹ เช›เซ‹, เช…เชฅเชตเชพ เชถเซ€เช–เชตเชพ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เชชเซ‹เชคเชพเชจเชพ เชชเชฐ. เชœเซ‹ เช•เซ‡, เชจเซ€เชšเซ‡เชจเซ€ เชธเซ‚เชšเชจเชพเช“ เชคเชฎเชจเซ‡ เช•เชพเชฐเซเชฏเชฐเชค BPF-เชธเช•เซเชทเชฎ เชธเชฟเชธเซเชŸเชฎ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเซเชฏเชพเชชเซเชค เช…เชฅเชตเชพ เช“เช›เซ€ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช.

เช‰เชชเชฐเซ‹เช•เซเชค เช•เชฐเซเชจเชฒเซ‹เชฎเชพเช‚เชฅเซ€ เชเช• เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‹:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
$ cd bpf-next

เชจเซเชฏเซ‚เชจเชคเชฎ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เช•เชฐเซเชจเชฒ เชฐเซ‚เชชเชฐเซ‡เช–เชพ เชฌเชจเชพเชตเซ‹:

$ cp /boot/config-`uname -r` .config
$ make localmodconfig

เชซเชพเช‡เชฒเชฎเชพเช‚ BPF เชตเชฟเช•เชฒเซเชชเซ‹ เชธเช•เซเชทเชฎ เช•เชฐเซ‹ .config เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ เชชเชธเช‚เชฆเช—เซ€ (เชฎเซ‹เชŸเชพ เชญเชพเช—เซ‡ CONFIG_BPF เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชธเช•เซเชทเชฎ เชนเชถเซ‡ เช•เชพเชฐเชฃ เช•เซ‡ systemd เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡). เช† เชฒเซ‡เช– เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ เช•เชฐเซเชจเชฒเชฎเชพเช‚เชฅเซ€ เชตเชฟเช•เชฒเซเชชเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เช…เชนเซ€เช‚ เช›เซ‡:

CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_LSM=y
CONFIG_BPF_SYSCALL=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_IPV6_SEG6_BPF=y
# CONFIG_NETFILTER_XT_MATCH_BPF is not set
# CONFIG_BPFILTER is not set
CONFIG_NET_CLS_BPF=y
CONFIG_NET_ACT_BPF=y
CONFIG_BPF_JIT=y
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_BPF_KPROBE_OVERRIDE=y
CONFIG_DEBUG_INFO_BTF=y

เชชเช›เซ€ เช†เชชเชฃเซ‡ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เช…เชจเซ‡ เช•เชฐเซเชจเชฒเชจเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เชเชธเซ‡เชฎเซเชฌเชฒ เช…เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช (เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เชคเชฎเซ‡ เชจเชตเชพ เชเชธเซ‡เชฎเซเชฌเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเซเชจเชฒเชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. clangเช‰เชฎเซ‡เชฐเซ€เชจเซ‡ CC=clang):

$ make -s -j $(getconf _NPROCESSORS_ONLN)
$ sudo make modules_install
$ sudo make install

เช…เชจเซ‡ เชจเชตเชพ เช•เชฐเซเชจเชฒ เชธเชพเชฅเซ‡ เชฐเซ€เชฌเซ‚เชŸ เช•เชฐเซ‹ (เชนเซเช‚ เช† เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚ kexec เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚เชฅเซ€ kexec-tools):

v=5.8.0-rc6+ # ะตัะปะธ ะฒั‹ ะฟะตั€ะตัะพะฑะธั€ะฐะตั‚ะต ั‚ะตะบัƒั‰ะตะต ัะดั€ะพ, ั‚ะพ ะผะพะถะฝะพ ะดะตะปะฐั‚ัŒ v=`uname -r`
sudo kexec -l -t bzImage /boot/vmlinuz-$v --initrd=/boot/initrd.img-$v --reuse-cmdline &&
sudo kexec -e

bpftool

เชฒเซ‡เช–เชฎเชพเช‚ เชธเซŒเชฅเซ€ เชตเชงเซ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเซ€ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ เชนเชถเซ‡ bpftool, Linux เช•เชฐเซเชจเชฒเชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡ เชชเซ‚เชฐเซเช‚ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡ BPF เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ BPF เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชฆเซเชตเชพเชฐเชพ เชฒเช–เชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เชœเชพเชณเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชคเชฎเชพเชฎ เชชเซเชฐเช•เชพเชฐเชจเชพ BPF เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ - เชฒเซ‹เชก เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ, เชจเช•เชถเชพ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชธเช‚เชชเชพเชฆเชฟเชค เช•เชฐเชตเชพ, BPF เช‡เช•เซ‹เชธเชฟเชธเซเชŸเชฎเชจเชพ เชœเซ€เชตเชจเชจเซเช‚ เช…เชจเซเชตเซ‡เชทเชฃ เช•เชฐเชตเชพ เชตเช—เซ‡เชฐเซ‡ เชฎเชพเชŸเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชฎเซ‡เชจ เชชเซ‡เชœ เชฎเชพเชŸเซ‡ เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชกเชจเชพ เชฐเซ‚เชชเชฎเชพเช‚ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เช•เซ‹เชฐ เชฎเชพเช‚ เช…เชฅเชตเชพ, เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชธเช‚เช•เชฒเชฟเชค, เชจเซ‡เชŸ เชชเชฐ.

เช† เชฒเซ‡เช–เชจ เชธเชฎเชฏเซ‡ bpftool เชซเช•เซเชค RHEL, Fedora เช…เชจเซ‡ Ubuntu เชฎเชพเชŸเซ‡ เชœ เชคเซˆเชฏเชพเชฐ เช†เชตเซ‡ เช›เซ‡ (เชœเซเช“, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช† เชฅเซเชฐเซ‡เชก, เชœเซ‡ เชชเซ‡เช•เซ‡เชœเซ€เช‚เช—เชจเซ€ เช…เชงเซ‚เชฐเซ€ เชตเชพเชฐเซเชคเชพ เช•เชนเซ‡ เช›เซ‡ bpftool เชกเซ‡เชฌเชฟเชฏเชจเชฎเชพเช‚). เชชเชฐเช‚เชคเซ เชœเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเซ€ เช•เชฐเซเชจเชฒ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฌเชจเชพเชตเซ€ เช›เซ‡, เชคเซ‹ เชชเช›เซ€ เชฌเชจเชพเชตเซ‹ bpftool เชชเชพเช‡ เชœเซ‡เชŸเชฒเซเช‚ เชธเชฐเชณ:

$ cd ${linux}/tools/bpf/bpftool
# ... ะฟั€ะพะฟะธัˆะธั‚ะต ะฟัƒั‚ะธ ะบ ะฟะพัะปะตะดะฝะตะผัƒ clang, ะบะฐะบ ั€ะฐััะบะฐะทะฐะฝะพ ะฒั‹ัˆะต
$ make -s

Auto-detecting system features:
...                        libbfd: [ on  ]
...        disassembler-four-args: [ on  ]
...                          zlib: [ on  ]
...                        libcap: [ on  ]
...               clang-bpf-co-re: [ on  ]

Auto-detecting system features:
...                        libelf: [ on  ]
...                          zlib: [ on  ]
...                           bpf: [ on  ]

$

(เช…เชนเซ€เช‚ ${linux} - เช† เชคเชฎเชพเชฐเซ€ เช•เชฐเซเชจเชฒ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เช›เซ‡.) เช† เช†เชฆเซ‡เชถเซ‹ เชšเชฒเชพเชตเซเชฏเชพ เชชเช›เซ€ bpftool เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ ${linux}/tools/bpf/bpftool เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเชพเชฅเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ (เชธเซŒ เชชเซเชฐเชฅเชฎ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฎเชพเชŸเซ‡ root) เช…เชฅเชตเชพ เชซเช•เซเชค เช•เซ‹เชชเซ€ เช•เชฐเซ‹ /usr/local/sbin.

เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ‹ bpftool เชชเช›เซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชถเซเชฐเซ‡เชทเซเช  เช›เซ‡ clang, เช‰เชชเชฐ เชตเชฐเซเชฃเชตเซเชฏเชพ เชฎเซเชœเชฌ เชเชธเซ‡เชฎเซเชฌเชฒ, เช…เชจเซ‡ เชคเชชเชพเชธเซ‹ เช•เซ‡ เชคเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ - เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡

$ sudo bpftool feature probe kernel
Scanning system configuration...
bpf() syscall for unprivileged users is enabled
JIT compiler is enabled
JIT compiler hardening is disabled
JIT compiler kallsyms exports are enabled for root
...

เชœเซ‡ เชฌเชคเชพเชตเชถเซ‡ เช•เซ‡ เชคเชฎเชพเชฐเชพ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เช•เชˆ BPF เชธเซเชตเชฟเชงเชพเช“ เชธเช•เซเชทเชฎ เช›เซ‡.

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เช…เช—เชพเช‰เชจเชพ เช†เชฆเซ‡เชถ เชคเชฐเซ€เช•เซ‡ เชšเชฒเชพเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡

# bpftool f p k

เช† เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚เชฅเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชธเชพเชฅเซ‡ เชธเชพเชฎเซเชฏเชคเชพ เชฆเซเชตเชพเชฐเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ iproute2, เชœเซเชฏเชพเช‚ เช†เชชเชฃเซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เชนเซ€ เชถเช•เซ€เช ip a s eth0 ะฒะผะตัั‚ะพ ip addr show dev eth0.

เชจเชฟเชทเซเช•เชฐเซเชท

BPF เชคเชฎเชจเซ‡ เชšเชพเช‚เชšเชกเชจเซ‡ เช…เชธเชฐเช•เชพเชฐเช• เชฐเซ€เชคเซ‡ เชฎเชพเชชเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซ‡ เชซเซเชฒเชพเชฏเชฎเชพเช‚ เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡. UNIX เชจเซ€ เชถเซเชฐเซ‡เชทเซเช  เชชเชฐเช‚เชชเชฐเชพเช“เชฎเชพเช‚, เชธเชฟเชธเซเชŸเชฎ เช–เซ‚เชฌ เชœ เชธเชซเชณ เชธเชพเชฌเชฟเชค เชฅเชˆ: เชเช• เชธเชฐเชณ เชชเชฆเซเชงเชคเชฟ เชœเซ‡ เชคเชฎเชจเซ‡ เช•เชฐเซเชจเชฒเชจเซ‡ (เชซเชฐเซ€เชฅเซ€) เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เชœเซ‡เชฃเซ‡ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชฒเซ‹เช•เซ‹ เช…เชจเซ‡ เชธเช‚เชธเซเชฅเชพเช“เชจเซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ€. เช…เชจเซ‡, เชคเซ‡เชฎ เช›เชคเชพเช‚, เชชเซเชฐเชฏเซ‹เช—เซ‹, เชคเซ‡เชฎเชœ BPF เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ‹ เชตเชฟเช•เชพเชธ, เชธเชฎเชพเชชเซเชค เชฅเชตเชพเชฅเซ€ เชฆเซ‚เชฐ เช›เซ‡, เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชเช• เชธเซเชฅเชฟเชฐ ABI เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ, เช…เชจเซ‡ เชธเซŒเชฅเซ€ เช…เช—เชคเซเชฏเชจเซเช‚, เช…เชธเชฐเช•เชพเชฐเช• เชตเซเชฏเชตเชธเชพเชฏเชฟเช• เชคเชฐเซเช• เชฌเชจเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชนเซเช‚ เช เชจเซ‹เช‚เชงเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡, เชฎเชพเชฐเชพ เชฎเชคเซ‡, เชคเช•เชจเซ€เช• เชเชŸเชฒเซ€ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เชฌเชจเซ€ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡, เชเช• เชคเชฐเชซ, เชคเซ‡ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เชฐเชฎเชตเชพ เชฎเชพเชŸเซ‡ (เชฎเชถเซ€เชจเชจเซเช‚ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชเช• เชธเชพเช‚เชœเซ‡ เชตเชงเซ เช•เซ‡ เช“เช›เซเช‚ เชธเชฎเชœเซ€ เชถเช•เชพเชฏ เช›เซ‡), เช…เชจเซ‡ เชฌเซ€เชœเซ€ เชฌเชพเชœเซ, เชคเซ‡เชจเชพ เชฆเซ‡เช–เชพเชต เชชเชนเซ‡เชฒเชพเช‚ (เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡) เชนเชฒ เชจ เชฅเชˆ เชถเช•เซ‡ เชคเซ‡เชตเซ€ เชธเชฎเชธเซเชฏเชพเช“ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡. เช† เชฌเซ‡ เช˜เชŸเช•เซ‹ เชเช•เชธเชพเชฅเซ‡ เชฒเซ‹เช•เซ‹เชจเซ‡ เชชเซเชฐเชฏเซ‹เช— เช…เชจเซ‡ เชธเซเชตเชชเซเชจ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชฆเชฌเชพเชฃ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡ เชตเชงเซเชจเซ‡ เชตเชงเซ เชจเชตเซ€เชจ เช‰เช•เซ‡เชฒเซ‹เชจเชพ เช‰เชฆเชญเชต เชคเชฐเชซ เชฆเซ‹เชฐเซ€ เชœเชพเชฏ เช›เซ‡.

เช† เชฒเซ‡เช–, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชŸเซ‚เช‚เช•เซ‹ เชจ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชฎเชพเชคเซเชฐ BPF เชจเซ€ เชฆเซเชจเชฟเชฏเชพเชจเซ‹ เชชเชฐเชฟเชšเชฏ เช›เซ‡ เช…เชจเซ‡ "เช…เชฆเซเชฏเชคเชจ" เชธเซเชตเชฟเชงเชพเช“ เช…เชจเซ‡ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชจเชพ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชญเชพเช—เซ‹เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชคเซเช‚ เชจเชฅเซ€. เช†เช—เชณเชจเซ€ เชฏเซ‹เชœเชจเชพ เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซ€ เช›เซ‡: เช†เช—เชณเชจเซ‹ เชฒเซ‡เช– BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเซเชฐเช•เชพเชฐเซ‹เชจเซเช‚ เชตเชฟเชนเช‚เช—เชพเชตเชฒเซ‹เช•เชจ เชนเชถเซ‡ (5.8 เช•เชฐเซเชจเชฒเชฎเชพเช‚ 30 เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเซเชฐเช•เชพเชฐเซ‹ เชธเชชเซ‹เชฐเซเชŸเซ‡เชก เช›เซ‡), เชชเช›เซ€ เช†เชชเชฃเซ‡ เช†เช–เชฐเซ‡ เช•เชฐเซเชจเชฒ เชŸเซเชฐเซ‡เชธเชฟเช‚เช— เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชพเชธเซเชคเชตเชฟเช• BPF เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซ€ เชคเซ‡ เชœเซ‹เชˆเชถเซเช‚. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชนเชตเซ‡ BPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชชเชฐ เชตเชงเซ เชŠเช‚เชกเชพเชฃเชชเซ‚เชฐเซเชตเช•เชจเชพ เช…เชญเซเชฏเชพเชธเช•เซเชฐเชฎ เชฎเชพเชŸเซ‡เชจเซ‹ เชธเชฎเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเชฌเชพเชฆ BPF เชจเซ‡เชŸเชตเชฐเซเช•เชฟเช‚เช— เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹.

เช† เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚ เช…เช—เชพเช‰เชจเชพ เชฒเซ‡เช–เซ‹

  1. เชจเชพเชจเชพเช“ เชฎเชพเชŸเซ‡ BPF, เชญเชพเช— เชถเซ‚เชจเซเชฏ: เช•เซเชฒเชพเชธเชฟเช• BPF

เชฒเชฟเช‚เช•เซเชธ

  1. BPF เช…เชจเซ‡ XDP เชธเช‚เชฆเชฐเซเชญ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ - เชธเซ€เชฒเชฟเชฏเชฎเชฎเชพเช‚เชฅเซ€ BPF เชชเชฐ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ, เช…เชฅเชตเชพ เชตเชงเซ เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡ เชกเซ‡เชจเชฟเชฏเชฒ เชฌเซ‹เชฐเซเช•เชฎเซ‡เชจ เชชเชพเชธเซ‡เชฅเซ€, เชœเซ‡ BPF เชจเชพ เชธเชฐเซเชœเช•เซ‹ เช…เชจเซ‡ เชœเชพเชณเชตเชฃเซ€ เช•เชฐเชจเชพเชฐเชพเช“เชฎเชพเช‚เชจเชพ เชเช• เช›เซ‡. เช† เชชเซเชฐเชฅเชฎ เช—เช‚เชญเซ€เชฐ เชตเชฐเซเชฃเชจเซ‹เชฎเชพเช‚เชจเซเช‚ เชเช• เช›เซ‡, เชœเซ‡ เช…เชจเซเชฏ เชฒเซ‹เช•เซ‹เชฅเซ€ เช…เชฒเช— เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชกเซ‡เชจเชฟเชฏเชฒ เชฌเชฐเชพเชฌเชฐ เชœเชพเชฃเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เชถเซเช‚ เชฒเช–เซ€ เชฐเชนเซเชฏเซ‹ เช›เซ‡ เช…เชจเซ‡ เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชญเซ‚เชฒเซ‹ เชจเชฅเซ€. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เช† เชฆเชธเซเชคเชพเชตเซ‡เชœ เชœเชพเชฃเซ€เชคเซ€ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ XDP เช…เชจเซ‡ TC เชชเซเชฐเช•เชพเชฐเชจเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเชตเซเช‚ เชคเซ‡เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡. ip เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚เชฅเซ€ iproute2.

  2. เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ/networking/filter.txt - เช•เซเชฒเชพเชธเชฟเช• เช…เชจเซ‡ เชชเช›เซ€ เชตเชฟเชธเซเชคเซƒเชค BPF เชฎเชพเชŸเซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชธเชพเชฅเซ‡เชจเซ€ เชฎเซ‚เชณ เชซเชพเช‡เชฒ. เชœเซ‹ เชคเชฎเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฒเซ‡เช‚เช—เซเชตเซ‡เชœ เช…เชจเซ‡ เชŸเซ‡เช•เชจเชฟเช•เชฒ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฒ เชตเชฟเช—เชคเซ‹เชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹เชต เชคเซ‹ เชธเชพเชฐเซเช‚ เชตเชพเช‚เชšเชจ.

  3. เชซเซ‡เชธเชฌเซเช• เชชเชฐเชฅเซ€ BPF เชตเชฟเชถเซ‡ เชฌเซเชฒเซ‹เช—. เชคเซ‡ เชญเชพเช—เซเชฏเซ‡ เชœ เช…เชชเชกเซ‡เชŸ เชฅเชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชเชฒเซ‡เช•เซเชธเซ€ เชธเซเชŸเชพเชฐเซ‹เชตเซ‹เช‡เชŸเซ‹เชต (eBPF เชจเชพ เชฒเซ‡เช–เช•) เช…เชจเซ‡ เช†เชจเซเชฆเซเชฐเซ€ เชจเชพเช•เซเชฐเชฟเช•เซ‹ - (เชœเชพเชณเชตเชฃเซ€เช•เชพเชฐ) เชคเซเชฏเชพเช‚ เชฒเช–เซ‡ เช›เซ‡. libbpf).

  4. bpftool เชจเชพ เชฐเชนเชธเซเชฏเซ‹. bpftool เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เช…เชจเซ‡ เชฐเชนเชธเซเชฏเซ‹ เชธเชพเชฅเซ‡ เช•เซเชตเซ‡เชจเซเชŸเชฟเชจ เชฎเซ‹เชจเซ‡เชŸ เชคเชฐเชซเชฅเซ€ เชเช• เชฎเชจเซ‹เชฐเช‚เชœเช• เชŸเซเชตเชฟเชŸเชฐ เชฅเซเชฐเซ‡เชก.

  5. BPF เชฎเชพเช‚ เชกเชพเช‡เชต เช•เชฐเซ‹: เชตเชพเช‚เชšเชจ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ€ เชธเซ‚เชšเชฟ. เช•เซเชตเซ‡เชจเซเชŸเชฟเชจ เชฎเซ‹เชจเซ‡เชŸ เชคเชฐเชซเชฅเซ€ BPF เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃเชจเซ€ เชฒเชฟเช‚เช•เซเชธเชจเซ€ เชตเชฟเชถเชพเชณ (เช…เชจเซ‡ เชนเชœเซ เชชเชฃ เชœเชพเชณเชตเชฃเซ€) เชธเซ‚เชšเชฟ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹