เจ›เฉ‹เจŸเฉ‡ เจฌเฉฑเจšเจฟเจ†เจ‚ เจฒเจˆ BPF, เจญเจพเจ— เจชเจนเจฟเจฒเจพ: เจตเจฟเจธเจคเฉเจฐเจฟเจค BPF

เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจคเจ•เจจเฉ€เจ• เจธเฉ€ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฌเฉ€.เจชเฉ€.เจเจซ. เจ…เจธเฉ€เจ‚ เจ‰เจธ เจตเฉฑเจฒ เจฆเฉ‡เจ–เจฟเจ† เจชเจฟเจ›เจฒเจพ, เจ‡เจธ เจฒเฉœเฉ€ เจฆเฉ‡ เจชเฉเจฐเจพเจฃเฉ‡ เจจเฉ‡เจฎ เจฒเฉ‡เจ–. 2013 เจตเจฟเฉฑเจš, เจ…เจฒเฉˆเจ•เจธเฉ€ เจธเจŸเจพเจฐเฉ‹เจตเฉ‹เจ‡เจŸเฉ‹เจต เจ…เจคเฉ‡ เจกเฉˆเจจเฉ€เจ…เจฒ เจฌเฉ‹เจฐเจ•เจฎเฉˆเจจ เจฆเฉ‡ เจฏเจคเจจเจพเจ‚ เจฆเฉเจ†เจฐเจพ, เจ‡เจธเจฆเจพ เจ‡เฉฑเจ• เจธเฉเจงเจพเจฐเจฟเจ† เจธเฉฐเจธเจ•เจฐเจฃ, เจ†เจงเฉเจจเจฟเจ• 64-เจฌเจฟเฉฑเจŸ เจฎเจธเจผเฉ€เจจเจพเจ‚ เจฒเจˆ เจ…เจจเฉเจ•เฉ‚เจฒเจฟเจค, เจตเจฟเจ•เจธเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ เจ…เจคเฉ‡ เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค เจ‡เจธ เจจเจตเฉ€เจ‚ เจคเจ•เจจเฉ€เจ• เจจเฉ‚เฉฐ เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ BPF เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจธเฉ€, เจซเจฟเจฐ เจ‡เจธเจฆเจพ เจจเจพเจฎ เจเจ•เจธเจŸเฉˆเจ‚เจกเจก BPF เจฐเฉฑเจ–เจฟเจ† เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจนเฉเจฃ, เจ•เจˆ เจธเจพเจฒเจพเจ‚ เจฌเจพเจ…เจฆ, เจนเจฐ เจ•เฉ‹เจˆ เจ‡เจธเจจเฉ‚เฉฐ เจฌเจธ BPF เจ•เจนเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจฎเฉ‹เจŸเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡, BPF เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจ†เจชเจนเฉเจฆเจฐเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเฉเจ†เจฐเจพ เจธเจชเจฒเจพเจˆ เจ•เฉ€เจคเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจจเจตเจพเจ‚ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจ‡เฉฐเจจเจพ เจธเจซเจฒ เจธเจพเจฌเจค เจนเฉ‹เจ‡เจ† เจนเฉˆ เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจฆเจฐเจœเจจ เจนเฉ‹เจฐ เจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€เฅค (เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจšเฉ€เจœเจผ เจœเฉ‹ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจจเฉ‡ เจตเจงเฉ€เจ† เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจนเฉ‡เจ เจพเจ‚ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‡เฉฑเจ• เจตเจงเฉ€เจ† เจฒเฉ‹เจ—เฉ‹ เจฌเจฃเจพเจ‰เจฃเจพ เจธเฉ€เฅค)

เจ‡เจน เจฒเฉ‡เจ– BPF เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฆเฉ€ เจฌเจฃเจคเจฐ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, BPF เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจ•เจฐเจจเจฒ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ, เจตเจฟเจ•เจพเจธ เจธเจพเจงเจจ, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช, เจฌเจนเฉเจค เจธเฉฐเจ–เฉ‡เจช เจธเฉฐเจ–เฉ‡เจช เจœเจพเจฃเจ•เจพเจฐเฉ€, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ. BPF เจฆเฉ‡ เจตเจฟเจนเจพเจฐเจ• เจ•เจพเจฐเจœเจพเจ‚ เจฆเฉ‡ เจกเฉ‚เฉฐเจ˜เฉ‡ เจ…เจงเจฟเจเจจ เจฒเจˆ เจธเจพเจจเฉ‚เฉฐ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจนเจฐ เจšเฉ€เจœเจผ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€เฅค
เจ›เฉ‹เจŸเฉ‡ เจฌเฉฑเจšเจฟเจ†เจ‚ เจฒเจˆ BPF, เจญเจพเจ— เจชเจนเจฟเจฒเจพ: เจตเจฟเจธเจคเฉเจฐเจฟเจค BPF

เจฒเฉ‡เจ– เจฆเจพ เจธเฉฐเจ–เฉ‡เจช

เจฌเฉ€เจชเฉ€เจเจซ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจจเจพเจฒ เจœเจพเจฃ-เจชเจ›เจพเจฃเฅค เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ…เจธเฉ€เจ‚ BPF เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฆเจพ เจชเฉฐเจ›เฉ€เจ†เจ‚ เจฆเจพ เจฆเฉเจฐเจฟเจธเจผ เจฒเฉˆ เจ•เฉ‡ เจฎเฉเฉฑเจ– เจญเจพเจ—เจพเจ‚ เจฆเฉ€ เจฐเฉ‚เจชเจฐเฉ‡เจ–เจพ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡เฅค

BPF เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฆเจพ เจฐเจœเจฟเจธเจŸเจฐ เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจธเจฟเจธเจŸเจฎเฅค เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเจฎเฉเฉฑเจšเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฆเจพ เจ‡เฉฑเจ• เจตเจฟเจšเจพเจฐ เจนเฉ‹เจฃ เจ•เจฐเจ•เฉ‡, เจ…เจธเฉ€เจ‚ BPF เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฆเฉ€ เจฌเจฃเจคเจฐ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจฌเฉ€เจชเฉ€เจเจซ เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเจพ เจœเฉ€เจตเจจ เจšเฉฑเจ•เจฐ, เจฌเฉ€เจชเฉ€เจเจซเจเจธ เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎเฅค เจ‡เจธ เจญเจพเจ— เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ BPF เจตเจธเจคเฉ‚เจ†เจ‚ - เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจ…เจคเฉ‡ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเฉ‡ เจœเฉ€เจตเจจ เจšเฉฑเจ•เจฐ 'เจคเฉ‡ เจกเฉ‚เฉฐเจ˜เจพเจˆ เจจเจพเจฒ เจตเจฟเจšเจพเจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจฌเฉ€เจชเฉ€เจเจซ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ†เจฌเจœเฉˆเจ•เจŸ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจจเจพเฅค เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฎเฉŒเจœเฉ‚เจฆ เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจ•เฉเจ เจธเจฎเจ เจฆเฉ‡ เจจเจพเจฒ, เจ…เจธเฉ€เจ‚ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡ เจ•เจฟ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจคเฉ‹เจ‚ เจ†เจฌเจœเฉˆเจ•เจŸเจธ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฃเจพเจ‰เจฃเจพ เจ…เจคเฉ‡ เจนเฉ‡เจฐเจพเจซเฉ‡เจฐเฉ€ เจ•เจฐเจจเจพ เจนเฉˆ - bpf(2).

ะŸะธัˆะตะผ ะฟั€ะพะณั€ะฐะผะผั‹ BPF ั ะฟะพะผะพั‰ัŒัŽ libbpf. เจฌเฉ‡เจธเจผเฉฑเจ•, เจคเฉเจธเฉ€เจ‚ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจชเจฐ เจ‡เจน เจ”เจ–เจพ เจนเฉˆเฅค เจตเจงเฉ‡เจฐเฉ‡ เจฏเจฅเจพเจฐเจฅเจตเจพเจฆเฉ€ เจฆเฉเจฐเจฟเจธเจผ เจฒเจˆ, เจชเจฐเจฎเจพเจฃเฉ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐเจพเจ‚ เจจเฉ‡ เจ‡เฉฑเจ• เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเฉ€ libbpf. เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจฌเฉเจจเจฟเจ†เจฆเฉ€ BPF เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจชเจฟเฉฐเจœเจฐ เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจ…เจ—เจฒเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจคเจพเจ‚เจ—เฉ‡เฅค

เจ•เจฐเจจเจฒ เจธเจนเจพเจ‡เจ•เฅค เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจธเจฟเจ–เจพเจ‚เจ—เฉ‡ เจ•เจฟ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจฐเจจเจฒ เจนเฉˆเจฒเจชเจฐ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจเจ•เจธเฉˆเจธ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจจ - เจ‡เฉฑเจ• เจŸเฉ‚เจฒ เจœเฉ‹ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเฉ‡ เจจเจพเจฒ, เจ•เจฒเจพเจธเจฟเจ• เจฆเฉ‡ เจฎเฉเจ•เจพเจฌเจฒเฉ‡ เจจเจตเฉ‡เจ‚ BPF เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจซเฉˆเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค

BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจšเฅค เจ‡เจธ เจฌเจฟเฉฐเจฆเฉ‚ เจคเฉฑเจ•, เจ…เจธเฉ€เจ‚ เจ‡เจน เจธเจฎเจเจฃ เจฒเจˆ เจ•เจพเจซเจผเฉ€ เจœเจพเจฃเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจ…เจคเฉ‡ เจ†เจ“ เจฎเจนเจพเจจ เจ…เจคเฉ‡ เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจชเฉเจฐเจฎเจพเจฃเฉ€เจ•เจฐเจฃ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจคเฉ‡เจœเจผ เจเจพเจค เจฎเจพเจฐเฉ€เจเฅค

เจตเจฟเจ•เจพเจธ เจธเจพเจงเจจเฅค เจชเฉเจฐเจฏเฉ‹เจ—เจพเจ‚ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ เจนเฉˆ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจธเจนเจพเจ‡เจคเจพ เจญเจพเจ—เฅค

เจธเจฟเฉฑเจŸเจพ เจฒเฉ‡เจ– เจฆเฉ‡ เจ…เจ–เจผเฉ€เจฐ เจตเจฟเจš, เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจฟเจ† เจนเฉˆ, เจ‰เจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเฉ‡เจฐเจฃเจพเจฆเจพเจ‡เจ• เจธเจผเจฌเจฆ เจ…เจคเฉ‡ เจ…เจ—เจฒเฉ‡ เจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเจš เจ•เฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ เจ‡เจธ เจฆเจพ เจธเฉฐเจ–เฉ‡เจช เจตเฉ‡เจฐเจตเจพ เจฎเจฟเจฒเฉ‡เจ—เจพเฅค เจ…เจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจธเจตเฉˆ-เจ…เจงเจฟเจเจจ เจฒเจˆ เจ•เจˆ เจฒเจฟเฉฐเจ•เจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจตเฉ€ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡ เจœเจฟเจจเฉเจนเจพเจ‚ เจ•เฉ‹เจฒ เจจเจฟเจฐเฉฐเจคเจฐเจคเจพ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเจจ เจฆเฉ€ เจ‡เฉฑเจ›เจพ เจœเจพเจ‚ เจฏเฉ‹เจ—เจคเจพ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจฌเฉ€เจชเฉ€เจเจซ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฆเฉ€ เจœเจพเจฃ-เจชเจ›เจพเจฃ

เจ‡เจธ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ BPF เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ†เจ–เจฐเฉ€ เจตเจพเจฐ (เจ“เจน) เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡ เจ•เจฒเจพเจธเจฟเจ• BPF, เจœเจฟเจธ เจจเฉ‚เฉฐ RISC เจฎเจธเจผเฉ€เจจเจพเจ‚ เจฆเฉ‡ เจ†เจ—เจฎเจจ เจฆเฉ‡ เจœเจตเจพเจฌ เจตเจœเฉ‹เจ‚ เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ เจ…เจคเฉ‡ เจ•เฉเจธเจผเจฒ เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐเจฟเฉฐเจ— เจฆเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจ‡เฉฐเจจเจพ เจธเจซเจฒ เจธเจพเจฌเจค เจนเฉ‹เจ‡เจ† เจ•เจฟ, เจฌเจฐเจ•เจฒเฉ‡ UNIX เจตเจฟเฉฑเจš เจจเฉฑเจฌเฉ‡ เจฆเฉ‡ เจฆเจนเจพเจ•เฉ‡ เจตเจฟเฉฑเจš เจชเฉˆเจฆเจพ เจนเฉ‹เจ, เจ‡เจธ เจจเฉ‚เฉฐ เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจฎเฉŒเจœเฉ‚เจฆเจพ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจชเฉ‹เจฐเจŸ เจ•เฉ€เจคเจพ เจ—เจฟเจ†, เจชเจพเจ—เจฒ เจตเฉ€เจนเจตเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจฌเจšเจฟเจ† เจ…เจคเฉ‡ เจ…เจœเฉ‡ เจตเฉ€ เจจเจตเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฒเฉฑเจญ เจฐเจฟเจนเจพ เจนเฉˆเฅค

เจจเจตเจพเจ‚ BPF 64-เจฌเจฟเฉฑเจŸ เจฎเจธเจผเฉ€เจจเจพเจ‚, เจ•เจฒเจพเจ‰เจก เจธเฉ‡เจตเจพเจตเจพเจ‚ เจ…เจคเฉ‡ SDN (SDN) เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจตเจงเจฆเฉ€ เจฒเฉ‹เฉœ เจฆเฉ€ เจธเจฐเจตเจตเจฟเจ†เจชเจ•เจคเจพ เจฆเฉ‡ เจœเจตเจพเจฌ เจตเจœเฉ‹เจ‚ เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅคSเจธเจพเจฎเจพเจจ-dเจชเฉเจฐเจญเจพเจธเจผเจฟเจค networking). เจ•เจฒเจพเจธเจฟเจ• BPF เจฒเจˆ เจ‡เฉฑเจ• เจฌเจฟเจนเจคเจฐ เจฌเจฆเจฒ เจตเจœเฉ‹เจ‚ เจ•เจฐเจจเจฒ เจจเฉˆเจŸเจตเจฐเจ• เจ‡เฉฐเจœเฉ€เจจเฉ€เจ…เจฐเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ†, เจจเจตเฉ‡เจ‚ 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 เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจคเจธเจตเฉ€เจฐ เจจเฉ‚เฉฐ เจ•เจฟเจ‰เจ‚ เจฌเจฆเจฒเจฆเจพ เจนเฉˆเฅค เจฆเฉ‹ เจจเจตเฉ€เจจเจคเจพเจตเจพเจ‚ เจœเฉ‹ เจฒเจพเจ—เฉ‚ เจนเฉ‹เจฃ เจฆเฉ‡ เจฆเจพเจ‡เจฐเฉ‡ เจจเฉ‚เฉฐ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจงเจพเจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ เจธเจผเฉ‡เจ…เจฐเจก เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจนเจจเฅค เจฌเฉ€เจชเฉ€เจเจซ เจตเจฟเฉฑเจš, เจธเจผเฉ‡เจ…เจฐเจก เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจจเฉ‚เฉฐ เจ…เจ–เฉŒเจคเฉ€ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ - เจ‡เฉฑเจ• เจ–เจพเจธ API เจฆเฉ‡ เจจเจพเจฒ เจธเจพเจ‚เจเฉ‡ เจ•เฉ€เจคเฉ‡ เจกเฉ‡เจŸเจพ เจขเจพเจ‚เจšเฉ‡เฅค เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจผเจพเจ‡เจฆ เจ‡เจน เจจเจพเจฎ เจ‡เจธ เจฒเจˆ เจฎเจฟเจฒเจฟเจ† เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจฃ เจตเจพเจฒเฉ€ เจชเจนเจฟเจฒเฉ€ เจ•เจฟเจธเจฎ เจฆเจพ เจจเจ•เจธเจผเจพ เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ เจธเฉ€เฅค เจซเจฟเจฐ เจเจฐเฉ‡ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฑเจคเฉ‡, เจฒเฉ‹เจ•เจฒ (เจชเฉเจฐเจคเฉ€-เจธเฉ€เจชเฉ€เจฏเฉ‚) เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ เจ…เจคเฉ‡ เจฒเฉ‹เจ•เจฒ เจเจฐเฉ‡, เจธเจฐเจš เจŸเฉเจฐเฉ€, เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเฉ‡ เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจตเจพเจฒเฉ‡ เจจเจ•เจธเจผเฉ‡ เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจฌเจนเฉเจค เจ•เฉเจเฅค เจนเฉเจฃ เจธเจพเจกเฉ‡ เจฒเจˆ เจฆเจฟเจฒเจšเจธเจช เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจนเฉเจฃ เจ•เจพเจฒเจพเจ‚ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจ•เจพเจ‡เจฎ เจฐเฉฑเจ–เจฃ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฆเฉ‚เจœเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจจเจพเจฒ เจธเจพเจ‚เจเจพ เจ•เจฐเจจ เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจนเฉˆเฅค

เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเฉ‡ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ bpf(2), เจ…เจคเฉ‡ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจšเฉฑเจฒ เจฐเจนเฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจคเฉ‹เจ‚เฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจธเจนเจพเจ‡เจ• เจธเจฟเจฐเจซเจผ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจนเฉ€ เจจเจนเฉ€เจ‚, เจธเจ—เฉ‹เจ‚ เจนเฉ‹เจฐ เจ•เจฐเจจเจฒ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ เจฒเจˆ เจตเฉ€ เจฎเฉŒเจœเฉ‚เจฆ เจนเจจเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฆเฉ‚เจœเฉ‡ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธเจพเจ‚ 'เจคเฉ‡ เจ…เฉฑเจ—เฉ‡ เจญเฉ‡เจœเจฃ, เจชเจฐเจซ เจ‡เจตเฉˆเจ‚เจŸเจธ เจฌเจฃเจพเจ‰เจฃ, เจ•เจฐเจจเจฒ เจขเจพเจ‚เจšเฉ‡ เจจเฉ‚เฉฐ เจเจ•เจธเฉˆเจธ เจ•เจฐเจจ, เจ†เจฆเจฟ เจฒเจˆ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจ›เฉ‹เจŸเฉ‡ เจฌเฉฑเจšเจฟเจ†เจ‚ เจฒเจˆ BPF, เจญเจพเจ— เจชเจนเจฟเจฒเจพ: เจตเจฟเจธเจคเฉเจฐเจฟเจค BPF

เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš, BPF เจ†เจฐเจฌเจฟเจŸเจฐเฉ‡เจฐเฉ€ เจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจฏเจพเจจเฉ€, เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ-เจŸเฉˆเจธเจŸ, เจฏเฉ‚เจœเจผเจฐ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจšเฅค เจ‡เจน เจ•เฉ‹เจก เจ•เจพเจฒเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจฌเจšเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจฆเฉ‡ เจจเจพเจฒ เจกเฉ‡เจŸเจพ เจฆเจพ เจ†เจฆเจพเจจ-เจชเฉเจฐเจฆเจพเจจ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉเจ†เจฐเจพ เจฎเจจเจœเจผเฉ‚เจฐ เจ•เจฐเจจเจฒ เจ‰เจช-เจธเจฟเจธเจŸเจฎเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจตเฉ€ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆเฅค

เจ‡เจน เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ•เจฐเจจเจฒ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเฉ‡ เจธเจฎเจพเจจ เจนเฉˆ, เจœเจฟเจธ เจฆเฉ€ เจคเฉเจฒเจจเจพ เจตเจฟเฉฑเจš BPF เจฆเฉ‡ เจ•เฉเจ เจซเจพเจ‡เจฆเฉ‡ เจนเจจ (เจฌเฉ‡เจธเจผเจ•, เจคเฉเจธเฉ€เจ‚ เจธเจฟเจฐเจซ เจธเจฎเจพเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจคเฉเจฒเจจเจพ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจธเจฟเจธเจŸเจฎ เจŸเจฐเฉ‡เจธเจฟเฉฐเจ— - เจคเฉเจธเฉ€เจ‚ BPF เจจเจพเจฒ เจ‡เฉฑเจ• เจ†เจฐเจฌเจฟเจŸเจฐเฉ‡เจฐเฉ€ เจกเจฐเจพเจˆเจตเจฐ เจจเจนเฉ€เจ‚ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹)เฅค เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ˜เฉฑเจŸ เจเจ‚เจŸเจฐเฉ€ เจฅเฉเจฐเฉˆเจธเจผเจนเฉ‹เจฒเจก เจจเฉ‹เจŸ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (เจ•เฉเจ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจœเฉ‹ BPF เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจฒเจˆ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจนเฉเจจเจฐ, เจœเจพเจ‚ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจนเฉเจจเจฐ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ), เจฐเจจเจŸเจพเจˆเจฎ เจธเฉเจฐเฉฑเจ–เจฟเจ† (เจ‰เจจเฉเจนเจพเจ‚ เจฒเจˆ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ†เจชเจฃเจพ เจนเฉฑเจฅ เจตเจงเจพเจ“ เจœเจฟเจจเฉเจนเจพเจ‚ เจจเฉ‡ เจฒเจฟเจ–เจฃ เจตเฉ‡เจฒเฉ‡ เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจคเฉ‹เฉœเจฟเจ†เฅค เจœเจพเจ‚ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฎเฉ‹เจกเฉ€เจŠเจฒ), เจเจŸเจฎเฉ€เจธเจฟเจŸเฉ€ - เจฎเฉ‹เจกเจฟเจŠเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฐเฉ€เจฒเฉ‹เจก เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ BPF เจธเจฌ-เจธเจฟเจธเจŸเจฎ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ‹เจˆ เจตเฉ€ เจ‡เจตเฉˆเจ‚เจŸ เจฎเจฟเจธ เจจเจพ เจนเฉ‹เจตเฉ‡ (เจจเจฟเจฐเจชเฉฑเจ– เจนเฉ‹เจฃ เจฒเจˆ, เจ‡เจน BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจ•เจฟเจธเจฎเจพเจ‚ เจฒเจˆ เจธเฉฑเจš เจจเจนเฉ€เจ‚ เจนเฉˆ)เฅค

เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเฉ€ เจฎเฉŒเจœเฉ‚เจฆเจ—เฉ€ เจฌเฉ€เจชเฉ€เจเจซ เจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจฆเฉ‡ เจตเจฟเจธเจคเจพเจฐ เจฒเจˆ เจ‡เฉฑเจ• เจธเจฐเจตเจตเจฟเจ†เจชเฉ€ เจธเจพเจงเจจ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆ, เจœเจฟเจธเจฆเฉ€ เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš เจชเฉเจธเจผเจŸเฉ€ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ: เจฌเฉ€เจชเฉ€เจเจซ เจตเจฟเฉฑเจš เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจจเจตเฉ‡เจ‚ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจตเฉฑเจกเฉ€เจ†เจ‚ เจ•เฉฐเจชเจจเฉ€เจ†เจ‚ เจฒเฉœเจพเจˆ เจธเจฐเจตเจฐเจพเจ‚ 24 ร— 7 เจคเฉ‡ เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจธเจŸเจพเจฐเจŸเจ…เฉฑเจช เจ†เจชเจฃเฉ‡ เจ•เจพเจฐเฉ‹เจฌเจพเจฐ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจนเฉฑเจฒเจพเจ‚ 'เจคเฉ‡ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจจ เจœเฉ‹ เจฌเฉ€เจชเฉ€เจเจซ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค BPF เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจนเจฐ เจฅเจพเจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ: DDoS เจนเจฎเจฒเจฟเจ†เจ‚ เจคเฉ‹เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฒเจˆ, SDN เจฌเจฃเจพเจ‰เจฃเจพ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจจเฉˆเจŸเจตเจฐเจ• เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ), เจฎเฉเฉฑเจ– เจธเจฟเจธเจŸเจฎ เจŸเจฐเฉ‡เจธเจฟเฉฐเจ— เจŸเฉ‚เจฒ เจ…เจคเฉ‡ เจ…เฉฐเจ•เฉœเจพ เจ•เฉเจฒเฉˆเจ•เจŸเจฐ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡, เจ˜เฉเจธเจชเฉˆเจ  เจ–เฉ‹เจœ เจชเฉเจฐเจฃเจพเจฒเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจธเฉˆเจ‚เจกเจฌเฉŒเจ•เจธ เจชเฉเจฐเจฃเจพเจฒเฉ€เจ†เจ‚ เจ†เจฆเจฟ เจตเจฟเฉฑเจšเฅค

เจ†เจ‰ เจฒเฉ‡เจ– เจฆเฉ‡ เจธเฉฐเจ–เฉ‡เจช เจญเจพเจ— เจจเฉ‚เฉฐ เจ‡เฉฑเจฅเฉ‡ เจ–เจคเจฎ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจ…เจคเฉ‡ BPF เจˆเจ•เฉ‹เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจตเฉ‡เจ–เฉ€เจเฅค

เจกเจฟเจ—เฉเจฐเฉ‡เจธเจผเจจ: เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚

เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจญเจพเจ—เจพเจ‚ เจตเจฟเฉฑเจš เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจ•เจˆ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹ เจธเจ•เจฆเฉ€ เจนเฉˆ llvm/clang bpf เจธเจนเจฟเจฏเฉ‹เจ— เจจเจพเจฒ เจ…เจคเฉ‡ bpftool. เจญเจพเจ— เจตเจฟเฉฑเจš เจตเจฟเจ•เจพเจธ เจธเจพเจงเจจ เจคเฉเจธเฉ€เจ‚ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจฒเจˆ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจคเฉเจนเจพเจกเฉ‡ เจ•เจฐเจจเจฒ เจจเฉ‚เฉฐ เจชเฉœเฉเจน เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‡เจน เจญเจพเจ— เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ เจคเจพเจ‚ เจœเฉ‹ เจธเจพเจกเฉ€ เจชเฉ‡เจธเจผเจ•เจพเจฐเฉ€ เจฆเฉ€ เจ‡เจ•เจธเฉเจฐเจคเจพ เจจเฉ‚เฉฐ เจตเจฟเจ—เจพเฉœ เจจเจพ เจธเจ•เฉ‡เฅค

เจฌเฉ€เจชเฉ€เจเจซ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฐเจœเจฟเจธเจŸเจฐ เจ…เจคเฉ‡ เจนเจฆเจพเจ‡เจค เจชเฉเจฐเจฃเจพเจฒเฉ€

เจฌเฉ€เจชเฉ€เจเจซ เจฆเจพ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจธเจฟเจธเจŸเจฎ เจ‡เจธ เจคเฉฑเจฅ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹เจ เจตเจฟเจ•เจธเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ เจ•เจฟ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉ€ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจœเจพเจตเฉ‡เจ—เจพ เจ…เจคเฉ‡, เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉ‚เจฒ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค เจ‡เจธ เจฒเจˆ, เจฐเจœเจฟเจธเจŸเจฐเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเฉ‡ เจธเจฎเฉ‚เจน เจจเฉ‚เฉฐ เจ—เจฃเจฟเจคเจฟเจ• เจ…เจฐเจฅเจพเจ‚ เจตเจฟเฉฑเจš, เจ†เจงเฉเจจเจฟเจ• เจฎเจธเจผเฉ€เจจเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเฉ‡ เจ‡เฉฐเจŸเจฐเจธเฉˆเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ…เฉฑเจ– เจจเจพเจฒ เจšเฉเจฃเจฟเจ† เจ—เจฟเจ† เจธเฉ€เฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ 'เจคเฉ‡ เจ•เจˆ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจชเจพเจฌเฉฐเจฆเฉ€เจ†เจ‚ เจฒเจ—เจพเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจจ, เจ‰เจฆเจพเจนเจฐเจฃ เจตเจœเฉ‹เจ‚, เจนเจพเจฒ เจนเฉ€ เจตเจฟเฉฑเจš เจฒเฉ‚เจช เจ…เจคเฉ‡ เจธเจฌเจฐเฉ‚เจŸเฉ€เจจ เจฒเจฟเจ–เจฃเจพ เจธเฉฐเจญเจต เจจเจนเฉ€เจ‚ เจธเฉ€, เจ…เจคเฉ‡ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ 4096 เจคเฉฑเจ• เจธเฉ€เจฎเจฟเจค เจธเฉ€ (เจนเฉเจฃ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ เจชเฉเจฐเจพเจชเจค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ‡เฉฑเจ• เจฎเจฟเจฒเฉ€เจ…เจจ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจคเฉฑเจ• เจฒเฉ‹เจก เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจจ)เฅค

BPF เจ•เฉ‹เจฒ เจ—เจฟเจ†เจฐเจพเจ‚ เจ‰เจชเจญเฉ‹เจ—เจคเจพ-เจชเจนเฉเฉฐเจšเจฏเฉ‹เจ— 64-เจฌเจฟเฉฑเจŸ เจฐเจœเจฟเจธเจŸเจฐ เจนเจจ r0-r10 เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจพเจŠเจ‚เจŸเจฐเฅค เจฐเจœเจฟเจธเจŸเจฐ r10 เจ‡เฉฑเจ• เจซเจฐเฉ‡เจฎ เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเจฟเจฐเจซเจผ เจชเฉœเฉเจนเจจ เจฒเจˆ เจนเฉˆเฅค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจ•เฉ‹เจฒ เจฐเจจเจŸเจพเจˆเจฎ 'เจคเฉ‡ 512-เจฌเจพเจˆเจŸ เจธเจŸเฉˆเจ• เจ…เจคเฉ‡ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเจผเฉ‡เจ…เจฐเจก เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจฆเฉ€ เจ…เจธเฉ€เจฎเจฟเจค เจฎเจพเจคเจฐเจพ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค

BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ-เจ•เจฟเจธเจฎ เจฆเฉ‡ เจ•เจฐเจจเจฒ เจธเจนเจพเจ‡เจ•เจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจ–เจพเจธ เจธเฉˆเฉฑเจŸ เจ…เจคเฉ‡, เจนเจพเจฒ เจนเฉ€ เจตเจฟเฉฑเจš, เจจเจฟเจฏเจฎเจค เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฑเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจนเจฐเฉ‡เจ• เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเฉ‹เจ เจซเฉฐเจ•เจธเจผเจจ เจชเฉฐเจœ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจฒเฉˆ เจธเจ•เจฆเจพ เจนเฉˆ, เจฐเจœเจฟเจธเจŸเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจชเจพเจธ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ r1-r5, เจ…เจคเฉ‡ เจตเจพเจชเจธเฉ€ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ r0. เจ‡เจน เจ—เจพเจฐเฉฐเจŸเฉ€ เจนเฉˆ เจ•เจฟ เจซเฉฐเจ•เจธเจผเจจ เจคเฉ‹เจ‚ เจตเจพเจชเจธ เจ†เจ‰เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฐเจœเจฟเจธเจŸเจฐเจพเจ‚ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ r6-r9 เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเฉ‡เจ—เจพเฅค

เจ•เฉเจธเจผเจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ…เจจเฉเจตเจพเจฆ เจฒเจˆ, เจฐเจœเจฟเจธเจŸเจฐ r0-r11 เจฎเฉŒเจœเฉ‚เจฆเจพ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฆเฉ€เจ†เจ‚ ABI เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจงเจฟเจ†เจจ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹เจ, เจธเจพเจฐเฉ‡ เจธเจฎเจฐเจฅเจฟเจค เจขเจพเจ‚เจšเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ…เจธเจฒ เจฐเจœเจฟเจธเจŸเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฟเจฒเฉฑเจ–เจฃ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฎเฉˆเจช เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฒเจˆ x86_64 เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ r1-r5, เจซเฉฐเจ•เจธเจผเจจ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, 'เจคเฉ‡ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจนเฉเฉฐเจฆเฉ‡ เจนเจจ rdi, rsi, rdx, rcx, r8, เจœเฉ‹ เจ•เจฟ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจชเจพเจธ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ x86_64. เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ–เฉฑเจฌเฉ‡ เจชเจพเจธเฉ‡ เจฆเจพ เจ•เฉ‹เจก เจธเฉฑเจœเฉ‡ เจชเจพเจธเฉ‡ เจฆเฉ‡ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ…เจจเฉเจตเจพเจฆ เจ•เจฐเจฆเจพ เจนเฉˆ:

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

เจฐเจœเจฟเจธเจŸเจฐ r0 เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฆเจพ เจจเจคเฉ€เจœเจพ เจตเจพเจชเจธ เจ•เจฐเจจ เจฒเจˆ เจตเฉ€ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจฐเจœเจฟเจธเจŸเจฐ เจตเจฟเฉฑเจš r1 เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจธเฉฐเจฆเจฐเจญ เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจชเจพเจธ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ - เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจ•เจฟเจธเจฎ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจฟเจ†เจ‚, เจ‡เจน, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจฌเจฃเจคเจฐ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ struct xdp_md (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 เจฒเจˆ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจฌเจพเจˆเจจเจฐเฉ€ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจตเฉฑเจ– เจ•เจฐเฉ‹เฅค เจฒเฉ‡เจ– เจตเจฟเจš เจฌเจพเจ…เจฆ เจตเจฟเจš เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ เจ‡เจ•เจธเจพเจฐ เจ•เจฐเจจ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ, เจœเฉ‡เจ†เจˆเจŸเฉ€ เจ•เฉฐเจชเจพเจˆเจฒเจฐ, เจ•เจฒเจพเจธเจฟเจ• เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจ…เจจเฉเจตเจพเจฆ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเจพ เจ…เจงเจฟเจเจจ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจ•เจพเจฒเจฟเฉฐเจ— เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจ†เจฆเจฟ เจฌเจพเจฐเฉ‡ เจญเจพเจ—เจพเจ‚ เจตเจฟเจš เจตเจฟเจ…เจ•เจคเฉ€เจ—เจค เจนเจฆเจพเจ‡เจคเจพเจ‚ เจจเจพเจฒ เจตเฉ€ เจฎเฉเจฒเจพเจ•เจพเจค เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจœเจฆเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจตเจฟเจ…เจ•เจคเฉ€เจ—เจค เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ…เจธเฉ€เจ‚ เจ•เฉ‹เจฐ เจซเจพเจˆเจฒเจพเจ‚ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡ bpf.h ะธ bpf_common.h, เจœเฉ‹ BPF เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ‡ เจธเฉฐเจ–เจฟเจ†เจคเจฎเจ• เจ•เฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ†เจช เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฆเจพ เจ…เจงเจฟเจเจจ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡/เจœเจพเจ‚ เจฌเจพเจˆเจจเจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจชเจพเจฐเจธ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจนเฉ‡เจ เจฒเฉ‡ เจธเจฐเฉ‹เจคเจพเจ‚ เจตเจฟเฉฑเจš เจ…เจฐเจฅ เจตเจฟเจ—เจฟเจ†เจจ เจฒเฉฑเจญ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจŸเจฟเจฒเจคเจพ เจฆเฉ‡ เจ•เฉเจฐเจฎ เจตเจฟเฉฑเจš เจ•เฉเจฐเจฎเจฌเฉฑเจง: เจ…เจฃเจ…เจงเจฟเจ•เจพเจฐเจค eBPF เจธเจชเฉ‡เจ•, BPF เจ…เจคเฉ‡ XDP เจธเฉฐเจฆเจฐเจญ เจ—เจพเจˆเจก, เจนเจฆเจพเจ‡เจค เจธเฉˆเฉฑเจŸ, Documentation/networking/filter.txt เจ…เจคเฉ‡, เจฌเฉ‡เจธเจผเฉฑเจ•, เจฒเฉ€เจจเจ•เจธ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจตเจฟเฉฑเจš - เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ, เจœเฉ‡เจ†เจˆเจŸเฉ€, เจฌเฉ€เจชเฉ€เจเจซ เจฆเฉเจญเจพเจธเจผเฉ€เจเฅค

เจ‰เจฆเจพเจนเจฐเจจ: เจคเฉเจนเจพเจกเฉ‡ เจธเจฟเจฐ เจตเจฟเฉฑเจš 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, เจ†เจฎ เจตเจพเจ‚เจ—, เจ…เจ—เจฒเฉ€ เจนเจฆเจพเจ‡เจค เจฆเจพ เจชเจคเจพ เจธเจผเจพเจฎเจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจœเฉ‡เจเจฎเจชเฉ€ เจ•เจฒเจพเจธ 9 เจ“เจชเจฐเฉ‡เจธเจผเจจ เจนเฉˆ BPF_EXIT. เจ‡เจน เจนเจฆเจพเจ‡เจค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจ•เจฐเจจเจฒ เจคเฉ‡ เจตเจพเจชเจธ เจ†เจ‰เจ‚เจฆเฉ€ เจนเฉˆ r0. เจ†เจ“ เจ†เจชเจฃเฉ€ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจ•เจพเจฒเจฎ เจœเฉ‹เฉœเฉ€เจ:

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

เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจตเจงเฉ‡เจฐเฉ‡ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

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

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

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

เจนเจพเจ‚, เจ‡เจน เจ‡เฉฑเจ• เจ…เจฐเจฅเจนเฉ€เจฃ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจนเฉˆ, เจชเจฐ เจ‡เจน เจธเจฟเจฐเจซเจผ เจšเจพเจฐ เจธเจงเจพเจฐเจจ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจตเจฟเฉฑเจš เจ…เจจเฉเจตเจพเจฆ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ…เจชเจตเจพเจฆ เจ‰เจฆเจพเจนเจฐเจจ: 16-เจฌเจพเจˆเจŸ เจนเจฆเจพเจ‡เจค

เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจœเจผเจฟเจ•เจฐ เจ•เฉ€เจคเจพ เจนเฉˆ เจ•เจฟ เจ•เฉเจ เจจเจฟเจฐเจฆเฉ‡เจธเจผ 64 เจฌเจฟเฉฑเจŸ เจคเฉ‹เจ‚ เจตเฉฑเจง เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจจเฅค เจ‡เจน, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ 'เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ lddw (เจ•เฉ‹เจก = 0x18 = BPF_LD | BPF_DW | BPF_IMM) โ€” เจซเฉ€เจฒเจกเจพเจ‚ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจฆเฉ‹เจนเจฐเจพ เจธเจผเจฌเจฆ เจฐเจœเจฟเจธเจŸเจฐ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเฉ‹ Imm... เจคเฉฑเจฅ เจ‡เจน เจนเฉˆ เจ•เจฟ Imm เจฆเจพ เจ†เจ•เจพเจฐ 32 เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจฆเฉ‹เจนเจฐเจพ เจธเจผเจฌเจฆ 64 เจฌเจฟเฉฑเจŸ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจ‡เฉฑเจ• 64-เจฌเจฟเฉฑเจŸ เจนเจฆเจพเจ‡เจค เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฐเจœเจฟเจธเจŸเจฐ เจตเจฟเฉฑเจš 64-เจฌเจฟเฉฑเจŸ เจคเจคเจ•เจพเจฒ เจฎเฉเฉฑเจฒ เจฒเฉ‹เจก เจ•เจฐเจจเจพ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเฉ‡เจ—เจพเฅค เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš 64-เจฌเจฟเฉฑเจŸ เจฎเฉเฉฑเจฒ เจฆเฉ‡ เจฆเฉ‚เจœเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจ เจฒเจˆ เจฆเฉ‹ เจจเจพเจฒ เจฒเฉฑเจ—เจฆเฉ€เจ†เจ‚ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ Imm. เจ‰เจฆเจพเจนเจฐเจจ:

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

เจฌเจพเจˆเจจเจฐเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซเจผ เจฆเฉ‹ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจนเจจ:

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

เจ…เจธเฉ€เจ‚ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจจเจพเจฒ เจฆเฉเจฌเจพเจฐเจพ เจฎเจฟเจฒเจพเจ‚เจ—เฉ‡ lddw, เจœเจฆเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจชเฉเจฒเจพเฉœ เจ…เจคเฉ‡ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจ‰เจฆเจพเจนเจฐเจจ: เจฎเจฟเจ†เจฐเฉ€ เจ”เจœเจผเจพเจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ BPF เจจเฉ‚เฉฐ เจตเฉฑเจ– เจ•เจฐเจจเจพ

เจ‡เจธ เจฒเจˆ, เจ…เจธเฉ€เจ‚ BPF เจฌเจพเจˆเจจเจฐเฉ€ เจ•เฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจเจพ เจธเจฟเฉฑเจ–เจฟเจ† เจนเฉˆ เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡ เจคเจพเจ‚ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจนเจฆเจพเจ‡เจค เจจเฉ‚เฉฐ เจชเจพเจฐเจธ เจ•เจฐเจจ เจฒเจˆ เจคเจฟเจ†เจฐ เจนเจพเจ‚เฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจน เจ•เจนเจฟเจฃเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจฃ เจนเฉˆ เจ•เจฟ เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš เจฎเจฟเจ†เจฐเฉ€ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉฑเจ– เจ•เจฐเจจเจพ เจตเจงเฉ‡เจฐเฉ‡ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจ…เจคเฉ‡ เจคเฉ‡เจœเจผ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจฃ เจฒเจˆ:

$ llvm-objdump -d x64.o

Disassembly of section .text:

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

เจฌเฉ€เจชเฉ€เจเจซ เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเจพ เจœเฉ€เจตเจจ เจšเฉฑเจ•เจฐ, เจฌเฉ€เจชเฉ€เจเจซเจเจธ เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ

(เจฎเฉˆเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจธ เจ‰เจชเจญเจพเจ— เจตเจฟเฉฑเจš เจตเจฐเจฃเจฟเจค เจ•เฉเจ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจคเฉ‹เจ‚ เจธเจฟเฉฑเจ–เจฟเจ† เจชเฉ‹เจธเจŸ เจ…เจฒเฉˆเจ•เจธเฉ€ เจธเจŸเจพเจฐเฉ‹เจตเฉ‹เจ‡เจคเฉ‹เจต เจ‡เจจ BPF เจฌเจฒเฉŒเจ—.)

BPF เจตเจธเจคเฉ‚เจ†เจ‚ - เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ…เจคเฉ‡ เจจเจ•เจธเจผเฉ‡ - เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจคเฉ‹เจ‚ เจฌเจฃเจพเจ เจ—เจ เจนเจจ BPF_PROG_LOAD ะธ BPF_MAP_CREATE เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ bpf(2), เจ…เจธเฉ€เจ‚ เจ…เจ—เจฒเฉ‡ เจญเจพเจ— เจตเจฟเฉฑเจš เจ‡เจธ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจตเจพเจชเจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจ•เจฐเจจเจฒ เจกเจพเจŸเจพ เจฌเจฃเจคเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจนเจฐเฉ‡เจ• เจฒเจˆ refcount (เจนเจตเจพเจฒเจพ เจ—เจฟเจฃเจคเฉ€) เจจเฉ‚เฉฐ เจ‡เฉฑเจ• 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจ…เจคเฉ‡ เจ†เจฌเจœเฉˆเจ•เจŸ เจตเฉฑเจฒ เจ‡เจธเจผเจพเจฐเจพ เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจ•เจฐ เจฆเจฟเฉฑเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจนเฉˆเจ‚เจกเจฒ เจฌเฉฐเจฆ เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ refcount เจตเจธเจคเฉ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฆเฉเจ†เจฐเจพ เจ˜เจŸเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจ‡เจน เจœเจผเฉ€เจฐเฉ‹ เจคเฉฑเจ• เจชเจนเฉเฉฐเจšเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจตเจธเจคเฉ‚ เจจเจธเจผเจŸ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจœเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ refcount เจ‡เจน เจจเจ•เจธเจผเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ‡เฉฑเจ• เจฆเฉเจ†เจฐเจพ เจตเจงเจพเจ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ. เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจคเฉ‹เจ‚ เจฌเฉฐเจฆ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ…เจœเฉ‡ เจตเฉ€ refcount เจœเจผเฉ€เจฐเฉ‹ เจจเจนเฉ€เจ‚ เจฌเจฃเฉ‡เจ—เจพ:

เจ›เฉ‹เจŸเฉ‡ เจฌเฉฑเจšเจฟเจ†เจ‚ เจฒเจˆ BPF, เจญเจพเจ— เจชเจนเจฟเจฒเจพ: เจตเจฟเจธเจคเฉเจฐเจฟเจค BPF

เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจฒเฉ‹เจก เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจฟเจธเฉ‡ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจ‡เจตเฉˆเจ‚เจŸ เจœเจจเจฐเฉ‡เจŸเจฐ เจจเจพเจฒ เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจ เจฒเจˆ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจจเฉˆเจŸเจตเจฐเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจคเฉ‡ เจฐเฉฑเจ– เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจœเจพเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉเจ เจจเจพเจฒ เจœเฉ‹เฉœ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ tracepoint เจ•เฉ‹เจฐ เจตเจฟเฉฑเจš. เจ‡เจธ เจฌเจฟเฉฐเจฆเฉ‚ 'เจคเฉ‡, เจนเจตเจพเจฒเจพ เจ•เจพเจŠเจ‚เจŸเจฐ เจตเฉ€ เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจตเฉฑเจง เจœเจพเจตเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจฒเฉ‹เจกเจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจตเจพเจ‚เจ—เฉ‡เฅค

เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจนเฉเจฃ เจฌเฉ‚เจŸเจฒเฉ‹เจกเจฐ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจคเจพเจ‚ เจ•เฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ? เจ‡เจน เจ‡เจตเฉˆเจ‚เจŸ เจœเจจเจฐเฉ‡เจŸเจฐ (เจนเฉเฉฑเจ•) เจฆเฉ€ เจ•เจฟเจธเจฎ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจฒเฉ‹เจกเจฐ เจฆเฉ‡ เจชเฉ‚เจฐเจพ เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจธเจพเจฐเฉ‡ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจนเฉเฉฑเจ• เจฎเฉŒเจœเฉ‚เจฆ เจนเฉ‹เจฃเจ—เฉ‡, เจ‡เจน เจ…เจ–เฉŒเจคเฉ€ เจ—เจฒเฉ‹เจฌเจฒ เจนเฉเฉฑเจ• เจนเจจเฅค เจ…เจคเฉ‡, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจŸเจฐเฉ‡เจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจธ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจœเจพเจฐเฉ€ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจœเจฟเจธ เจจเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‡เจ† เจนเฉˆ (เจ…เจคเฉ‡ เจ‡เจธ เจฒเจˆ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉ‹เจ•เจฒ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, "เจธเจฅเจพเจจเจ• เจคเฉ‹เจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจคเฉฑเจ•")เฅค เจคเจ•เจจเฉ€เจ•เฉ€ เจคเฉŒเจฐ 'เจคเฉ‡, เจธเจฅเจพเจจเจ• เจนเฉเฉฑเจ•เจพเจ‚ เจ•เฉ‹เจฒ เจนเจฎเฉ‡เจธเจผเจพ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ…เจจเฉเจธเจพเจฐเฉ€ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจฒเจˆ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฌเฉฐเจฆ เจนเฉ‹เจฃ 'เจคเฉ‡ เจฌเฉฐเจฆ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจชเจฐ เจ—เจฒเฉ‹เจฌเจฒ เจนเฉเฉฑเจ• เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ‡เฅค เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš, เจฒเจพเจฒ เจ•เจฐเจพเจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจฎเฉˆเจ‚ เจ‡เจน เจฆเจฟเจ–เจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจ•เจฟเจตเฉ‡เจ‚ เจฒเฉ‹เจกเจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจธเจฎเจพเจชเจคเฉ€ เจธเจฅเจพเจจเจ• เจ…เจคเฉ‡ เจ—เจฒเฉ‹เจฌเจฒ เจนเฉเฉฑเจ•เจพเจ‚ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเฉ‡ เจœเฉ€เจตเจจ เจ•เจพเจฒ เจจเฉ‚เฉฐ เจชเฉเจฐเจญเจพเจตเจค เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค

เจ›เฉ‹เจŸเฉ‡ เจฌเฉฑเจšเจฟเจ†เจ‚ เจฒเจˆ BPF, เจญเจพเจ— เจชเจนเจฟเจฒเจพ: เจตเจฟเจธเจคเฉเจฐเจฟเจค BPF

เจธเจฅเจพเจจเจ• เจ…เจคเฉ‡ เจ—เจฒเฉ‹เจฌเจฒ เจนเฉเฉฑเจ• เจตเจฟเจšเจ•เจพเจฐ เจ…เฉฐเจคเจฐ เจ•เจฟเจ‰เจ‚ เจนเฉˆ? เจ•เฉเจ เจ•เจฟเจธเจฎเจพเจ‚ เจฆเฉ‡ เจจเฉˆเจŸเจตเจฐเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃเจพ เจ‰เจชเจญเฉ‹เจ—เจคเจพ-เจธเจชเฉ‡เจธ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ…เจฐเจฅ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, DDoS เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ€ เจ•เจฒเจชเจจเจพ เจ•เจฐเฉ‹ - เจฌเฉ‚เจŸเจฒเฉ‹เจกเจฐ เจจเจฟเจฏเจฎ เจฒเจฟเจ–เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเจพเจฒ เจœเฉ‹เฉœเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฌเฉ‚เจŸเจฒเฉ‹เจกเจฐ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจฎเจพเจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡, เจ‡เฉฑเจ• เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ— เจŸเจฐเฉ‡เจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจ•เจฒเจชเจจเจพ เจ•เจฐเฉ‹ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจฆเจธ เจฎเจฟเฉฐเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจ†เจชเจฃเฉ‡ เจ—เฉ‹เจกเจฟเจ†เจ‚ 'เจคเฉ‡ เจฒเจฟเจ–เจฟเจ† เจธเฉ€ - เจœเจฆเฉ‹เจ‚ เจ‡เจน เจชเฉ‚เจฐเจพ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจคเฉเจธเฉ€เจ‚ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจ•เฉ‚เฉœเจพ เจจเจพ เจฌเจšเฉ‡, เจ…เจคเฉ‡ เจธเจฅเจพเจจเจ• เจนเฉเฉฑเจ• เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃเจ—เฉ‡เฅค

เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡, เจ•เจฒเจชเจจเจพ เจ•เจฐเฉ‹ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจŸเจฐเฉ‡เจธเจชเฉเจ†เจ‡เฉฐเจŸ เจจเจพเจฒ เจœเฉเฉœเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ•เจˆ เจธเจพเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจ…เฉฐเจ•เฉœเฉ‡ เจ‡เจ•เฉฑเจ เฉ‡ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹เฅค เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจคเฉเจธเฉ€เจ‚ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจธเจฎเฉ‡เจ‚-เจธเจฎเฉ‡เจ‚ 'เจคเฉ‡ เจ…เฉฐเจ•เฉœเจฟเจ†เจ‚ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจฃเจพ เจšเจพเจนเฉ‹เจ—เฉ‡เฅค bpf เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ เจ‡เจน เจฎเฉŒเจ•เจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจ‡เฉฑเจ• เจ‡เจจ-เจฎเฉˆเจฎเฉ‹เจฐเฉ€-เจธเจฟเจฐเจซ เจธเฉ‚เจกเฉ‹-เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ เจนเฉˆ เจœเฉ‹ BPF เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเฉ‡เจฃ เจตเจพเจฒเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจตเจงเจฆเจพ เจนเฉˆ refcount เจตเจธเจคเฉ‚เจ†เจ‚. เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฒเฉ‹เจกเจฐ เจฌเจพเจนเจฐ เจ† เจธเจ•เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจธ เจฆเฉเจ†เจฐเจพ เจฌเจฃเจพเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจตเจธเจคเฉ‚เจ†เจ‚ เจœเจผเจฟเฉฐเจฆเจพ เจฐเจนเจฟเจฃเจ—เฉ€เจ†เจ‚เฅค

เจ›เฉ‹เจŸเฉ‡ เจฌเฉฑเจšเจฟเจ†เจ‚ เจฒเจˆ BPF, เจญเจพเจ— เจชเจนเจฟเจฒเจพ: เจตเจฟเจธเจคเฉเจฐเจฟเจค BPF

bpffs เจตเจฟเฉฑเจš เจซเจพเจˆเจฒเจพเจ‚ เจฌเจฃเจพเจ‰เจฃเจพ เจœเฉ‹ BPF เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจ เจจเฉ‚เฉฐ "เจชเจฟเจจเจฟเฉฐเจ—" เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจตเจพเจ•เจพเจ‚เจธเจผ เจตเจฟเฉฑเจš: "เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ‡เฉฑเจ• BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจœเจพเจ‚ เจจเจ•เจธเจผเฉ‡ เจจเฉ‚เฉฐ เจชเจฟเฉฐเจจ เจ•เจฐ เจธเจ•เจฆเฉ€ เจนเฉˆ")เฅค BPF เจตเจธเจคเฉ‚เจ†เจ‚ เจฒเจˆ เจซเจพเจˆเจฒ เจ†เจฌเจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ‰เจฃเจพ เจจเจพ เจธเจฟเจฐเจซเจผ เจธเจฅเจพเจจเจ• เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเฉ‡ เจœเฉ€เจตเจจ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃ เจฒเจˆ, เจธเจ—เฉ‹เจ‚ เจ—เจฒเฉ‹เจฌเจฒ เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚เจฏเฉ‹เจ—เจคเจพ เจฒเจˆ เจตเฉ€ เจ…เจฐเจฅ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆ - เจ—เจฒเฉ‹เจฌเจฒ DDoS เจธเฉเจฐเฉฑเจ–เจฟเจ† เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจจเจพเจฒ เจ‰เจฆเจพเจนเจฐเจจ 'เจคเฉ‡ เจตเจพเจชเจธ เจœเจพเจฃเจพ, เจ…เจธเฉ€เจ‚ เจ…เฉฐเจ•เฉœเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจธเจฎเฉ‡ เจฆเฉ‡ เจธเจฎเฉ‡.

BPF เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจฎเจพเจŠเจ‚เจŸ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ /sys/fs/bpf, เจชเจฐ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฅเจพเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจตเฉ€ เจฎเจพเจŠเจ‚เจŸ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚:

$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint

เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ เจจเจพเจ‚ เจฌเจฃเจพเจ เจ—เจ เจนเจจ BPF_OBJ_PIN BPF เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเฅค เจฆเจฐเจธเจพเจ‰เจฃ เจฒเจˆ, เจ†เจ“ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจฐเฉ€เจ, เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเฉ€เจ, เจ‡เจธเจจเฉ‚เฉฐ เจ…เจชเจฒเฉ‹เจก เจ•เจฐเฉ€เจ, เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจชเจฟเฉฐเจจ เจ•เจฐเฉ€เจ bpffs. เจธเจพเจกเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เฉเจ เจตเฉ€ เจฒเจพเจญเจฆเจพเจ‡เจ• เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซ เจ•เฉ‹เจก เจชเฉ‡เจธเจผ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚ เจคเจพเจ‚ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจ‰เจฆเจพเจนเจฐเจฃ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจชเฉ‡เจธเจผ เจ•เจฐ เจธเจ•เฉ‹:

$ cat test.c
__attribute__((section("xdp"), used))
int test(void *ctx)
{
        return 0;
}

char _license[] __attribute__((section("license"), used)) = "GPL";

เจ†เจ‰ เจ‡เจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจซเจพเจˆเจฒ เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจฅเจพเจจเจ• เจ•เจพเจชเฉ€ เจฌเจฃเจพเจˆเจ bpffs:

$ clang -target bpf -c test.c -o test.o
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint

เจ†เจ“ เจนเฉเจฃ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจกเจพเจ‰เจจเจฒเฉ‹เจก เจ•เจฐเฉ€เจ bpftool เจ…เจคเฉ‡ เจจเจพเจฒ เจตเจพเจฒเฉ€เจ†เจ‚ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เฉ‹ bpf(2) (เจธเจŸเฉเจฐเฉˆเจธ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจคเฉ‹เจ‚ เจ•เฉเจ เจ…เจชเฉเจฐเจธเฉฐเจ—เจฟเจ• เจฒเจพเจˆเจจเจพเจ‚ เจนเจŸเจพ เจฆเจฟเฉฑเจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจ):

$ sudo strace -e bpf bpftool prog load ./test.o bpf-mountpoint/test
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, prog_name="test", ...}, 120) = 3
bpf(BPF_OBJ_PIN, {pathname="bpf-mountpoint/test", bpf_fd=3}, 120) = 0

เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจตเจฐเจคเจฆเฉ‡ เจนเฉ‹เจ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจนเฉˆ BPF_PROG_LOAD, เจ•เจฐเจจเจฒ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจซเจพเจ‡เจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจ‡เจ† เจนเฉˆ 3 เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ BPF_OBJ_PIN เจ‡เจธ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจชเจฟเฉฐเจจ เจ•เฉ€เจคเจพ "bpf-mountpoint/test". เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฌเฉ‚เจŸเจฒเฉ‹เจกเจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ bpftool เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจชเฉ‚เจฐเจพ เจนเฉ‹ เจ—เจฟเจ†, เจชเจฐ เจธเจพเจกเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฐเจฟเจนเจพ, เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเจพเจฒ เจœเฉ‹เฉœเจฟเจ† เจจเจนเฉ€เจ‚ เจนเฉˆ:

$ sudo bpftool prog | tail -3
783: xdp  name test  tag 5c8ba0cf164cb46c  gpl
        loaded_at 2020-05-05T13:27:08+0000  uid 0
        xlated 24B  jited 41B  memlock 4096B

เจ…เจธเฉ€เจ‚ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจซเจพเจˆเจฒ เจ†เจฌเจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ unlink(2) เจ…เจคเฉ‡ เจ‰เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพ เจฆเจฟเฉฑเจคเจพ เจœเจพเจตเฉ‡เจ—เจพ:

$ sudo rm ./bpf-mountpoint/test
$ sudo bpftool prog show id 783
Error: get by id (783): No such file or directory

เจตเจธเจคเฉ‚เจ†เจ‚ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ‰เจฃเจพ

เจตเจธเจคเฉ‚เจ†เจ‚ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ‰เจฃ เจฌเจพเจฐเฉ‡ เจฌเฉ‹เจฒเจฆเฉ‡ เจนเฉ‹เจ, เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจ•เจฐเจจเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ เจ•เจฟ เจœเจฆเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจนเฉเฉฑเจ• (เจ‡เจตเฉˆเจ‚เจŸ เจœเจจเจฐเฉ‡เจŸเจฐ) เจคเฉ‹เจ‚ เจกเจฟเจธเจ•เจจเฉˆเจ•เจŸ เจ•เจฐ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจ•เฉ‹เจˆ เจตเฉ€ เจจเจตเจพเจ‚ เจ‡เจตเฉˆเจ‚เจŸ เจ‡เจธเจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจจเจนเฉ€เจ‚ เจ•เจฐเฉ‡เจ—เจพ, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ†เจฎ เจ•เฉเจฐเจฎ เจตเจฟเฉฑเจš เจชเฉ‚เจฐเจพ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค .

BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจ•เฉเจ เจ•เจฟเจธเจฎเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจซเจฒเจพเจˆ 'เจคเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจฏเจพเจจเฉ€. เจ•เฉเจฐเจฎ เจชเจฐเจฎเจพเจฃเฉ‚ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ replace = detach old program, attach new program. เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจชเฉเจฐเจพเจฃเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจฐเจ—เจฐเจฎ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจ†เจชเจฃเจพ เจ•เฉฐเจฎ เจ–เจคเจฎ เจ•เจฐ เจฆเฉ‡เจฃเจ—เฉ€เจ†เจ‚, เจ…เจคเฉ‡ เจจเจตเฉ‡เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเฉ‹เจ‚ เจจเจตเฉ‡เจ‚ เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจฌเจฃเจพเจ เจœเจพเจฃเจ—เฉ‡, เจ…เจคเฉ‡ เจ‡เฉฑเจฅเฉ‡ "เจเจŸเจฎเฉ€เจธเจฟเจŸเฉ€" เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจ• เจตเฉ€ เจ˜เจŸเจจเจพ เจ–เฉเฉฐเจเฉ€ เจจเจนเฉ€เจ‚ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจตเฉˆเจ‚เจŸ เจธเจฐเฉ‹เจคเจพเจ‚ เจจเจพเจฒ เจœเฉ‹เฉœเจจเจพ

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจตเฉˆเจ‚เจŸ เจธเจฐเฉ‹เจคเจพเจ‚ เจจเจพเจฒ เจœเฉ‹เฉœเจจ เจฆเจพ เจตเฉฑเจ–เจฐเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจฐเจฃเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจ‡เฉฑเจ• เจ–เจพเจธ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจš เจ‡เจธเจฆเจพ เจ…เจงเจฟเจเจจ เจ•เจฐเจจเจพ เจธเจฎเจเจฆเจพเจฐ เจนเฉˆเฅค เจธเฉ€.เจเจฎ. เจ‰เจฆเจพเจนเจฐเจจ เจนเฉ‡เจ เจพเจ‚, เจœเจฟเจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ XDP เจตเจฐเจ—เฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจฟเจตเฉ‡เจ‚ เจœเฉเฉœเฉ‡ เจนเฉ‹เจ เจนเจจเฅค

เจฌเฉ€เจชเฉ€เจเจซ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ†เจฌเจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจนเฉ‡เจฐเจพเจซเฉ‡เจฐเฉ€ เจ•เจฐเจจเจพ

เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ

เจธเจพเจฐเฉ€เจ†เจ‚ BPF เจตเจธเจคเฉ‚เจ†เจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจคเฉ‹เจ‚ เจฌเจฃเจพเจ‡เจ† เจ…เจคเฉ‡ เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ bpf, เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ‡ เจชเฉเจฐเฉ‹เจŸเฉ‹เจŸเจพเจˆเจช เจจเจพเจฒ:

#include <linux/bpf.h>

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

เจ‡เฉฑเจฅเฉ‡ เจŸเฉ€เจฎ เจนเฉˆ cmd เจ•เจฟเจธเจฎ เจฆเฉ‡ เจฎเฉเฉฑเจฒเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจนเฉˆ enum bpf_cmd, attr - เจ‡เฉฑเจ• เจ–เจพเจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจˆ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจ…เจคเฉ‡ size - เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจตเจธเจคเฉ‚ เจฆเจพ เจ†เจ•เจพเจฐ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เจน sizeof(*attr). เจ•เจฐเจจเจฒ 5.8 เจตเจฟเฉฑเจš เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ bpf 34 เจตเฉฑเจ–-เจตเฉฑเจ– เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจชเจฐเจฟเจญเจพเจธเจผเจพ union bpf_attr 200 เจฒเจพเจˆเจจเจพเจ‚ 'เจคเฉ‡ เจ•เจฌเจœเจผเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจชเจฐ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจคเฉ‹เจ‚ เจกเจฐเจจเจพ เจจเจนเฉ€เจ‚ เจšเจพเจนเฉ€เจฆเจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ•เจˆ เจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจนเฉเจ•เจฎเจพเจ‚ เจ…เจคเฉ‡ เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจจเจพเจฒ เจœเจพเจฃเฉ‚ เจนเฉ‹เจตเจพเจ‚เจ—เฉ‡เฅค

เจ†เจ‰ เจŸเฉ€เจฎ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚เจ†เจค เจ•เจฐเฉ€เจ BPF_PROG_LOAD, เจœเฉ‹ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ - BPF เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉˆเฉฑเจŸ เจฒเฉˆเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจฒเฉ‹เจก เจนเฉ‹เจฃ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจซเจฟเจฐ เจœเฉ‡เจ†เจˆเจŸเฉ€ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจ…เจคเฉ‡, เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจชเจฟเจ›เจฒเฉ‡ เจญเจพเจ— เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจฟเจ† เจนเฉˆ เจ•เจฟ เจ‰เจธ เจจเจพเจฒ เจ…เฉฑเจ—เฉ‡ เจ•เฉ€ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจฌเฉ€เจชเฉ€เจเจซ เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเฉ‡ เจœเฉ€เจตเจจ เจšเฉฑเจ•เจฐ เจฌเจพเจฐเฉ‡.

เจ…เจธเฉ€เจ‚ เจนเฉเจฃ เจ‡เฉฑเจ• เจ•เจธเจŸเจฎ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเฉ‡เจ—เจพ, เจชเจฐ เจชเจนเจฟเจฒเจพเจ‚ เจธเจพเจจเฉ‚เฉฐ เจ‡เจน เจซเฉˆเจธเจฒเจพ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ•เจฟเจธ เจ•เจฟเจธเจฎ เจฆเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเฉ‹เจก เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ - เจธเจพเจจเฉ‚เฉฐ เจšเฉเจฃเจจเจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจฆเฉ€ เจ•เจฟเจธเจฎ เจ…เจคเฉ‡ เจ‡เจธ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจฆเฉ‡ เจ…เฉฐเจฆเจฐ, เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจฟเจ–เฉ‹ เจœเฉ‹ เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ เจŸเฉˆเจธเจŸ เจชเจพเจธ เจ•เจฐเฉ‡เจ—เจพเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจจเจพ เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจคเจฟเจ†เจฐ เจนเฉฑเจฒ เจนเฉˆ: เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจตเจพเจ‚เจ—เฉ‡ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ BPF_PROG_TYPE_XDP, เจœเฉ‹ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจ•เจฐเฉ‡เจ—เจพ XDP_PASS (เจธเจพเจฐเฉ‡ เจชเฉˆเจ•เฉ‡เจœ เจ›เฉฑเจกเฉ‹)เฅค BPF เจ…เจธเฉˆเจ‚เจฌเจฒเจฐ เจตเจฟเฉฑเจš เจ‡เจน เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

r0 = 2
exit

เจฆเฉ‡ เจฌเจพเจ…เจฆ เจธเจพเจจเฉ‚เฉฐ 'เจคเฉ‡ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ เจนเฉˆ, เจœเฉ‹ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ…เจชเจฒเฉ‹เจก เจ•เจฐเจพเจ‚เจ—เฉ‡, เจ…เจธเฉ€เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡:

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

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

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

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

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

    for ( ;; )
        pause();
}

เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจช เจ˜เจŸเจจเจพเจตเจพเจ‚ เจ‡เฉฑเจ• เจเจฐเฉ‡ เจฆเฉ€ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ insns - เจฎเจธเจผเฉ€เจจ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจธเจพเจกเจพ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเฅค เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจนเจฐเฉ‡เจ• เจนเจฆเจพเจ‡เจค เจจเฉ‚เฉฐ เจขเจพเจ‚เจšเฉ‡ เจตเจฟเฉฑเจš เจชเฉˆเจ• เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ bpf_insn. เจชเจนเจฟเจฒเจพ เจคเฉฑเจค insns เจนเจฆเจพเจ‡เจคเจพเจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเจฆเจพ เจนเฉˆ r0 = 2, เจฆเฉ‚เจœเจพ - exit.

เจชเจฟเฉฑเจ›เฉ‡ เจนเจŸเจฃเจพเฅค เจ•เจฐเจจเจฒ เจฎเจธเจผเฉ€เจจ เจ•เฉ‹เจก เจฒเจฟเจ–เจฃ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจนเฉˆเจกเจฐ เจซเจพเจˆเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ เจตเจงเฉ‡เจฐเฉ‡ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจฎเฉˆเจ•เจฐเฉ‹ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ tools/include/linux/filter.h เจ…เจธเฉ€เจ‚ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเจพเจ‚

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

เจชเจฐ เจ•เจฟเจ‰เจ‚เจ•เจฟ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฎเฉ‚เจฒ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฃเจพ เจธเจฟเจฐเจซเจผ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจŸเฉˆเจธเจŸเจพเจ‚ เจ…เจคเฉ‡ BPF เจฌเจพเจฐเฉ‡ เจฒเฉ‡เจ–เจพเจ‚ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจฒเจˆ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ, เจ‡เจนเจจเจพเจ‚ เจฎเฉˆเจ•เจฐเฉ‹ เจฆเฉ€ เจ…เจฃเจนเฉ‹เจ‚เจฆ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฆเฉ‡ เจœเฉ€เจตเจจ เจจเฉ‚เฉฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค

BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเจจ เจฒเจˆ เจ…เฉฑเจ—เฉ‡ เจตเจงเจฆเฉ‡ เจนเจพเจ‚เฅค เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจฆเจพ เจธเจพเจกเจพ เจจเจฟเจŠเจจเจคเจฎ เจธเจฎเฉ‚เจน attr เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจ•เจฟเจธเจฎ, เจธเฉˆเฉฑเจŸ เจ…เจคเฉ‡ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€, เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจฒเจพเจ‡เจธเฉฐเจธ เจ…เจคเฉ‡ เจจเจพเจฎ เจธเจผเจพเจฎเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ "woo", เจœเจฟเจธ เจจเฉ‚เฉฐ เจ…เจธเฉ€เจ‚ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจธเจฟเจธเจŸเจฎ 'เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃ เจฒเจˆ เจตเจฐเจคเจฆเฉ‡ เจนเจพเจ‚เฅค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจตเจพเจ…เจฆเจพ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ bpf.

เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจ…เจจเฉฐเจค เจฒเฉ‚เจช เจตเจฟเฉฑเจš เจ–เจคเจฎ เจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹ เจชเฉ‡เจฒเฉ‹เจก เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚, เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจฆเฉเจ†เจฐเจพ เจฎเจพเจฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจœเจฆเฉ‹เจ‚ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจœเฉ‹ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจธเจพเจจเฉ‚เฉฐ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ เจฌเฉฐเจฆ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ bpf, เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡เฅค

เจ–เฉˆเจฐ, เจ…เจธเฉ€เจ‚ เจœเจพเจ‚เจš เจฒเจˆ เจคเจฟเจ†เจฐ เจนเจพเจ‚เฅค เจ†เจ‰ เจ‡เจ•เฉฑเจ เฉ‡ เจนเฉ‹ เจ•เฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ straceเจ‡เจน เจฆเฉ‡เจ–เจฃ เจฒเจˆ เจ•เจฟ เจธเจญ เจ•เฉเจ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เจน เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ:

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

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

เจธเจญ เจ•เฉเจ เจ เฉ€เจ• เจนเฉˆ, bpf(2) เจนเฉˆเจ‚เจกเจฒ 3 เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจตเจพเจชเจธ เจ†เจ‡เจ† เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจธเจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ…เจจเฉฐเจค เจฒเฉ‚เจช เจตเจฟเฉฑเจš เจšเจฒเฉ‡ เจ—เจ pause(). เจ†เจ‰ เจธเจฟเจธเจŸเจฎ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ. เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจŸเจฐเจฎเฉ€เจจเจฒ 'เจคเฉ‡ เจœเจพเจตเจพเจ‚เจ—เฉ‡ เจ…เจคเฉ‡ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡ bpftool:

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

เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจธเจฟเจธเจŸเจฎ เจ‰เฉฑเจคเฉ‡ เจ‡เฉฑเจ• เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจนเฉˆ woo เจœเจฟเจธเจฆเฉ€ เจ—เจฒเฉ‹เจฌเจฒ เจ†เจˆเจกเฉ€ 390 เจนเฉˆ เจ…เจคเฉ‡ เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš เจœเจพเจฐเฉ€ เจนเฉˆ simple-prog เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเฉฑเจฒ เจ‡เจธเจผเจพเจฐเจพ เจ•เจฐเจจ เจตเจพเจฒเจพ เจ‡เฉฑเจ• เจ“เจชเจจ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจนเฉˆ (เจ…เจคเฉ‡ เจœเฉ‡ simple-prog เจ•เฉฐเจฎ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเฉ‡เจ—เจพ, เจซเจฟเจฐ woo เจ…เจฒเฉ‹เจช เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพ). เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‰เจฎเฉ€เจฆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ woo BPF เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจตเจฟเฉฑเจš เจฌเจพเจˆเจจเจฐเฉ€ เจ•เฉ‹เจกเจพเจ‚ เจฆเฉ‡ - เจฆเฉ‹ เจจเจฟเจฐเจฆเฉ‡เจธเจผ - 16 เจฌเจพเจˆเจŸ เจฒเฉˆเจ‚เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เจธเจฆเฉ‡ เจฎเฉ‚เจฒ เจฐเฉ‚เจช (x86_64) เจตเจฟเฉฑเจš เจ‡เจน เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ 40 เจฌเจพเจˆเจŸ เจนเฉˆเฅค เจ†เจ‰ เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจ…เจธเจฒเฉ€ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจตเฉ‡เจ–เฉ€เจ:

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

เจ•เฉ‹เจˆ เจนเฉˆเจฐเจพเจจเฉ€ เจจเจนเฉ€เจ‚เฅค เจ†เจ‰ เจนเฉเจฃ JIT เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจฆเฉเจ†เจฐเจพ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ:

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

เจฒเจˆ เจฌเจนเฉเจค เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ exit(2), เจชเจฐ เจจเจฟเจฐเจชเฉฑเจ–เจคเจพ เจตเจฟเฉฑเจš, เจธเจพเจกเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจนเฉˆ, เจ…เจคเฉ‡ เจ—เฉˆเจฐ-เจฎเจพเจฎเฉ‚เจฒเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฒเจˆ เจœเฉ‡เจ†เจˆเจŸเฉ€ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจฆเฉเจ†เจฐเจพ เจœเฉ‹เฉœเจฟเจ† เจ—เจฟเจ† เจชเฉเจฐเฉ‹เจฒเฉ‹เจ— เจ…เจคเฉ‡ เจเจชเฉ€เจฒเฉ‹เจ—, เจฌเฉ‡เจธเจผเจ•, เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจนเฉˆเฅค

เจจเจ•เจธเจผเฉ‡

BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจขเจพเจ‚เจšเจพเจ—เจค เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ–เฉ‡เจคเจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจจ เจœเฉ‹ เจฆเฉ‚เจœเฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฒเจˆ เจชเจนเฉเฉฐเจšเจฏเฉ‹เจ— เจนเจจเฅค เจ‡เจนเจจเจพเจ‚ เจตเจธเจคเฉ‚เจ†เจ‚ เจจเฉ‚เฉฐ เจจเจ•เจธเจผเฉ‡ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจญเจพเจ— เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฆเจฟเจ–เจพเจตเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฆเจฒเจฃเจพ เจนเฉˆ bpf.

เจšเจฒเฉ‹ เจนเฉเจฃเฉ‡ เจฆเฉฑเจธ เจฆเฉ‡เจˆเจ เจ•เจฟ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจธเจฟเจฐเจซ เจธเจผเฉ‡เจ…เจฐเจก เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจคเฉฑเจ• เจธเฉ€เจฎเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆ. เจ‡เฉฑเจฅเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผ-เจ‰เจฆเฉ‡เจธเจผ เจตเจพเจฒเฉ‡ เจจเจ•เจธเจผเฉ‡ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฒเจˆ เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจœเจพเจ‚ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฒเจˆ เจชเฉเจ†เจ‡เฉฐเจŸเจฐ, เจชเจฐเจซ เจ‡เจตเฉˆเจ‚เจŸเจธ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจจเจ•เจธเจผเฉ‡ เจ†เจฆเจฟเฅค เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจฅเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจคเจพเจ‚ เจœเฉ‹ เจชเจพเจ เจ• เจจเฉ‚เฉฐ เจ‰เจฒเจเจฃ เจตเจฟเฉฑเจš เจจเจพ เจชเจตเฉ‡. เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ…เจธเฉ€เจ‚ เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจฎเฉเฉฑเจฆเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจจเจœเจผเจฐเจ…เฉฐเจฆเจพเจœเจผ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจธเจพเจกเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจฒเจˆ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ‰เจชเจฒเจฌเจง เจจเจ•เจธเจผเฉ‡ เจฆเฉ€เจ†เจ‚ เจ•เจฟเจธเจฎเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจชเฉ‚เจฐเฉ€ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจš เจฒเฉฑเจญเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ <linux/bpf.h>, เจ…เจคเฉ‡ เจ‡เจธ เจญเจพเจ— เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ‡เจคเจฟเจนเจพเจธเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจชเจนเจฟเจฒเฉ€ เจ•เจฟเจธเจฎ, เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจตเจœเฉ‹เจ‚ เจฒเจตเจพเจ‚เจ—เฉ‡ BPF_MAP_TYPE_HASH.

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

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

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

    for ( ;; )
        pause();
}

เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉˆเฉฑเจŸ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ attr, เจœเจฟเจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚ "เจฎเฉˆเจจเฉ‚เฉฐ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจ†เจ•เจพเจฐ เจฆเฉ‡ เจฎเฉเฉฑเจฒเจพเจ‚ เจตเจพเจฒเฉ€ เจ‡เฉฑเจ• เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ sizeof(int), เจœเจฟเจธ เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจšเจพเจฐ เจคเฉฑเจค เจฐเฉฑเจ– เจธเจ•เจฆเจพ เจนเจพเจ‚เฅค" BPF เจจเจ•เจธเจผเฉ‡ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจคเฉเจธเฉ€เจ‚ เจนเฉ‹เจฐ เจฎเจพเจชเจฆเฉฐเจก เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‰เจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจจเจพเจฒ เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ†เจฌเจœเฉˆเจ•เจŸ เจฆเจพ เจจเจพเจฎ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเฉฑเจคเจพ เจนเฉˆ "woo".

เจ†เจ‰ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ…เจคเฉ‡ เจฐเจจ เจ•เจฐเฉ€เจ:

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

เจ‡เฉฑเจฅเฉ‡ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจนเฉˆ bpf(2) เจธเจพเจจเฉ‚เฉฐ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจฎเฉˆเจช เจจเฉฐเจฌเจฐ เจตเจพเจชเจธ เจ•เฉ€เจคเจพ 3 เจ…เจคเฉ‡ เจซเจฟเจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‰เจฎเฉ€เจฆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเจฆเจพ เจนเฉˆ pause(2).

เจนเฉเจฃ เจ†เจ‰ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฌเฉˆเจ•เจ—เฉเจฐเจพเจ‰เจ‚เจก เจตเจฟเฉฑเจš เจญเฉ‡เจœเฉ€เจ เจœเจพเจ‚ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจŸเจฐเจฎเฉ€เจจเจฒ เจ–เฉ‹เจฒเฉเจนเฉ€เจ เจ…เจคเฉ‡ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ†เจชเจฃเฉ‡ เจ†เจฌเจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ bpftool (เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจจเจ•เจธเจผเฉ‡ เจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจจเจพเจฎ เจฆเฉเจ†เจฐเจพ เจฆเฉ‚เจœเจฟเจ†เจ‚ เจคเฉ‹เจ‚ เจตเฉฑเจ– เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚):

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

เจจเฉฐเจฌเจฐ 114 เจธเจพเจกเฉ€ เจตเจธเจคเฉ‚ เจฆเฉ€ เจ—เจฒเฉ‹เจฌเจฒ เจ†เจˆเจกเฉ€ เจนเฉˆเฅค เจธเจฟเจธเจŸเจฎ เจคเฉ‡ เจ•เฉ‹เจˆ เจตเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจจเจ•เจธเจผเฉ‡ เจจเฉ‚เฉฐ เจ–เฉ‹เจฒเฉเจนเจฃ เจฒเจˆ เจ‡เจธ ID เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ BPF_MAP_GET_FD_BY_ID เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ bpf.

เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ เจจเจพเจฒ เจ–เฉ‡เจก เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจ†เจ“ เจ‡เจธเจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ:

$ sudo bpftool map dump id 114
Found 0 elements

เจ–เจพเจฒเฉ€เฅค เจ†เจ“ เจ‡เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฎเฉเฉฑเจฒ เจชเจพเจˆเจ hash[1] = 1:

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

เจ†เจ‰ เจฆเฉเจฌเจพเจฐเจพ เจธเจพเจฐเจฃเฉ€ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ:

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

เจนเฉ‚เจฐเฉ‡! เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจคเฉฑเจค เจœเฉ‹เฉœเจจ เจตเจฟเฉฑเจš เจ•เจพเจฎเจฏเจพเจฌ เจฐเจนเฉ‡เฅค เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ เจฌเจพเจˆเจŸ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจชเจตเฉ‡เจ—เจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ bptftool เจชเจคเจพ เจจเจนเฉ€เจ‚ เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ เจตเจฟเฉฑเจš เจ•เจฟเจธ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจฎเฉเฉฑเจฒ เจนเจจเฅค (เจ‡เจน เจ—เจฟเจ†เจจ BTF เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‰เจธ เจจเฉ‚เฉฐ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจนเฉเจฃ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐเฅค)

bpftool เจคเฉฑเจค เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจชเฉœเฉเจนเจฆเจพ เจ…เจคเฉ‡ เจœเฉ‹เฉœเจฆเจพ เจนเฉˆ? เจ†เจ“ เจนเฉเฉฑเจก เจฆเฉ‡ เจนเฉ‡เจ เจพเจ‚ เจ‡เฉฑเจ• เจจเจœเจผเจฐ เจฎเจพเจฐเฉ€เจ:

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

เจชเจนเจฟเจฒเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจจเจ•เจธเจผเฉ‡ เจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจ—เจฒเฉ‹เจฌเจฒ ID เจฆเฉเจ†เจฐเจพ เจ–เฉ‹เจฒเฉเจนเจฟเจ† BPF_MAP_GET_FD_BY_ID ะธ bpf(2) เจธเจพเจจเฉ‚เฉฐ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ 3 เจตเจพเจชเจธ เจ•เฉ€เจคเจพเฅค เจ…เฉฑเจ—เฉ‡ เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ BPF_MAP_GET_NEXT_KEY เจธเจพเจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจ•เฉ‡ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเฉ€ เจ•เฉเฉฐเจœเฉ€ เจฎเจฟเจฒเฉ€ NULL "เจชเจฟเจ›เจฒเฉ€" เจ•เฉเฉฐเจœเฉ€ เจฒเจˆ เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจตเจœเฉ‹เจ‚เฅค เจœเฉ‡เจ•เจฐ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ•เฉเฉฐเจœเฉ€ เจนเฉˆ เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ BPF_MAP_LOOKUP_ELEMเจœเฉ‹ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ value. เจ…เจ—เจฒเจพ เจ•เจฆเจฎ เจ‡เจน เจนเฉˆ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ เจ•เฉเฉฐเจœเฉ€ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจชเจพเจธ เจ•เจฐเจ•เฉ‡ เจ…เจ—เจฒเจพ เจเจฒเฉ€เจฎเฉˆเจ‚เจŸ เจฒเฉฑเจญเจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจชเจฐ เจธเจพเจกเฉ€ เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจเจฒเฉ€เจฎเฉˆเจ‚เจŸ เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค BPF_MAP_GET_NEXT_KEY เจตเจพเจชเจธเฉ€ ENOENT.

เจ เฉ€เจ• เจนเฉˆ, เจ†เจ“ เจ•เฉเฉฐเจœเฉ€ 1 เจฆเฉเจ†เจฐเจพ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจฌเจฆเจฒเฉ€เจ, เจฎเฉฐเจจ เจฒเจ“ เจ•เจฟ เจธเจพเจกเฉ‡ เจตเจชเจพเจฐเจ• เจคเจฐเจ• เจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ hash[1] = 2:

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

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‰เจฎเฉ€เจฆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจ‡เจน เจฌเจนเฉเจค เจธเจงเจพเจฐเจจ เจนเฉˆ: เจ•เจฎเจพเจ‚เจก BPF_MAP_GET_FD_BY_ID ID, เจ…เจคเฉ‡ เจ•เจฎเจพเจ‚เจก เจฆเฉเจ†เจฐเจพ เจธเจพเจกเจพ เจจเจ•เจธเจผเจพ เจ–เฉ‹เจฒเฉเจนเจฆเจพ เจนเฉˆ BPF_MAP_UPDATE_ELEM เจคเฉฑเจค เจจเฉ‚เฉฐ เจ“เจตเจฐเจฐเจพเจˆเจŸ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ‡เจธ เจฒเจˆ, เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเฉ‹เจ‚ เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ เจฌเจฃเจพเจ‰เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจฆเฉ‚เจœเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเฉ‹เจ‚ เจ‡เจธเจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจชเฉœเฉเจน เจ…เจคเฉ‡ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจธเฉ€, เจคเจพเจ‚ เจธเจฟเจธเจŸเจฎ เจคเฉ‡ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเฉ‡ เจ—เจ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ, ัะปะตะดัƒัŽั‰ะธะต:

  • BPF_MAP_LOOKUP_ELEM: เจ•เฉเฉฐเจœเฉ€ เจฆเฉเจ†เจฐเจพ เจฎเฉเฉฑเจฒ เจฒเฉฑเจญเฉ‹
  • BPF_MAP_UPDATE_ELEM: เจฎเฉเฉฑเจฒ เจ…เฉฑเจชเจกเฉ‡เจŸ/เจฌเจฃเจพเจ“
  • BPF_MAP_DELETE_ELEM: เจšเจพเจฌเฉ€ เจจเฉ‚เฉฐ เจนเจŸเจพเจ“
  • BPF_MAP_GET_NEXT_KEY: เจ…เจ—เจฒเฉ€ (เจœเจพเจ‚ เจชเจนเจฟเจฒเฉ€) เจ•เฉเฉฐเจœเฉ€ เจฒเฉฑเจญเฉ‹
  • BPF_MAP_GET_NEXT_ID: เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจพเจฐเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฒเฉฐเจ˜เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ‡เจน เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ bpftool map
  • BPF_MAP_GET_FD_BY_ID: เจ‡เจธเจฆเฉ€ เจ—เจฒเฉ‹เจฌเจฒ เจ†เจˆเจกเฉ€ เจฆเฉเจ†เจฐเจพ เจ‡เฉฑเจ• เจฎเฉŒเจœเฉ‚เจฆเจพ เจจเจ•เจธเจผเจพ เจ–เฉ‹เจฒเฉเจนเฉ‹
  • BPF_MAP_LOOKUP_AND_DELETE_ELEM: เจ•เจฟเจธเฉ‡ เจตเจธเจคเฉ‚ เจฆเฉ‡ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจชเฉเจฐเจฎเจพเจฃเฉ‚ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจชเฉเจฐเจพเจฃเฉ€ เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจ•เจฐเฉ‹
  • BPF_MAP_FREEZE: เจฏเฉ‚เจœเจผเจฐเจธเจชเฉ‡เจธ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเฉ‡ เจจเฉ‚เฉฐ เจ…เจŸเฉฑเจฒ เจฌเจฃเจพเจ“ (เจ‡เจธ เจ•เจพเจฐเจตเจพเจˆ เจจเฉ‚เฉฐ เจ…เจจเจกเฉ‚เจจ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ)
  • BPF_MAP_LOOKUP_BATCH, BPF_MAP_LOOKUP_AND_DELETE_BATCH, BPF_MAP_UPDATE_BATCH, BPF_MAP_DELETE_BATCH: เจชเฉเฉฐเจœ เจ“เจชเจฐเฉ‡เจธเจผเจจเฅค เจ‰เจฆเจพเจนเจฐเจฃ เจฒเจˆ, BPF_MAP_LOOKUP_AND_DELETE_BATCH - เจจเจ•เจธเจผเฉ‡ เจคเฉ‹เจ‚ เจธเจพเจฐเฉ‡ เจฎเฉเฉฑเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจ…เจคเฉ‡ เจฐเฉ€เจธเฉˆเจŸ เจ•เจฐเจจ เจฆเจพ เจ‡เจน เจ‡เฉฑเจ•เฉ‹ เจ‡เฉฑเจ• เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจคเจฐเฉ€เจ•เจพ เจนเฉˆ

เจ‡เจน เจธเจพเจฐเฉ€เจ†เจ‚ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจจเจ•เจธเจผเฉ‡ เจ•เจฟเจธเจฎเจพเจ‚ เจฒเจˆ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ€เจ†เจ‚, เจชเจฐ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจคเฉ‹เจ‚ เจนเฉ‹เจฐ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒเจพเจ‚ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจ‚เจ— เจนเฉ€ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจ†เจฐเจกเจฐ เจฆเฉ€ เจ–เจผเจพเจคเจฐ, เจ†เจ“ เจธเจพเจกเฉ‡ เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ เจชเฉเจฐเจฏเฉ‹เจ—เจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเฉ€เจเฅค เจฏเจพเจฆ เจฐเฉฑเจ–เฉ‹ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจพเจฐเจฃเฉ€ เจฌเจฃเจพเจˆ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจšเจพเจฐ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจธเจผเจพเจฎเจฒ เจนเฉ‹ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ? เจ†เจ“ เจ•เฉเจ เจนเฉ‹เจฐ เจคเฉฑเจค เจœเฉ‹เฉœเฉ€เจ:

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

เจนเฉเจฃ เจคเฉฑเจ• เจฌเจนเฉเจค เจตเจงเฉ€เจ†:

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

เจ†เจ‰ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจœเฉ‹เฉœเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ:

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

เจœเจฟเจตเฉ‡เจ‚ เจ‰เจฎเฉ€เจฆ เจธเฉ€, เจ…เจธเฉ€เจ‚ เจธเจซเจฒ เจจเจนเฉ€เจ‚ เจนเฉ‹เจเฅค เจ†เจ‰ เจ—เจฒเจคเฉ€ เจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจตเฉ‡เจ–เฉ€เจ:

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

เจธเจญ เจ•เฉเจ เจ เฉ€เจ• เจนเฉˆ: เจ‰เจฎเฉ€เจฆ เจ…เจจเฉเจธเจพเจฐ, เจŸเฉ€เจฎ BPF_MAP_UPDATE_ELEM เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚, เจชเฉฐเจœเจตเฉ€เจ‚, เจ•เฉเฉฐเจœเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจ•เจฐเฉˆเจธเจผ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ E2BIG.

เจ‡เจธ เจฒเจˆ, เจ…เจธเฉ€เจ‚ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจพ เจ…เจคเฉ‡ เจฒเฉ‹เจก เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจจเจพเจฒ เจนเฉ€ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเฉ‡ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจนเฉเจฃ เจ‡เจน เจฆเฉ‡เจ–เจฃเจพ เจคเจฐเจ•เจธเฉฐเจ—เจค เจนเฉˆ เจ•เจฟ เจ…เจธเฉ€เจ‚ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเฉ‡ เจ•เจฟเจตเฉ‡เจ‚ เจตเจฐเจค เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจฎเจธเจผเฉ€เจจ เจฎเฉˆเจ•เจฐเฉ‹ เจ•เฉ‹เจกเจพเจ‚ เจตเจฟเฉฑเจš เจชเฉœเฉเจนเฉ‡ เจœเจพเจฃ เจตเจพเจฒเฉ‡ เจนเจพเจฐเจก-เจŸเฉ‚-เจชเฉœเฉเจนเจจ เจตเจพเจฒเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเฉ€ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจ—เฉฑเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจชเจฐ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เจน เจฆเจฟเจ–เจพเจ‰เจฃ เจฆเจพ เจธเจฎเจพเจ‚ เจ† เจ—เจฟเจ† เจนเฉˆ เจ•เจฟ เจ•เจฟเจตเฉ‡เจ‚ เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ…เจคเฉ‡ เจธเฉฐเจญเจพเจฒเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ - เจตเจฐเจคเจฆเฉ‡ เจนเฉ‹เจ libbpf.

(เจ‰เจจเฉเจนเจพเจ‚ เจชเจพเจ เจ•เจพเจ‚ เจฒเจˆ เจœเฉ‹ เจ˜เฉฑเจŸ-เจชเฉฑเจงเจฐเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ€ เจ˜เจพเจŸ เจคเฉ‹เจ‚ เจ…เจธเฉฐเจคเฉเจธเจผเจŸ เจนเจจ: เจ…เจธเฉ€เจ‚ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจจเจ•เจธเจผเฉ‡ เจ…เจคเฉ‡ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฌเจฃเจพเจ เจ—เจ เจนเจจ. libbpf เจ…เจคเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธเฉ‹ เจ•เจฟ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจฆเฉ‡ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจ•เฉ€ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจ‰เจนเจจเจพเจ‚ เจชเจพเจ เจ•เจพเจ‚ เจฒเจˆ เจœเฉ‹ เจ…เจธเฉฐเจคเฉเจธเจผเจŸ เจนเจจ เจฌเจนเฉเจค, เจ…เจธเฉ€เจ‚ เจœเฉ‹เฉœเจฟเจ† เจ‰เจฆเจพเจนเจฐเจจ เจฒเฉ‡เจ– เจตเจฟเจš เจขเฉเจ•เจตเฉ€เจ‚ เจฅเจพเจ‚ 'เจคเฉ‡เฅค)

libbpf เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃเจพ

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

เจตเจพเจธเจคเจต เจตเจฟเฉฑเจš, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจ…เจคเฉ‡ เจ…เจ—เจฒเฉ‡ เจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจš เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡, libbpf เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจฌเจนเฉเจค เจธเจพเจฐเจพ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ (เจœเจพเจ‚ เจธเจฎเจพเจจ เจธเจพเจงเจจ - iproute2, libbcc, libbpf-go, เจ†เจฆเจฟ) เจฐเจนเจฟเจฃเจพ เจ…เจธเฉฐเจญเจต เจนเฉˆเฅค เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€เจ†เจ‚ เจ•เจพเจคเจฒ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• libbpf เจ•เฉ€ BPF CO-RE (เจ‡เฉฑเจ• เจตเจพเจฐ เจ•เฉฐเจชเจพเจˆเจฒ เจ•เจฐเฉ‹, เจนเจฐ เจฅเจพเจ‚ เจšเจฒเจพเจ“) - เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจ‡เฉฑเจ• เจ•เจฐเจจเจฒ เจคเฉ‹เจ‚ เจฆเฉ‚เจœเฉ‡ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจชเฉ‹เจฐเจŸเฉ‡เจฌเจฒ เจนเจจ, เจตเฉฑเจ–-เจตเฉฑเจ– API 'เจคเฉ‡ เจšเฉฑเจฒเจฃ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจจเจพเจฒ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจœเจฆเฉ‹เจ‚ เจ•เจฐเจจเจฒ เจฌเจฃเจคเจฐ เจตเจฐเจœเจจ เจคเฉ‹เจ‚ เจฌเจฆเจฒเจฆเจพ เจนเฉˆเฅค เจธเฉฐเจธเจ•เจฐเจฃ เจคเฉฑเจ•). CO-RE เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃ เจฒเจˆ, เจคเฉเจนเจพเจกเฉ‡ เจ•เจฐเจจเจฒ เจจเฉ‚เฉฐ BTF เจธเจนเจพเจ‡เจคเจพ เจจเจพเจฒ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ (เจ…เจธเฉ€เจ‚ เจธเฉˆเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจตเจฐเจฃเจจ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเจจเจพ เจนเฉˆ เจตเจฟเจ•เจพเจธ เจธเจพเจงเจจ. เจคเฉเจธเฉ€เจ‚ เจœเจพเจ‚เจš เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ•เฉ€ เจคเฉเจนเจพเจกเจพ เจ•เจฐเจจเจฒ 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 เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• git เจธเจฌเจฎเฉ‹เจกเจฟเจŠเจฒ เจตเจœเฉ‹เจ‚ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹, เจ…เจธเฉ€เจ‚ เจ‰เจนเฉ€ เจ•เจฐเจพเจ‚เจ—เฉ‡:

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

เจจเฉ‚เฉฐ เจœเจพเจฃเจพ libbpf เจฌเจนเฉเจค เจนเฉ€ เจธเจงเจพเจฐเจจ:

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

เจ‡เจธ เจญเจพเจ— เจตเจฟเฉฑเจš เจธเจพเจกเฉ€ เจ…เจ—เจฒเฉ€ เจฏเฉ‹เจœเจจเจพ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจนเฉˆ: เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ BPF_PROG_TYPE_XDP, เจชเจฟเจ›เจฒเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจตเจพเจ‚เจ— เจนเฉ€, เจชเจฐ C เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจตเจฐเจค เจ•เฉ‡ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ clang, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจธเจนเจพเจ‡เจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจฟเจ–เฉ‹ เจœเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเฉ‡เจ—เจพเฅค เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจญเจพเจ—เจพเจ‚ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ…เจคเฉ‡ เจธเจนเจพเจ‡เจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‹เจตเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจฆเจพ เจตเจฟเจธเจคเจพเจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

เจ‰เจฆเจพเจนเจฐเจจ: libbpf เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เฉฑเจ• เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃเจพ

เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจซเจพเจˆเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ /sys/kernel/btf/vmlinux, เจœเจฟเจธเจฆเจพ เจ‰เฉฑเจชเจฐ เจœเจผเจฟเจ•เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ– เจซเจพเจˆเจฒ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เจธเจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจฌเจฃเจพเจ“:

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

เจ‡เจน เจซเจพเจˆเจฒ เจธเจพเจกเฉ‡ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจ‰เจชเจฒเจฌเจง เจธเจพเจฐเฉ‡ เจกเฉ‡เจŸเจพ เจขเจพเจ‚เจšเฉ‡ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเฉ‡เจ—เฉ€, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš IPv4 เจธเจฟเจฐเจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ:

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

เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเจพ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ C เจตเจฟเฉฑเจš เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡:

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

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

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

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

เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ llvm/clang, เจธเฉฐเจธเจ•เจฐเจฃ >= 10.0.0, เจœเจพเจ‚ เจ‡เจธ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ†, เจ‡เจธ เจคเฉ‹เจ‚ เจตเฉฑเจง เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ (เจธเฉˆเจ•เจธเจผเจจ เจตเฉ‡เจ–เฉ‹ เจตเจฟเจ•เจพเจธ เจธเจพเจงเจจ):

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

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

เจฆเจฟเจฒเจšเจธเจช เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚: เจ…เจธเฉ€เจ‚ เจจเจฟเจธเจผเจพเจจเจพ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ -target bpf เจ…เจคเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจฆเจพ เจฎเจพเจฐเจ— libbpf, เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจนเจพเจฒ เจนเฉ€ เจตเจฟเฉฑเจš เจธเจฅเจพเจชเจฟเจค เจ•เฉ€เจคเจพ เจนเฉˆเฅค เจจเจพเจฒ เจนเฉ€, เจฌเจพเจฐเฉ‡ เจจเจพ เจญเฉเฉฑเจฒเฉ‹ -O2, เจ‡เจธ เจตเจฟเจ•เจฒเจช เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจนเฉˆเจฐเจพเจจเฉ€ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ†เจ“ เจ†เจชเจฃเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ, เจ•เฉ€ เจ…เจธเฉ€เจ‚ เจ‰เจน เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจฟเจ–เจฃ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจง เจ•เฉ€เจคเจพ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจธเฉ€?

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

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

Disassembly of section xdp/simple:

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

เจนเจพเจ‚, เจ‡เจน เจ•เฉฐเจฎ เจ•เฉ€เจคเจพ! เจนเฉเจฃ, เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจฌเจพเจˆเจจเจฐเฉ€ เจซเจพเจˆเจฒ เจนเฉˆ, เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเฉ‡เจ—เฉ€เฅค เจ‡เจธ เจฎเฉฐเจคเจต เจฒเจˆ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ libbpf เจธเจพเจจเฉ‚เฉฐ เจฆเฉ‹ เจตเจฟเจ•เจฒเจช เจชเฉ‡เจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ - เจ‡เฉฑเจ• เจนเฉ‡เจ เจฒเฉ‡-เจชเฉฑเจงเจฐ เจฆเจพ API เจœเจพเจ‚ เจ‰เฉฑเจš-เจชเฉฑเจงเจฐเฉ€ API เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹เฅค เจ…เจธเฉ€เจ‚ เจฆเฉ‚เจœเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจœเจพเจตเจพเจ‚เจ—เฉ‡, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจธเจฟเฉฑเจ–เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจ…เจ—เจฒเฉ‡ เจ…เจงเจฟเจเจจ เจฒเจˆ เจ˜เฉฑเจŸ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจฎเจฟเจนเจจเจค เจจเจพเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ–เจฃเจพ, เจฒเฉ‹เจก เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเจพเจฒ เจœเฉเฉœเจจเจพ เจนเฉˆเฅค

เจชเจนเจฟเจฒเจพเจ‚, เจธเจพเจจเฉ‚เฉฐ เจ‰เจธเฉ‡ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ‡เจธเจฆเฉ€ เจฌเจพเจˆเจจเจฐเฉ€ เจคเฉ‹เจ‚ เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเจพ "เจธเจ•เจฒเฉ‡เจŸเจจ" เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค bpftool - BPF เจธเฉฐเจธเจพเจฐ เจฆเจพ เจธเจตเจฟเจธ เจšเจพเจ•เฉ‚ (เจœเจฟเจธ เจจเฉ‚เฉฐ เจธเจผเจพเจฌเจฆเจฟเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจฒเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจกเฉˆเจจเฉ€เจ…เจฒ เจฌเฉ‹เจฐเจ•เจฎเฉˆเจจ, BPF เจฆเฉ‡ เจธเจฟเจฐเจœเจฃเจนเจพเจฐเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ•, เจธเจตเจฟเจธ เจนเฉˆ):

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

เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš xdp-simple.skel.h เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเจพ เจฌเจพเจˆเจจเจฐเฉ€ เจ•เฉ‹เจก เจ…เจคเฉ‡ เจชเฉเจฐเจฌเฉฐเจงเจจ เจฒเจˆ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจธเจผเจพเจฎเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ - เจธเจพเจกเฉ‡ เจ†เจฌเจœเฉˆเจ•เจŸ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเจจเจพ, เจ…เจŸเฉˆเจš เจ•เจฐเจจเจพ, เจฎเจฟเจŸเจพเจ‰เจฃเจพเฅค เจธเจพเจกเฉ‡ เจธเจงเจพเจฐเจจ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจ‡เจน เจ“เจตเจฐเจ•เจฟเฉฑเจฒ เจตเจฐเจ—เจพ เจฒเฉฑเจ—เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เจน เจ‰เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจตเฉ€ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจ†เจฌเจœเฉˆเจ•เจŸ เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ…เจคเฉ‡ เจจเจ•เจธเจผเฉ‡ เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจ‡เจธ เจตเจฟเจธเจผเจพเจฒ ELF เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเจจ เจฒเจˆ เจธเจพเจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจชเจฟเฉฐเจœเจฐ เจคเจฟเจ†เจฐ เจ•เจฐเจจ เจ…เจคเฉ‡ เจ•เจธเจŸเจฎ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจœเจพเจ‚ เจฆเฉ‹ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจฒเจฟเจ– เจฐเจนเฉ‡ เจนเจจ เจšเจฒเฉ‹ เจนเฉเจฃ เจ…เฉฑเจ—เฉ‡ เจตเจงเจฆเฉ‡ เจนเจพเจ‚เฅค

เจธเจ–เจคเฉ€ เจจเจพเจฒ เจฌเฉ‹เจฒเจฆเฉ‡ เจนเฉ‹เจ, เจธเจพเจกเจพ เจฒเฉ‹เจกเจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฎเจพเจฎเฉ‚เจฒเฉ€ เจนเฉˆ:

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

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

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

    pause();

    xdp_simple_bpf__destroy(obj);
}

เจ‡เจน เจ‡เจธ เจฒเจˆ เจนเฉˆ struct xdp_simple_bpf เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ xdp-simple.skel.h เจ…เจคเฉ‡ เจธเจพเจกเฉ€ เจ†เจฌเจœเฉˆเจ•เจŸ เจซเจพเจˆเจฒ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆ:

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

เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจจเฉ€เจตเฉ‡เจ‚-เจชเฉฑเจงเจฐ เจฆเฉ‡ API เจฆเฉ‡ เจจเจฟเจธเจผเจพเจจ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเจพเจ‚: เจขเจพเจ‚เจšเจพ struct bpf_program *simple ะธ struct bpf_link *simple. เจชเจนเจฟเจฒเจพ เจขเจพเจ‚เจšเจพ เจตเจฟเจธเจผเฉ‡เจธเจผ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจธเฉˆเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆ xdp/simple, เจ…เจคเฉ‡ เจฆเฉ‚เจœเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ‡เจตเฉˆเจ‚เจŸ เจธเจฐเฉ‹เจค เจจเจพเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจœเฉเฉœเจฆเจพ เจนเฉˆเฅค

เจซเฉฐเจ•เจธเจผเจจ xdp_simple_bpf__open_and_load, เจ‡เฉฑเจ• ELF เจ†เจฌเจœเฉˆเจ•เจŸ เจ–เฉ‹เจฒเฉเจนเจฆเจพ เจนเฉˆ, เจ‡เจธเจจเฉ‚เฉฐ เจชเจพเจฐเจธ เจ•เจฐเจฆเจพ เจนเฉˆ, เจธเจพเจฐเฉ‡ เจขเจพเจ‚เจšเฉ‡ เจ…เจคเฉ‡ เจธเจฌเจธเจŸเจฐเจ•เจšเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ (เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, ELF เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจญเจพเจ— เจตเฉ€ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ - เจกเฉ‡เจŸเจพ, เจธเจฟเจฐเจซเจผ เจชเฉœเฉเจนเจจ เจฒเจˆ เจกเจพเจŸเจพ, เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ— เจœเจพเจฃเจ•เจพเจฐเฉ€, เจฒเจพเจ‡เจธเฉˆเจ‚เจธ, เจ†เจฆเจฟ), เจ…เจคเฉ‡ เจซเจฟเจฐ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฟเจธเจŸเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ•เจพเจฒ เจ•เจฐเฉ‹ bpf, เจœเจฟเจธ เจจเฉ‚เฉฐ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ…เจคเฉ‡ เจšเจฒเจพ เจ•เฉ‡ เจšเฉˆเฉฑเจ• เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

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

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

เจ†เจ“ เจนเฉเจฃ เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจตเฉ‡เจ–เฉ€เจ bpftool. เจ†เจ“ เจ‰เจธเจฆเฉ€ เจ†เจˆเจกเฉ€ เจฒเฉฑเจญเฉ€เจ:

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

เจ…เจคเฉ‡ เจกเฉฐเจช (เจ…เจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจฆเจพ เจ›เฉ‹เจŸเจพ เจฐเฉ‚เจช เจตเจฐเจคเจฆเฉ‡ เจนเจพเจ‚ bpftool prog dump xlated):

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

เจ•เฉเจ เจจเจตเจพเจ‚! เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‡ เจธเจพเจกเฉ€ C เจธเจฐเฉ‹เจค เจซเจพเจˆเจฒ เจฆเฉ‡ เจŸเฉเจ•เฉœเฉ‡ เจ›เจพเจชเฉ‡เฅค เจ‡เจน เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ libbpf, เจœเจฟเจธ เจจเฉ‡ เจฌเจพเจˆเจจเจฐเฉ€ เจตเจฟเฉฑเจš เจกเฉ€เจฌเฉฑเจ— เจธเฉˆเจ•เจธเจผเจจ เจฒเฉฑเจญเจฟเจ†, เจ‡เจธเจจเฉ‚เฉฐ เจ‡เฉฑเจ• BTF เจ†เจฌเจœเฉˆเจ•เจŸ เจตเจฟเฉฑเจš เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เฉ€เจคเจพ, เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เฉ€เจคเจพ BPF_BTF_LOAD, เจ…เจคเฉ‡ เจซเจฟเจฐ เจ•เจฎเจพเจ‚เจก เจจเจพเจฒ เจชเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเฉ‹เจก เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจจเจคเฉ€เจœเจพ เจซเจพเจ‡เจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเฉ‹ BPG_PROG_LOAD.

เจ•เจฐเจจเจฒ เจธเจนเจพเจ‡เจ•

BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ "เจฌเจพเจนเจฐเฉ€" เจซเฉฐเจ•เจธเจผเจจ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเจจ - เจ•เจฐเจจเจฒ เจธเจนเจพเจ‡เจ•เฅค เจ‡เจน เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจขเจพเจ‚เจšเฉ‡ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐเจจ, เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจจ, เจ…เจคเฉ‡ "เจ…เจธเจฒ เจธเฉฐเจธเจพเจฐ" เจจเจพเจฒ เจธเฉฐเจšเจพเจฐ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจ - เจชเจฐเจซ เจ‡เจตเฉˆเจ‚เจŸเจธ เจฌเจฃเจพเจ‰เจฃ, เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ เจจเฉ‚เฉฐ เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจ•เจฐเจจ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฐเฉ€เจกเจพเจ‡เจฐเฉˆเจ•เจŸ เจชเฉˆเจ•เฉ‡เจŸ), เจ†เจฆเจฟเฅค

เจ‰เจฆเจพเจนเจฐเจจ: bpf_get_smp_processor_id

"เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉเจ†เจฐเจพ เจธเจฟเฉฑเจ–เจฃเจพ" เจชเฉˆเจฐเจพเจกเจพเจˆเจฎ เจฆเฉ‡ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ, เจ†เจ“ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ€เจ, bpf_get_smp_processor_id(), เจจเจฟเจธเจผเจšเจฟเจค เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš kernel/bpf/helpers.c. เจ‡เจน เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจฆเจพ เจจเฉฐเจฌเจฐ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจธ 'เจคเฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจœเจฟเจธ เจจเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฌเฉเจฒเจพเจ‡เจ† เจนเฉˆ เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉˆเฅค เจชเจฐ เจ…เจธเฉ€เจ‚ เจ‡เจธเจฆเฉ‡ เจ…เจฐเจฅ เจตเจฟเจ—เจฟเจ†เจจ เจตเจฟเฉฑเจš เจ‡เฉฐเจจเฉ€ เจฆเจฟเจฒเจšเจธเจชเฉ€ เจจเจนเฉ€เจ‚ เจฐเฉฑเจ–เจฆเฉ‡ เจœเจฟเฉฐเจจเจพ เจ‡เจธ เจคเฉฑเจฅ เจตเจฟเฉฑเจš เจ•เจฟ เจ‡เจธเจฆเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฒเจพเจˆเจจ เจฒเฉฑเจ—เจฆเฉ€ เจนเฉˆ:

BPF_CALL_0(bpf_get_smp_processor_id)
{
    return smp_processor_id();
}

BPF เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจ เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ‚ เจฒเฉ€เจจเจ•เจธ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ‚ เจฆเฉ‡ เจธเจฎเจพเจจ เจนเจจเฅค เจ‡เฉฑเจฅเฉ‡, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจœเจฟเจธเจฆเจพ เจ•เฉ‹เจˆ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค (เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจœเฉ‹ เจฒเฉˆเจ‚เจฆเฉ€ เจนเฉˆ, เจ•เจนเฉ‹, เจคเจฟเฉฐเจจ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฎเฉˆเจ•เจฐเฉ‹ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ BPF_CALL_3. เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ เจฆเฉ€ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจ—เจฟเจฃเจคเฉ€ เจชเฉฐเจœ เจนเฉˆเฅค) เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจน เจชเจฐเจฟเจญเจพเจธเจผเจพ เจฆเจพ เจธเจฟเจฐเจซ เจชเจนเจฟเจฒเจพ เจนเจฟเฉฑเจธเจพ เจนเฉˆเฅค เจฆเฉ‚เจœเจพ เจนเจฟเฉฑเจธเจพ เจ•เจฟเจธเจฎ เจฆเฉ€ เจฌเจฃเจคเจฐ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจเจพ เจนเฉˆ struct bpf_func_proto, เจœเจฟเจธ เจตเจฟเฉฑเจš เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจ เจฆเจพ เจตเฉ‡เจฐเจตเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฟเจธเจจเฉ‚เฉฐ เจชเฉเจฐเจฎเจพเจฃเจ• เจธเจฎเจเจฆเจพ เจนเฉˆ:

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

เจนเฉˆเจฒเจชเจฐ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจจเจพ

เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจ•เจฟเจธเจฎ เจฆเฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจธ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจธ เจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ เจ•เจฟเจธเจฎ เจฒเจˆ BPF_PROG_TYPE_XDP เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ xdp_func_proto, เจœเฉ‹ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจ ID เจคเฉ‹เจ‚ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ XDP เจ‡เจธ เจซเฉฐเจ•เจธเจผเจจ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจพเจ‚ เจจเจนเฉ€เจ‚เฅค เจธเจพเจกเจพ เจ•เจพเจฐเจœ เจนเฉˆ เจจเฉ‚เฉฐ เจธเจนเจฟเจฏเฉ‹เจ— เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

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

เจจเจตเฉ€เจ‚ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจฟเจธเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš "เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค" เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ include/linux/bpf_types.h เจ‡เฉฑเจ• เจฎเฉˆเจ•เจฐเฉ‹ เจตเจฐเจค เจ•เฉ‡ BPF_PROG_TYPE. เจ•เฉ‹เจŸเจธ เจตเจฟเฉฑเจš เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจ‡เฉฑเจ• เจฒเจพเจœเจผเฉ€เจ•เจฒ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจนเฉˆ, เจ…เจคเฉ‡ C เจญเจพเจธเจผเจพ เจฆเฉ‡ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš เจ•เฉฐเจ•เจฐเฉ€เจŸ เจฌเจฃเจคเจฐเจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจชเฉ‚เจฐเฉ‡ เจธเจฎเฉ‚เจน เจฆเฉ€ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจนเฉ‹เจฐ เจธเจฅเจพเจจเจพเจ‚ เจตเจฟเฉฑเจš เจตเจพเจชเจฐเจฆเฉ€ เจนเฉˆเฅค เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡, เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš kernel/bpf/verifier.c เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ‚ bpf_types.h เจขเจพเจ‚เจšเฉ‡ เจฆเฉ€ เจ‡เฉฑเจ• เจฒเฉœเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ bpf_verifier_ops[]:

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

เจญเจพเจต, เจนเจฐเฉ‡เจ• เจ•เจฟเจธเจฎ เจฆเฉ‡ เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจˆ, เจ•เจฟเจธเจฎ เจฆเฉ‡ เจกเฉ‡เจŸเจพ เจขเจพเจ‚เจšเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ struct bpf_verifier_ops, เจœเฉ‹ เจ•เจฟ เจฎเฉเฉฑเจฒ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ _name ## _verifier_ops, เจญเจพเจต, xdp_verifier_ops เจจเฉ‚เฉฐ xdp... เจฌเจฃเจคเจฐ xdp_verifier_ops เจฆเฉเจ†เจฐเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš net/core/filter.c เจนเฉ‡เจ  เจฒเจฟเจ–เฉ‡ เจ…เจจเฉเจธเจพเจฐ:

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

เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเจพ เจœเจพเจฃเจฟเจ† เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ xdp_func_proto, เจœเฉ‹ เจนเจฐ เจตเจพเจฐ เจ•เจฟเจธเฉ‡ เจšเฉเจฃเฉŒเจคเฉ€ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจ•เจฐเจจ 'เจคเฉ‡ เจคเจธเจฆเฉ€เจ•เจ•เจฐเจคเจพ เจจเฉ‚เฉฐ เจšเจฒเจพเจเจ—เจพ เจ•เฉเจ เจ•เจฟเจธเจฎ เจฆเฉ€ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจซเฉฐเจ•เจธเจผเจจ, เจตเฉ‡เจ–เฉ‹ verifier.c.

เจ†เจ‰ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจ‡เฉฑเจ• เจ•เจพเจฒเจชเจจเจฟเจ• BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ bpf_get_smp_processor_id. เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจชเจฟเจ›เจฒเฉ‡ เจญเจพเจ— เจคเฉ‹เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ–เจฆเฉ‡ เจนเจพเจ‚:

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

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

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

เจจเจฟเจธเจผเจพเจจ bpf_get_smp_processor_id เจฆเฉเจ†เจฐเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† ะฒ <bpf/bpf_helper_defs.h> เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€เจ†เจ‚ libbpf เจจเฉ‚เฉฐ

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

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

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

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

Disassembly of section xdp/simple:

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

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

เจชเจนเจฟเจฒเฉ€ เจฒเจพเจˆเจจ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ call, เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ IMM เจœเฉ‹ เจ•เจฟ 8 เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจนเฉˆ, เจ…เจคเฉ‡ SRC_REG - เจœเจผเฉ€เจฐเฉ‹เฅค เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ เจฆเฉเจ†เจฐเจพ เจตเจฐเจคเฉ‡ เจ—เจ ABI เจธเจฎเจเฉŒเจคเฉ‡ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ, เจ‡เจน เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจ เจจเฉฐเจฌเจฐ เจ…เฉฑเจ  เจฒเจˆ เจ‡เฉฑเจ• เจ•เจพเจฒ เจนเฉˆเฅค เจ‡เฉฑเจ• เจตเจพเจฐ เจ‡เจธเจจเฉ‚เฉฐ เจฒเจพเจ‚เจš เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจคเจฐเจ• เจธเจงเจพเจฐเจจ เจนเฉˆเฅค เจฐเจœเจฟเจธเจŸเจฐ เจคเฉ‹เจ‚ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจ•เจฐเฉ‹ r0 เจจเฉ‚เฉฐ เจ•เจพเจชเฉ€ เจ•เฉ€เจคเจพ r1 เจ…เจคเฉ‡ เจฒเจพเจˆเจจเจพเจ‚ 2,3 โ€‹โ€‹'เจคเฉ‡ เจ‡เจธ เจจเฉ‚เฉฐ เจŸเจพเจˆเจช เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ u32 - เจ‰เฉฑเจชเจฐเจฒเฉ‡ 32 เจฌเจฟเฉฑเจŸ เจธเจพเจซเจผ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจเฅค เจฒเจพเจˆเจจเจพเจ‚ 4,5,6,7 'เจคเฉ‡ เจ…เจธเฉ€เจ‚ 2 เจตเจพเจชเจธ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ (XDP_PASS) เจœเจพเจ‚ 1 (XDP_DROP) เจ‡เจธ เจ—เฉฑเจฒ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ€ เจฒเจพเจˆเจจ 0 เจคเฉ‹เจ‚ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‡ เจœเจผเฉ€เจฐเฉ‹ เจœเจพเจ‚ เจ—เฉˆเจฐ-เจœเจผเฉ€เจฐเฉ‹ เจฎเฉเฉฑเจฒ เจตเจพเจชเจธ เจ•เฉ€เจคเจพ เจนเฉˆเฅค

เจ†เจ‰ เจ†เจชเจฃเฉ‡ เจ†เจช เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ€เจ: เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เฉ‹ bpftool prog dump xlated:

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

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

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

เจ เฉ€เจ• เจนเฉˆ, เจคเจธเจฆเฉ€เจ•เจ•เจฐเจคเจพ เจจเฉ‚เฉฐ เจธเจนเฉ€ เจ•เจฐเจจเจฒ-เจธเจนเจพเจ‡เจ• เจฒเฉฑเจญเจฟเจ† เจนเฉˆเฅค

เจ‰เจฆเจพเจนเจฐเจจ: เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃเจพ!

เจธเจพเจฐเฉ‡ เจฐเจจ-เจฒเฉˆเจตเจฒ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจŸเฉ‹เจŸเจพเจˆเจช เจนเฉเฉฐเจฆเจพ เจนเฉˆ

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

เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ‡ เจฎเจพเจชเจฆเฉฐเจก เจฐเจœเจฟเจธเจŸเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจชเจพเจธ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ r1-r5, เจ…เจคเฉ‡ เจฎเฉเฉฑเจฒ เจฐเจœเจฟเจธเจŸเจฐ เจตเจฟเฉฑเจš เจตเจพเจชเจธ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ r0. เจ‡เฉฑเจฅเฉ‡ เจ•เฉ‹เจˆ เจซเฉฐเจ•เจธเจผเจจ เจจเจนเฉ€เจ‚ เจนเจจ เจœเฉ‹ เจชเฉฐเจœ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจธเจฎเจฐเจฅเจจ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจจ เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจ†เจ‰ เจจเจตเฉ‡เจ‚ เจ•เจฐเจจเจฒ เจธเจนเจพเจ‡เจ• เจคเฉ‡ เจ‡เฉฑเจ• เจจเจœเจผเจฐ เจฎเจพเจฐเฉ€เจ เจ…เจคเฉ‡ BPF เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจชเจพเจธ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ†เจ“ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ–เฉ€เจ xdp-simple.bpf.c เจนเฉ‡เจ  เจฒเจฟเจ–เฉ‡ เจ…เจจเฉเจธเจพเจฐ (เจฌเจพเจ•เฉ€ เจฒเจพเจˆเจจเจพเจ‚ เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเฉ€เจ†เจ‚ เจนเจจ):

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

เจธเจพเจกเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ CPU เจฆเจพ เจจเฉฐเจฌเจฐ เจชเฉเจฐเจฟเฉฐเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจธ 'เจคเฉ‡ เจ‡เจน เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉˆเฅค เจ†เจ“ เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ:

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

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

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

เจšเจฒเฉ‹ เจนเฉเจฃ เจ‡เจธ เจตเจฟเฉฑเจš เจ•เฉเจ เจฒเจพเจˆเจจเจพเจ‚ เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚ xdp-simple.cเจคเจพเจ‚ เจœเฉ‹ เจธเจพเจกเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเจพเจฒ เจœเฉเฉœ เจœเจพเจตเฉ‡ lo เจ…เจคเฉ‡ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ!

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

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

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

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

cleanup:
    xdp_simple_bpf__destroy(obj);
}

เจ‡เฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ bpf_set_link_xdp_fd, เจœเฉ‹ เจ•เจฟ XDP-เจ•เจฟเจธเจฎ เจฆเฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธเจพเจ‚ เจจเจพเจฒ เจœเฉ‹เฉœเจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเฉฐเจฌเจฐ เจจเฉ‚เฉฐ เจนเจพเจฐเจกเจ•เฉ‹เจก เจ•เฉ€เจคเจพ เจนเฉˆ lo, เจœเฉ‹ เจ•เจฟ เจนเจฎเฉ‡เจธเจผเจพ 1 เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจพเจฃเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ…เจŸเฉˆเจš เจ•เจฐเจจ เจฒเจˆ เจฆเฉ‹ เจตเจพเจฐ เจซเฉฐเจ•เจธเจผเจจ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‡เจ•เจฐ เจ‡เจน เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ† เจธเฉ€เฅค เจงเจฟเจ†เจจ เจฆเจฟเจ“ เจ•เจฟ เจนเฉเจฃ เจธเจพเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจšเฉเจฃเฉŒเจคเฉ€ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ pause เจœเจพเจ‚ เจ‡เฉฑเจ• เจ…เจจเฉฐเจค เจฒเฉ‚เจช: เจธเจพเจกเจพ เจฒเฉ‹เจกเจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฌเฉฐเจฆ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพ, เจชเจฐ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจ˜เจŸเจจเจพ เจธเจฐเฉ‹เจค เจจเจพเจฒ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค เจธเจซเจฒ เจกเจพเจ‰เจจเจฒเฉ‹เจก เจ…เจคเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจนเจฐเฉ‡เจ• เจจเฉˆเจŸเจตเจฐเจ• เจชเฉˆเจ•เฉ‡เจŸ เจฒเจˆ เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ lo.

เจ†เจ‰ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจกเจพเจ‰เจจเจฒเฉ‹เจก เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ lo:

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

เจธเจพเจกเฉ‡ เจฆเฉเจ†เจฐเจพ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš ID 669 เจนเฉˆ เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ 'เจคเฉ‡ เจ‰เจนเฉ€ ID เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ lo. เจ…เจธเฉ€เจ‚ เจจเฉ‚เฉฐ เจ•เฉเจ เจชเฉˆเจ•เฉ‡เจœ เจญเฉ‡เจœเจพเจ‚เจ—เฉ‡ 127.0.0.1 (เจฌเฉ‡เจจเจคเฉ€ + เจœเจตเจพเจฌ):

$ ping -c1 localhost

เจ…เจคเฉ‡ เจนเฉเจฃ เจ†เจ‰ เจกเฉ€เจฌเฉฑเจ— เจตเจฐเจšเฉเจ…เจฒ เจซเจพเจˆเจฒ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ /sys/kernel/debug/tracing/trace_pipe, เจœเจฟเจธ เจตเจฟเฉฑเจš bpf_printk เจ†เจชเจฃเฉ‡ เจธเฉฐเจฆเฉ‡เจธเจผ เจฒเจฟเจ–เจฆเจพ เจนเฉˆ:

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

'เจคเฉ‡ เจฆเฉ‹ เจชเฉˆเจ•เฉ‡เจœ เจฆเฉ‡เจ–เฉ‡ เจ—เจ lo เจ…เจคเฉ‡ CPU0 'เจคเฉ‡ เจธเฉฐเจธเจพเจงเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† - เจธเจพเจกเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจชเฉ‚เจฐเฉ‡ เจ…เจฐเจฅเจนเฉ€เจฃ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‡ เจ•เฉฐเจฎ เจ•เฉ€เจคเจพ!

เจ‡เจน เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฏเฉ‹เจ— เจนเฉˆ bpf_printk เจ‡เจน เจ•เฉเจ เจตเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟ เจ‡เจน เจกเฉ€เจฌเฉฑเจ— เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฆเจพ เจนเฉˆ: เจ‡เจน เจ‰เจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจš เจตเจฐเจคเฉ‹เจ‚ เจฒเจˆ เจธเจญ เจคเฉ‹เจ‚ เจธเจซเจฒ เจธเจนเจพเจ‡เจ• เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจธเจพเจกเจพ เจŸเฉ€เจšเจพ เจ•เฉเจ เจธเจงเจพเจฐเจจ เจฆเจฟเจ–เจพเจ‰เจฃเจพ เจธเฉ€เฅค

BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจšเจฃเจพ

เจ‰เจฆเจพเจนเจฐเจจ: BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเฉ‡ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ

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

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

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

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

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

    *val += 1;

    return XDP_PASS;
}

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

เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจจเจ•เจธเจผเฉ‡ เจฆเฉ€ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจœเฉ‹เฉœเฉ€ woo: เจ‡เจน เจ‡เฉฑเจ• 8-เจเจฒเฉ€เจฎเฉˆเจ‚เจŸ เจเจฐเฉ‡ เจนเฉˆ เจœเฉ‹ เจ•เจฟ เจฎเฉเฉฑเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ u64 (C เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ…เจœเจฟเจนเฉ€ เจเจฐเฉ‡ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจพเจ‚เจ—เฉ‡ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ u64 woo[8]). เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš "xdp/simple" เจ…เจธเฉ€เจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจจเฉฐเจฌเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจตเจฟเฉฑเจš เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ key เจ…เจคเฉ‡ เจซเจฟเจฐ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ bpf_map_lookup_element เจธเจพเจจเฉ‚เฉฐ เจเจฐเฉ‡ เจตเจฟเฉฑเจš เจธเฉฐเจฌเฉฐเจงเจฟเจค เจเจ‚เจŸเจฐเฉ€ เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจฎเจฟเจฒเจฆเจพ เจนเฉˆ, เจœเจฟเจธเจจเฉ‚เฉฐ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจจเจพเจฒ เจตเจงเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค เจฐเฉ‚เจธเฉ€ เจตเจฟเฉฑเจš เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเจพ เจ—เจฟเจ†: เจ…เจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจ…เฉฐเจ•เฉœเจฟเจ†เจ‚ เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจœเจฟเจจเฉเจนเจพเจ‚ 'เจคเฉ‡ CPU เจจเฉ‡ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เฉ€เจคเฉ€ เจนเฉˆเฅค เจ†เจ‰ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ:

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

เจ†เจ“ เจœเจพเจ‚เจš เจ•เจฐเฉ€เจ เจ•เจฟ เจ‰เจน เจ‡เจธ เจจเจพเจฒ เจœเฉเฉœเฉ€ เจนเฉ‹เจˆ เจนเฉˆ lo เจ…เจคเฉ‡ เจ•เฉเจ เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเฉ‹:

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

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

เจ†เจ‰ เจนเฉเจฃ เจเจฐเฉ‡ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ:

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

เจฒเจ—เจญเจ— เจธเจพเจฐเฉ€เจ†เจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ CPU7 'เจคเฉ‡ เจธเฉฐเจธเจพเจงเจฟเจค เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจจเฅค เจ‡เจน เจธเจพเจกเฉ‡ เจฒเจˆ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจฎเฉเฉฑเจ– เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจธเจฎเจเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจเจ•เจธเฉˆเจธ เจ•เจฐเจจเจพ เจนเฉˆ - เจตเจฐเจคเจฆเฉ‡ เจนเฉ‹เจ ั…ะตะปะฟะตั€ะพะฒ bpf_mp_*.

เจฐเจนเฉฑเจธเจฎเจˆ เจธเฉ‚เจšเจ•เจพเจ‚เจ•

เจ‡เจธ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ•เจพเจฒเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเฉ‹เจ‚ เจจเจ•เจธเจผเฉ‡ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚

val = bpf_map_lookup_elem(&woo, &key);

เจœเจฟเฉฑเจฅเฉ‡ เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ

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

เจชเจฐ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจชเจพเจธ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚ &woo เจ‡เฉฑเจ• เจฌเฉ‡เจจเจพเจฎ เจขเจพเจ‚เจšเฉ‡ เจจเฉ‚เฉฐ struct { ... }...

เจœเฉ‡ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ…เจธเฉˆเจ‚เจฌเจฒเจฐ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจฎเฉเฉฑเจฒ &woo เจ…เจธเจฒ เจตเจฟเฉฑเจš เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆ (เจฒเจพเจˆเจจ 4):

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

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

Disassembly of section xdp/simple:

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

เจ…เจคเฉ‡ เจชเฉเจจเจฐ-เจธเจฅเจพเจจ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเฉˆ:

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

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

เจชเจฐ เจœเฉ‡ เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจธเจนเฉ€ เจจเจ•เจธเจผเฉ‡ (เจฒเจพเจˆเจจ 4) เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚:

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

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจ…เจธเฉ€เจ‚ เจ‡เจน เจธเจฟเฉฑเจŸเจพ เจ•เฉฑเจข เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจธเจพเจกเฉ‡ เจฒเฉ‹เจกเจฐ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจฒเจฟเฉฐเจ• &woo เจ‡เฉฑเจ• เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจจเจพเจฒ เจ•เจฟเจธเฉ‡ เจšเฉ€เจœเจผ เจฆเฉเจ†เจฐเจพ เจคเจฌเจฆเฉ€เจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€ libbpf. เจชเจนเจฟเจฒเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เจพเจ‚เจ—เฉ‡ strace:

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

เจ…เจธเฉ€เจ‚ เจ‡เจน เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ libbpf เจ‡เฉฑเจ• เจจเจ•เจธเจผเจพ เจฌเจฃเจพเจ‡เจ† woo เจ…เจคเฉ‡ เจซเจฟเจฐ เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เฉ€เจคเจพ simple. เจ†เจ“ เจ‡เจธ เจ—เฉฑเจฒ 'เจคเฉ‡ เจกเฉ‚เฉฐเจ˜เจพเจˆ เจจเจพเจฒ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ€เจ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

  • เจ•เจพเจฒ เจ•เจฐเฉ‹ xdp_simple_bpf__open_and_load เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ xdp-simple.skel.h
  • เจœเจฟเจธ เจฆเจพ เจ•เจพเจฐเจจ เจฌเจฃเจฆเจพ เจนเฉˆ xdp_simple_bpf__load เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ xdp-simple.skel.h
  • เจœเจฟเจธ เจฆเจพ เจ•เจพเจฐเจจ เจฌเจฃเจฆเจพ เจนเฉˆ bpf_object__load_skeleton เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ libbpf/src/libbpf.c
  • เจœเจฟเจธ เจฆเจพ เจ•เจพเจฐเจจ เจฌเจฃเจฆเจพ เจนเฉˆ bpf_object__load_xattr เจคเฉฑเจ• libbpf/src/libbpf.c

เจ†เจ–เจฐเฉ€ เจซเฉฐเจ•เจธเจผเจจ, เจนเฉ‹เจฐ เจšเฉ€เจœเจผเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ, เจ•เจพเจฒ เจ•เจฐเฉ‡เจ—เจพ bpf_object__create_maps, เจœเฉ‹ เจฎเฉŒเจœเฉ‚เจฆเจพ เจจเจ•เจธเจผเฉ‡ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจœเจพเจ‚ เจ–เฉ‹เจฒเฉเจนเจฆเจพ เจนเฉˆ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฆเจพ เจนเฉˆเฅค (เจ‡เจน เจ‰เจน เจฅเจพเจ‚ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ BPF_MAP_CREATE เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจตเจฟเฉฑเจš strace.) เจ…เฉฑเจ—เฉ‡ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจฌเฉเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ bpf_object__relocate เจ…เจคเฉ‡ เจ‡เจน เจ‰เจน เจนเฉˆ เจœเฉ‹ เจธเจพเจกเฉ€ เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ€ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจพเจจเฉ‚เฉฐ เจฏเจพเจฆ เจนเฉˆ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ•เฉ€ เจฆเฉ‡เจ–เจฟเจ† เจนเฉˆ woo เจฐเฉ€เจฒเฉ‹เจ•เฉ‡เจธเจผเจจ เจŸเฉ‡เจฌเจฒ เจตเจฟเฉฑเจš. เจ‡เจธเจฆเฉ€ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ…เจธเฉ€เจ‚ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš เจฒเฉฑเจญ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚ bpf_program__relocate, เจœเฉ‹ เจจเจ•เจธเจผเฉ‡ เจจเฉ‚เฉฐ เจคเจฌเจฆเฉ€เจฒ เจ•เจฐเจจ เจจเจพเจฒ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจนเฉˆ:

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

เจ‡เจธ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจนเจฆเจพเจ‡เจคเจพเจ‚ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจพเจ‚

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

เจ…เจคเฉ‡ เจ‡เจธ เจตเจฟเฉฑเจš เจธเจฐเฉ‹เจค เจฐเจœเจฟเจธเจŸเจฐ เจจเฉ‚เฉฐ เจจเจพเจฒ เจฌเจฆเจฒเฉ‹ BPF_PSEUDO_MAP_FD, เจ…เจคเฉ‡ เจธเจพเจกเฉ‡ เจจเจ•เจธเจผเฉ‡ เจฆเฉ‡ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจฆเจพ เจชเจนเจฟเจฒเจพ IMM เจ…เจคเฉ‡, เจœเฉ‡เจ•เจฐ เจ‡เจน เจฌเจฐเจพเจฌเจฐ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 0xdeadbeef, เจซเจฟเจฐ เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจพเจ‚เจ—เฉ‡

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

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฎเฉˆเจช เจœเจพเจฃเจ•เจพเจฐเฉ€ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ–เจพเจธ เจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจจเจ•เจธเจผเฉ‡ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฌเจฃเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ BPF_MAP_CREATE, เจ…เจคเฉ‡ ID เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ–เฉ‹เจฒเฉเจนเจฟเจ† เจ—เจฟเจ† BPF_MAP_GET_FD_BY_ID.

เจ•เฉเฉฑเจฒ, เจตเจฐเจคเจฃ เจตเฉ‡เจฒเฉ‡ libbpf เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจนเฉ‡เจ  เจฒเจฟเจ–เฉ‡ เจ…เจจเฉเจธเจพเจฐ เจนเฉˆ:

  • เจธเฉฐเจ•เจฒเจจ เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ, เจจเจ•เจธเจผเจฟเจ†เจ‚ เจฆเฉ‡ เจฒเจฟเฉฐเจ•เจพเจ‚ เจฒเจˆ เจฐเฉ€เจฒเฉ‹เจ•เฉ‡เจธเจผเจจ เจŸเฉ‡เจฌเจฒ เจตเจฟเฉฑเจš เจฐเจฟเจ•เจพเจฐเจก เจฌเจฃเจพเจ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ
  • libbpf ELF เจ†เจฌเจœเฉˆเจ•เจŸ เจฌเฉเฉฑเจ• เจ–เฉ‹เจฒเฉเจนเจฆเจพ เจนเฉˆ, เจธเจพเจฐเฉ‡ เจตเจฐเจคเฉ‡ เจ—เจ เจจเจ•เจธเจผเฉ‡ เจฒเฉฑเจญเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ
  • เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจนเจฆเจพเจ‡เจค เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจตเจœเฉ‹เจ‚ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ LD64

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ•เจฒเจชเจจเจพ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‡เฉฑเจฅเฉ‡ เจนเฉ‹เจฐ เจฌเจนเฉเจค เจ•เฉเจ เจ†เจ‰เจฃเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจ•เฉ‹เจฐ เจตเจฟเฉฑเจš เจตเฉ‡เจ–เจฃเจพ เจชเจเจ—เจพ. เจ–เฉเจธเจผเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจธเฉเจฐเจพเจ— เจนเฉˆ - เจ…เจธเฉ€เจ‚ เจ…เจฐเจฅ เจฒเจฟเจ– เจฒเจฟเจ† เจนเฉˆ BPF_PSEUDO_MAP_FD เจธเจฐเฉ‹เจค เจฐเจœเจฟเจธเจŸเจฐ เจตเจฟเฉฑเจš เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจฆเจซเจจ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจœเฉ‹ เจธเจพเจจเฉ‚เฉฐ เจธเจพเจฐเฉ‡ เจธเฉฐเจคเจพเจ‚ เจฆเฉ€ เจชเจตเจฟเฉฑเจคเจฐเจคเจพ เจตเฉฑเจฒ เจฒเฉˆ เจœเจพเจตเฉ‡เจ—เจพ - kernel/bpf/verifier.c, เจœเจฟเฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจจเจพเจฎ เจตเจพเจฒเจพ เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจ‡เฉฑเจ• เจ•เจฟเจธเจฎ เจฆเฉ‡ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจชเจคเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฆเจพ เจนเฉˆ struct bpf_map:

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

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

(เจชเฉ‚เจฐเจพ เจ•เฉ‹เจก เจฒเฉฑเจญเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจฒเจฟเฉฐเจ•). เจ‡เจธ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจจเฉ‚เฉฐ เจตเจงเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚:

  • เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ เจจเจ•เจธเจผเฉ‡ เจฆเฉ€ เจธเจนเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจขเจพเจ‚เจšเฉ‡ เจฆเจพ เจชเจคเจพ เจฒเจฟเจ–เจฆเจพ เจนเฉˆ struct bpf_map

เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ ELF เจฌเจพเจˆเจจเจฐเฉ€ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ libbpf เจ‡เฉฑเจฅเฉ‡ เจฌเจนเฉเจค เจ•เฉเจ เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉˆ, เจชเจฐ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจš เจšเจฐเจšเจพ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

libbpf เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ…เจคเฉ‡ เจจเจ•เจธเจผเฉ‡ เจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจนเจจ

เจœเจฟเจตเฉ‡เจ‚ เจตเจพเจ…เจฆเจพ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจ‡เฉฑเจฅเฉ‡ เจ‰เจนเจจเจพเจ‚ เจชเจพเจ เจ•เจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจนเฉˆ เจœเฉ‹ เจ‡เจน เจœเจพเจฃเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจจ เจ•เจฟ เจฌเจฟเจจเจพเจ‚ เจฎเจฆเจฆ เจฆเฉ‡ เจจเจ•เจธเจผเฉ‡ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฃเจพเจ‰เจฃเจพ เจ…เจคเฉ‡ เจฒเฉ‹เจก เจ•เจฐเจจเจพ เจนเฉˆเฅค libbpf. เจ‡เจน เจ‰เจฆเฉ‹เจ‚ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจ…เจœเจฟเจนเฉ‡ เจฎเจพเจนเฉŒเจฒ เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐ เจฐเจนเฉ‡ เจนเฉ‹ เจœเจฟเจธ เจฒเจˆ เจคเฉเจธเฉ€เจ‚ เจจเจฟเจฐเจญเจฐเจคเจพ เจจเจนเฉ€เจ‚ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจพเจ‚ เจนเจฐ เจ‡เฉฑเจ• เจฌเจฟเฉฑเจŸ เจฆเฉ€ เจฌเจšเจค เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจพเจ‚ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ ply, เจœเฉ‹ เจ•เจฟ เจซเจฒเจพเจˆ 'เจคเฉ‡ 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 เจฌเจฃเจพเจ‰เจฃ เจตเจพเจฒเฉ‡ เจฒเฉ‹เจ• เจ”เจจเจฒเจพเจˆเจจ เจฒเฉ€เจจเจ•เจธ เจ•เจฎเจฟเจŠเจจเจฟเจŸเฉ€ เจคเฉ‹เจ‚ เจธเจจ, เจœเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจจเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจธเจญ เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจ‡เฉฑเจ• เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ (เจชเจฐ เจจเจนเฉ€เจ‚ เจ†เจฎ เจฒเฉ‹เจ•) เจ•เจฐเจจเจฒ เจจเจพเจฒ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ: เจจเฉˆเฉฑเจŸเจฒเจฟเฉฐเจ• เจธเจพเจ•เจŸ, เจ‡เจน เจตเฉ€ เจตเฉ‡เจ–เฉ‹ เจ†เจฐเจเจซเจธเฉ€ 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, เจœเฉ‹ เจ•เจฟ เจชเฉˆเจ•เฉ‡เจœ เจคเฉ‹เจ‚ เจธเจชเจฒเจพเจˆ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจ•เจพเจฐเจจ เจ•เจฟ เจฌเฉ€เจชเฉ€เจเจซ เจตเจฟเจ•เจพเจธ เจ…เจงเฉ€เจจ เจนเฉˆ, เจ•เจฐเจจเจฒ เจ…เจคเฉ‡ เจŸเฉ‚เจฒ เจฒเจ—เจพเจคเจพเจฐ เจฌเจฆเจฒ เจฐเจนเฉ‡ เจนเจจ, เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ 2019 เจคเฉ‹เจ‚ เจชเฉเจฐเจพเจฃเฉ‡ เจœเจผเจฎเจพเจจเฉ‡ เจฆเฉ‡ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฌเฉ€เจชเฉ€เจเจซ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจฒเจฟเจ–เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเจจเจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

  • llvm/clang
  • pahole
  • เจ‡เจธ เจฆเจพ เจ•เฉ‹เจฐ
  • bpftool

(เจนเจตเจพเจฒเฉ‡ เจฒเจˆ, เจ‡เจน เจญเจพเจ— เจ…เจคเฉ‡ เจฒเฉ‡เจ– เจตเจฟเจšเจฒเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจกเฉ‡เจฌเฉ€เจ…เจจ 10 'เจคเฉ‡ เจšเจฒเจพเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจจเฅค)

llvm/clang

BPF LLVM เจจเจพเจฒ เจฆเฉ‹เจธเจคเจพเจจเจพ เจนเฉˆ เจ…เจคเฉ‡, เจนเจพเจฒเจพเจ‚เจ•เจฟ เจนเจพเจฒ เจนเฉ€ เจตเจฟเฉฑเจš BPF เจฒเจˆ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ gcc เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจธเจพเจฐเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจตเจฟเจ•เจพเจธ LLVM เจฒเจˆ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจ‡เจธ เจฒเจˆ, เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ…เจธเฉ€เจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡ clang git เจคเฉ‹เจ‚:

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

เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจœเจพเจ‚เจš เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ•เฉ€ เจธเจญ เจ•เฉเจ เจธเจนเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ‡เจ•เฉฑเจ เจพ เจนเฉ‹เจ‡เจ† เจนเฉˆ:

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

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

(เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจจเจฟเจฐเจฆเฉ‡เจธเจผ clang เจฎเฉ‡เจฐเฉ‡ เจฆเฉเจ†เจฐเจพ เจฒเจฟเจ† เจ—เจฟเจ† bpf_devel_QA.)

เจ…เจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจนเฉเจฃเฉ‡ เจฌเจฃเจพเจ เจนเจจ, เจชเจฐ เจ‡เจธเจฆเฉ€ เจฌเจœเจพเจ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡ PATH, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ:

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

(เจ‡เจธ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ .bashrc เจœเจพเจ‚ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ€ เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš. เจจเจฟเฉฑเจœเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡, เจฎเฉˆเจ‚ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจšเฉ€เจœเจผเจพเจ‚ เจจเฉ‚เฉฐ เจธเจผเจพเจฎเจฒ เจ•เจฐเจฆเจพ เจนเจพเจ‚ ~/bin/activate-llvm.sh เจ…เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡ เจฎเฉˆเจ‚ เจ•เจฐเจฆเจพ เจนเจพเจ‚ . activate-llvm.sh.)

เจชเจนเฉ‹เจฒ เจ…เจคเฉ‡ เจฌเฉ€.เจŸเฉ€.เจเฉฑเจซ

เจ‰เจชเจฏเฉ‹เจ—เจคเจพ pahole BTF เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ— เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ•เจฐเจจเจฒ เจฌเจฃเจพเจ‰เจฃ เจตเฉ‡เจฒเฉ‡ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฌเฉ€เจŸเฉ€เจเจซ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจฆเฉ‡ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจฌเจพเจฐเฉ‡ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจœเจพเจตเจพเจ‚เจ—เฉ‡, เจ‡เจธ เจคเฉฑเจฅ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ เจ•เจฟ เจ‡เจน เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจนเฉˆ เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจตเจฐเจคเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เจธ เจฒเจˆ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเจพ เจ•เจฐเจจเจฒ เจฌเจฃเจพเจ‰เจฃ เจœเจพ เจฐเจนเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจฌเจฃเจพเจ“ pahole (เจฌเจฟเจจเจพ pahole เจคเฉเจธเฉ€เจ‚ เจตเจฟเจ•เจฒเจช เจจเจพเจฒ เจ•เจฐเจจเจฒ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‹เจ—เฉ‡ CONFIG_DEBUG_INFO_BTF:

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

BPF เจจเจพเจฒ เจชเฉเจฐเจฏเฉ‹เจ— เจ•เจฐเจจ เจฒเจˆ เจ•เจฐเจจเจฒ

BPF เจฆเฉ€เจ†เจ‚ เจธเฉฐเจญเจพเจตเจจเจพเจตเจพเจ‚ เจฆเฉ€ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจ•เฉ‹เจฐ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚เฅค เจ‡เจน, เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเฉ‹เจฒเจฃ เจฒเจˆ, เจ‡เจน เจœเจผเจฐเฉ‚เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจตเฉฐเจก เจ•เจฐเจจเจฒ 'เจคเฉ‡ BPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ…เจคเฉ‡ เจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจตเฉ‹เจ—เฉ‡, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจคเฉเจนเจพเจกเฉ‡ เจ†เจชเจฃเฉ‡ เจ•เจฐเจจเจฒ เจนเฉ‹เจฃ เจจเจพเจฒ เจคเฉเจธเฉ€เจ‚ เจจเจตเฉ€เจจเจคเจฎ BPF เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเฉ‹ เจฎเจนเฉ€เจจเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ€ เจตเฉฐเจก เจตเจฟเฉฑเจš เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจฃเจ—เฉ€เจ†เจ‚เฅค , เจœเจพเจ‚, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ•เฉเจ เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ— เจŸเฉ‚เจฒเจธ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš เจฌเจฟเจฒเจ•เฉเจฒ เจตเฉ€ เจชเฉˆเจ• เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค เจจเจพเจฒ เจนเฉ€, เจ‡เจธเจฆเจพ เจ†เจชเจฃเจพ เจ•เฉ‹เจฐ เจ•เฉ‹เจก เจจเจพเจฒ เจชเฉเจฐเจฏเฉ‹เจ— เจ•เจฐเจจเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจฎเจนเจฟเจธเฉ‚เจธ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ‡เฉฑเจ• เจ•เจฐเจจเจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ•เจฐเจจเจฒ เจ–เฉเจฆ, เจ…เจคเฉ‡ เจฆเฉ‚เจœเจพ, เจ‡เฉฑเจ• เจ•เจฐเจจเจฒ เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจ‡เจฒ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค BPF เจจเจพเจฒ เจชเฉเจฐเจฏเฉ‹เจ— เจ•เจฐเจจ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจ†เจฎ เจตเจฐเจค เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจตเจจเฉ€เจฒเจพ เจ•เจฐเจจเจฒ เจœเจพเจ‚ เจตเจฟเจ•เจพเจธ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ•เฅค เจ‡เจคเจฟเจนเจพเจธเจ• เจคเฉŒเจฐ 'เจคเฉ‡, เจฌเฉ€เจชเฉ€เจเจซ เจฆเจพ เจตเจฟเจ•เจพเจธ เจฒเฉ€เจจเจ•เจธ เจจเฉˆเจŸเจตเจฐเจ•เจฟเฉฐเจ— เจ•เจฎเจฟเจŠเจจเจฟเจŸเฉ€ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจฒเจˆ เจธเจพเจฐเฉ€เจ†เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจœเจฒเจฆเฉ€ เจœเจพเจ‚ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจกเฉ‡เจตเจฟเจก เจฎเจฟเจฒเจฐ, เจฒเฉ€เจจเจ•เจธ เจจเฉˆเจŸเจตเจฐเจ•เจฟเฉฐเจ— เจฎเฉ‡เจจเจŸเฉ‡เจจเจฐ เจฆเฉเจ†เจฐเจพ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจธเฉเจญเจพเจ… 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ - เจธเฉฐเจชเจพเจฆเจจ เจœเจพเจ‚ เจจเจตเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ - เจจเฉˆเจŸเจตเจฐเจ• เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเฉ‹ เจ•เฉ‹เจฐเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจตเจฟเฉฑเจš เจ†เจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ - net เจœ net-next. เจฌเฉ€เจชเฉ€เจเจซ เจฒเจˆ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจตเจฟเจšเจ•เจพเจฐ เจ‰เจธเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจตเฉฐเจกเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ bpf ะธ bpf-next, เจœเฉ‹ เจซเจฟเจฐ เจ•เฉเจฐเจฎเจตเจพเจฐ เจจเฉˆเฉฑเจŸ เจ…เจคเฉ‡ เจจเฉˆเฉฑเจŸ-เจจเฉ‡เจ•เจธเจŸ เจตเจฟเฉฑเจš เจชเฉ‚เจฒ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจนเฉ‹เจฐ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจฒเจˆ, เจตเฉ‡เจ–เฉ‹ 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, เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจตเจœเฉ‹เจ‚ เจธเจชเจฒเจพเจˆ เจ•เฉ€เจคเจพ เจ—เจฟเจ†เฅค เจ‡เจน 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. Documentation/networking/filter.txt - เจ•เจฒเจพเจธเจฟเจ• เจ…เจคเฉ‡ เจซเจฟเจฐ เจตเจฟเจธเจคเฉเจฐเจฟเจค BPF เจฒเจˆ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจตเจพเจฒเฉ€ เจ…เจธเจฒ เจซเจพเจˆเจฒเฅค เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจญเจพเจธเจผเจพ เจ…เจคเฉ‡ เจคเจ•เจจเฉ€เจ•เฉ€ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐเจฒ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจœเจพเจฃเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจ‡เฉฑเจ• เจšเฉฐเจ—เจพ เจชเฉœเฉเจนเจจเจพเฅค

  3. เจซเฉ‡เจธเจฌเฉเฉฑเจ• เจคเฉ‹เจ‚ BPF เจฌเจพเจฐเฉ‡ เจฌเจฒเฉŒเจ—. เจ‡เจน เจฌเจนเฉเจค เจ˜เฉฑเจŸ เจนเฉ€ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจชเจฐ เจขเฉเจ•เจตเฉ‡เจ‚ เจคเฉŒเจฐ 'เจคเฉ‡, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจฒเฉˆเจ•เจธเฉ€ เจธเจŸเจพเจฐเฉ‹เจตเฉ‹เจ‡เจŸเฉ‹เจต (เจˆเจฌเฉ€เจชเฉ€เจเจซ เจฆเฉ‡ เจฒเฉ‡เจ–เจ•) เจ…เจคเฉ‡ เจเจ‚เจกเจฐเฉ€ เจจเจ•เจฐเฉ€เจ•เฉ‹ - (เจฐเฉฑเจ–-เจฐเจ–เจพเจ… เจ•เจฐเจจ เจตเจพเจฒเจพ) เจ‰เฉฑเจฅเฉ‡ เจฒเจฟเจ–เจฆเฉ‡ เจนเจจเฅค libbpf).

  4. bpftool เจฆเฉ‡ เจฐเจพเจœเจผ. bpftool เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ‡ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจ…เจคเฉ‡ เจฐเจพเจœเจผเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ Quentin Monnet เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจฎเจจเฉ‹เจฐเฉฐเจœเจ• เจŸเจตเจฟเฉฑเจŸเจฐ เจฅเฉเจฐเฉˆเจกเฅค

  5. BPF เจตเจฟเฉฑเจš เจกเฉเจฌเจ•เฉ€: เจชเฉœเฉเจนเจจ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€. Quentin Monnet เจคเฉ‹เจ‚ BPF เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฆเฉ‡ เจฒเจฟเฉฐเจ•เจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจตเจฟเจธเจผเจพเจฒ (เจ…เจคเฉ‡ เจ…เจœเฉ‡ เจตเฉ€ เจฌเจฃเจพเจˆ เจฐเฉฑเจ–เฉ€ เจ—เจˆ) เจธเฉ‚เจšเฉ€เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹