เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเตฝ เด’เดฐเต เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด…เดคเดฟเดจเต† เดฌเดฟเดชเดฟเดŽเดซเต เดŽเดจเตเดจเต เดตเดฟเดณเดฟเดšเตเดšเดฟเดฐเตเดจเตเดจเต. เดžเด™เตเด™เตพ เด…เดตเดณเต† เดจเต‹เด•เตเด•เดฟ เดฎเตเดฎเตเดชเดคเตเดคเต†, เดˆ เดชเดฐเดฎเตเดชเดฐเดฏเดฟเดฒเต† เดชเดดเดฏเดจเดฟเดฏเดฎ เดฒเต‡เด–เดจเด‚. 2013-เตฝ, เด…เดฒเด•เตโ€Œเดธเดฟ เดธเตเดฑเตเดฑเดพเดฑเต‹เดตเต‹เดฏเตโ€Œเดฑเตเดฑเต‹เดตเต, เดกเดพเดจเดฟเดฏเตฝ เดฌเต‹เตผเด•เตเด•เตเดฎเดพเตป เดŽเดจเตเดจเดฟเดตเดฐเตเดŸเต† เดถเตเดฐเดฎเดซเดฒเดฎเดพเดฏเดฟ, เด†เดงเตเดจเดฟเด• 64-เดฌเดฟเดฑเตเดฑเต เดฎเต†เดทเต€เดจเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด’เดชเตเดฑเตเดฑเดฟเดฎเตˆเดธเต เดšเต†เดฏเตโ€Œเดค เด…เดคเดฟเดจเตเดฑเต† เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดŸ เดชเดคเดฟเดชเตเดชเต เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเต เดฒเดฟเดจเด•เตโ€Œเดธเต เด•เต‡เตผเดฃเดฒเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฟ. เดˆ เดชเตเดคเดฟเดฏ เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏเดฏเต† เดšเตเดฐเตเด•เตเด•เดคเตเดคเดฟเตฝ เด‡เดจเตเดฑเต‡เดฃเตฝ เดฌเดฟเดชเดฟเดŽเดซเต เดŽเดจเตเดจเต เดตเดฟเดณเดฟเดšเตเดšเดฟเดฐเตเดจเตเดจเต, เดชเดฟเดจเตเดจเต€เดŸเต เดŽเด•เตเดธเตเดฑเตเดฑเต†เตปเดกเดกเต เดฌเดฟเดชเดฟเดŽเดซเต เดŽเดจเตเดจเต เดชเตเดจเตผเดจเดพเดฎเด•เดฐเดฃเด‚ เดšเต†เดฏเตเดคเต, เด‡เดชเตเดชเต‹เตพ, เด•เตเดฑเดšเตเดšเต เดตเตผเดทเด™เตเด™เตพเด•เตเด•เต เดถเต‡เดทเด‚, เดŽเดฒเตเดฒเดพเดตเดฐเตเด‚ เด…เดคเดฟเดจเต† เดฌเดฟเดชเดฟเดŽเดซเต เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต.

เดเด•เดฆเต‡เดถเด‚ เดชเดฑเดžเตเดžเดพเตฝ, เดฒเดฟเดจเด•เตเดธเต เด•เต‡เตผเดฃเตฝ เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเดฟเตฝ เด…เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เด‰เดชเดฏเต‹เด•เตเดคเตƒ-เดตเดฟเดคเดฐเดฃ เด•เต‹เดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป BPF เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เดชเตเดคเดฟเดฏ เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เดตเดณเดฐเต† เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด…เดคเดฟเดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเตเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดกเดธเตป เดฒเต‡เด–เดจเด™เตเด™เตพ เด•เต‚เดŸเดฟ เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดฐเตเด‚. (เดšเตเดตเดŸเต†เดฏเตเดณเตเดณ เดชเตเดฐเด•เดŸเดจ เด•เต‹เดกเดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดจเดจเตเดจเดพเดฏเดฟ เดšเต†เดฏเตเดฏเดพเดคเตเดค เด’เดฐเต‡เดฏเตŠเดฐเต เด•เดพเดฐเตเดฏเด‚, เดฎเดพเดจเตเดฏเดฎเดพเดฏ เด’เดฐเต เดฒเต‹เด—เต‹ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต.)

เดˆ เดฒเต‡เด–เดจเด‚ เดฌเดฟเดชเดฟเดŽเดซเต เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเตเดฑเต† เด˜เดŸเดจ, เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตŠเดชเตเดชเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เต‡เตผเดฃเตฝ เด‡เดจเตเดฑเตผเดซเต‡เดธเตเด•เตพ, เดตเดฟเด•เดธเดจ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ, เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เด•เดดเดฟเดตเตเด•เดณเตเดŸเต† เด’เดฐเต เดนเตเดฐเดธเตเดตเดตเตเด‚ เดตเดณเดฐเต† เดนเตเดฐเดธเตเดตเดตเตเดฎเดพเดฏ เด…เดตเดฒเต‹เด•เดจเด‚ เดŽเดจเตเดจเดฟเดต เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดพเดฏเดคเต. เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เดชเตเดฐเดพเดฏเต‹เด—เดฟเด• เดชเตเดฐเดฏเต‹เด—เด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด†เดดเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเด เดจเดคเตเดคเดฟเดจเต เดญเดพเดตเดฟเดฏเดฟเตฝ เดจเดฎเตเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฏเดคเต†เดฒเตเดฒเดพเด‚.
เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดธเด‚เด—เตเดฐเดนเด‚

เดฌเดฟเดชเดฟเดŽเดซเต เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เดฎเตเด–เด‚. เด†เดฆเตเดฏเด‚, เดžเด™เตเด™เตพ BPF เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏเดฏเตเดŸเต† เด’เดฐเต เดชเด•เตเดทเดฟ เดตเต€เด•เตเดทเดฃเด‚ เดŽเดŸเตเด•เตเด•เตเด•เดฏเตเด‚ เดชเตเดฐเดงเดพเดจ เด˜เดŸเด•เด™เตเด™เดณเตเดŸเต† เดฐเต‚เดชเดฐเต‡เด– เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เดฌเดฟเดชเดฟเดŽเดซเต เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเตเดฑเต† เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เดณเตเด‚ เด•เดฎเดพเตปเดกเต เดธเดฟเดธเตเดฑเตเดฑเดตเตเด‚. เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดฎเตŠเดคเตเดคเดคเตเดคเดฟเตฝ เด‡เดคเดฟเดจเด•เด‚ เด’เดฐเต เด†เดถเดฏเด‚ เด‰เดฃเตเดŸเต, เดžเด™เตเด™เตพ เดฌเดฟเดชเดฟเดŽเดซเต เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเตเดฑเต† เด˜เดŸเดจ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเด‚.

BPF เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเตเดŸเต† เดœเต€เดตเดฟเดค เดšเด•เตเดฐเด‚, bpffs เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚. เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ, BPF เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเตเดŸเต† - เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดฎเดพเดชเตเดชเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดœเต€เดตเดฟเดค เดšเด•เตเดฐเด‚ เดžเด™เตเด™เตพ เดธเต‚เด•เตเดทเตเดฎเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด‚.

เดฌเดฟเดชเดฟเดŽเดซเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เตพ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดธเดฟเดธเตเดฑเตเดฑเด‚ เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เดจเดฟเดฒเดตเดฟเดฒเตเดฃเตเดŸเต, เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เตพ เดŽเด™เตเด™เดจเต† เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเตเด‚ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเดฎเต†เดจเตเดจเตเด‚ เดžเด™เตเด™เตพ เด…เดจเตเดคเดฟเดฎเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด‚ - bpf(2).

ะŸะธัˆะตะผ ะฟั€ะพะณั€ะฐะผะผั‹ BPF ั ะฟะพะผะพั‰ัŒัŽ libbpf. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเดดเตเดคเดพเด‚. เดชเด•เตเดทเต‡ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเดพเดฃเต. เด•เต‚เดŸเตเดคเตฝ เดฏเดพเดฅเดพเตผเดคเตเดฅเตเดฏเดฎเดพเดฏ เด’เดฐเต เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดจเตเดฏเต‚เด•เตเดฒเดฟเดฏเตผ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตผเดฎเดพเตผ เด’เดฐเต เดฒเตˆเดฌเตเดฐเดฑเดฟ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเต†เดŸเตเดคเตเดคเต libbpf. เดžเด™เตเด™เตพ เด’เดฐเต เด…เดŸเดฟเดธเตเดฅเดพเดจ BPF เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด…เดธเตเดฅเดฟเด•เต‚เดŸเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด‚, เด…เดคเต เดคเตเดŸเตผเดจเตเดจเตเดณเตเดณ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเดฟเตฝ เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚.

เด•เต‡เตผเดฃเตฝ เดธเดนเดพเดฏเดฟเด•เตพ. เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เด•เต‡เตผเดฃเตฝ เดนเต†เตฝเดชเตเดชเตผ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดคเต†เด™เตเด™เดจเต†เดฏเต†เดจเตเดจเต เด‡เดตเดฟเดŸเต† เดจเดฎเตเดฎเตพ เดชเด เดฟเด•เตเด•เตเด‚ - เดฎเดพเดชเตเดชเตเด•เตพเด•เตเด•เตŠเดชเตเดชเด‚, เด•เตเดฒเดพเดธเดฟเด•เต เด’เดจเตเดจเดฟเดจเต† เด…เดชเต‡เด•เตเดทเดฟเดšเตเดšเต เดชเตเดคเดฟเดฏ เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เด•เดดเดฟเดตเตเด•เตพ เด…เดŸเดฟเดธเตเดฅเดพเดจเดชเดฐเดฎเดพเดฏเดฟ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด‰เดชเด•เดฐเดฃเด‚.

BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดชเตเดชเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เด•เตเดธเดธเต. เดˆ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ, เดฎเดพเดชเตเดชเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเด™เตเด™เดจเต† เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เดตเต‡เดฃเตเดŸเดคเตเดฐ เด…เดฑเดฟเดฏเดพเด‚. เดฎเดฟเด•เดšเตเดšเดคเตเด‚ เดถเด•เตเดคเดตเตเดฎเดพเดฏ เดตเต†เดฐเดฟเดซเดฏเดฑเดฟเดฒเต‡เด•เตเด•เต เดจเดฎเตเด•เตเด•เต เดชเต†เดŸเตเดŸเต†เดจเตเดจเต เดŽเดคเตเดคเดฟเดจเต‹เด•เตเด•เดพเด‚.

เดตเดฟเด•เดธเดจ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ. เดชเดฐเต€เด•เตเดทเดฃเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เด†เดตเดถเตเดฏเดฎเดพเดฏ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเด‚ เด•เต‡เตผเดฃเดฒเตเด‚ เดŽเด™เตเด™เดจเต† เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดธเดนเดพเดฏ เดตเดฟเดญเดพเด—เด‚.

เด‰เดชเดธเด‚เดนเดพเดฐเด‚. เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจเด‚, เด‡เดคเต เดตเดฐเต† เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเดตเตผเด•เตเด•เต เดชเตเดฐเดšเต‹เดฆเดจเด‚ เดจเตฝเด•เตเดจเตเดจ เดตเดพเด•เตเด•เตเด•เดณเตเด‚ เดคเตเดŸเตผเดจเตเดจเตเดณเตเดณ เดฒเต‡เด–เดจเด™เตเด™เดณเดฟเตฝ เดŽเดจเตเดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเด‚ เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดนเตเดฐเดธเตเดต เดตเดฟเดตเดฐเดฃเดตเตเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเด‚. เดคเตเดŸเตผเดšเตเดšเดฏเตเด•เตเด•เดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด†เด—เตเดฐเดนเดฎเต‹ เด•เดดเดฟเดตเต‹ เด‡เดฒเตเดฒเดพเดคเตเดคเดตเตผเด•เตเด•เดพเดฏเดฟ เดธเตเดตเดฏเด‚ เดชเด เดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดžเด™เตเด™เตพ เดจเดฟเดฐเดตเดงเดฟ เดฒเดฟเด™เตเด•เตเด•เตพ เดชเดŸเตเดŸเดฟเด•เดชเตเดชเต†เดŸเตเดคเตเดคเตเด‚.

เดฌเดฟเดชเดฟเดŽเดซเต เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เดฎเตเด–เด‚

BPF เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดฎเตเดชเต, เดžเด™เตเด™เตพ เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ เด’เดจเตเดจเต เดฑเดซเตผ เดšเต†เดฏเตเดฏเตเด‚ (เด“) เด•เตเดฒเดพเดธเดฟเด•เต เดฌเดฟเดชเดฟเดŽเดซเต, เด‡เดคเต RISC เดฎเต†เดทเต€เดจเตเด•เดณเตเดŸเต† เด†เดตเดฟเตผเดญเดพเดตเดคเตเดคเต‹เดŸเตเดณเตเดณ เดชเตเดฐเดคเดฟเด•เดฐเดฃเดฎเดพเดฏเดฟ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเต†เดŸเตเด•เตเด•เตเด•เดฏเตเด‚ เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเต เดซเดฟเตฝเดŸเตเดŸเดฑเดฟเด‚เด—เดฟเดจเตเดฑเต† เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเต. เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏ เดตเดณเดฐเต† เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เดคเตŠเดฃเตเดฃเต‚เดฑเตเด•เดณเดฟเตฝ เดฌเต†เตผเด•เตเด•เตเดฒเดฟ เดฏเตเดฃเดฟเด•เตเดธเดฟเตฝ เดœเดจเดฟเดšเตเดšเดคเดฟเดจเดพเตฝ, เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดฎเดฟเด•เตเด• เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เด‡เดคเต เดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดŸเต, เด‡เดฐเตเดชเดคเตเด•เดณเดฟเตฝ เด…เดคเดฟเดœเต€เดตเดฟเดšเตเดšเต, เด‡เดชเตเดชเต‹เดดเตเด‚ เดชเตเดคเดฟเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเต.

64-เดฌเดฟเดฑเตเดฑเต เดฎเต†เดทเต€เดจเตเด•เตพ, เด•เตเดฒเต—เดกเต เดธเต‡เดตเดจเด™เตเด™เตพ, SDN เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดŸเต‚เดณเตเด•เดณเตเดŸเต† เดตเตผเดฆเตเดงเดฟเดšเตเดš เด†เดตเดถเตเดฏเด•เดค เดŽเดจเตเดจเดฟเดตเดฏเตเดŸเต† เดชเตเดฐเดคเดฟเด•เดฐเดฃเดฎเดพเดฏเดพเดฃเต เดชเตเดคเดฟเดฏ BPF เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเดคเต.Sเดชเดฒเดชเตเดชเต‹เดดเตเด‚-dเดจเดฟเตผเดตเดšเดฟเดšเตเดšเต nเดŽเดฑเตเดฑเตเดตเตผเด•เตเด•เดฟเด‚เด—เต). เด•เตเดฒเดพเดธเดฟเด•เต BPF-เดจเต เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดŸ เดชเด•เดฐเด•เตเด•เดพเดฐเดจเดพเดฏเดฟ เด•เต‡เตผเดฃเตฝ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดŽเดžเตเดšเดฟเดจเต€เดฏเตผเดฎเดพเตผ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเต†เดŸเตเดคเตเดค, เดชเตเดคเดฟเดฏ BPF เด…เด•เตเดทเดฐเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด†เดฑเต เดฎเดพเดธเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚ เดฒเดฟเดจเด•เตเดธเต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เดฆเต—เดคเตเดฏเดคเตเดคเดฟเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ, เด‡เดชเตเดชเต‹เตพ, เด…เดคเต เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดŸเต เด†เดฑเต เดตเตผเดทเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เดžเด™เตเด™เตพเด•เตเด•เต เด…เดŸเตเดคเตเดค เดฒเต‡เด–เดจเด‚ เดฎเตเดดเตเดตเตป เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดตเดฟเดตเดฟเดง เดคเดฐเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดชเดŸเตเดŸเดฟเด•เดชเตเดชเต†เดŸเตเดคเตเดคเตเด•.

เดฐเดธเด•เดฐเดฎเดพเดฏ เดšเดฟเดคเตเดฐเด™เตเด™เตพ

เด…เดคเดฟเดจเตเดฑเต† เด•เต‡เดจเตเดฆเตเดฐเดคเตเดคเดฟเตฝ, เดธเตเดฐเด•เตเดทเดฏเดฟเตฝ เดตเดฟเดŸเตเดŸเตเดตเต€เดดเตเดš เดšเต†เดฏเตเดฏเดพเดคเต† เด•เต‡เตผเดฃเตฝ เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเดฟเตฝ "เด…เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ" เด•เต‹เดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดธเดพเตปเดกเตโ€Œเดฌเต‹เด•เตโ€Œเดธเต เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเดพเดฃเต BPF. เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดฏเต‚เดธเตผ เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเดฟเตฝ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเดฟเดฒ เด‡เดตเดจเตเดฑเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด’เดฐเต เด‡เดตเดจเตเดฑเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด’เดฐเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดชเดพเด•เตเด•เดฑเตเดฑเต เดกเต†เดฒเดฟเดตเดฑเดฟ, เดšเดฟเดฒ เด•เต‡เตผเดฃเตฝ เดซเด‚เด—เตโ€Œเดทเดจเตเดฑเต† เดธเดฎเดพเดฐเด‚เดญเด‚ เดฎเตเดคเดฒเดพเดฏเดต เด†เด•เดพเด‚. เด’เดฐเต เดชเดพเด•เตเด•เต‡เดœเดฟเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เดชเดพเด•เตเด•เต‡เดœเดฟเดจเตเดฑเต† เดกเดพเดฑเตเดฑเดฏเดฟเดฒเต‡เด•เตเด•เตเด‚ เดฎเต†เดฑเตเดฑเดพเดกเดพเดฑเตเดฑเดฏเดฟเดฒเต‡เด•เตเด•เตเด‚ เด†เด•เตโ€Œเดธเดธเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚ (เดตเดพเดฏเดจเดฏเตเด•เตเด•เตเด‚, เด’เดฐเตเดชเด•เตเดทเต‡, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดคเดฐเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดŽเดดเตเดคเตเดจเตเดจเดคเดฟเดจเตเด‚); เด’เดฐเต เด•เต‡เตผเดฃเตฝ เดซเด‚เด—เตโ€Œเดทเตป เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เด•เต‡เตผเดฃเตฝ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเต‹เดฏเดฟเดจเตเดฑเดฑเตเด•เตพ เด‰เตพเดชเตเดชเต†เดŸเต†เดฏเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚.

เดˆ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดจเดฎเตเด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเต‹เด•เตเด•เดพเด‚. เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด•เตเดฒเดพเดธเดฟเด•เต เดฌเดฟเดชเดฟเดŽเดซเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด†เดฆเตเดฏ เดตเตเดฏเดคเตเดฏเดพเดธเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเด‚, เด…เดคเดฟเดจเดพเดฏเดฟ เด…เดธเด‚เดฌเตเดฒเดฑเดฟเตฝ เดŽเดดเตเดคเดฟเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ. เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเดฟเตฝ, เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดšเต, เด…เดคเดฟเดจเดพเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เด‰เดฏเตผเดจเตเดจ เดคเดฒเดคเตเดคเดฟเดฒเตเดณเตเดณ เดญเดพเดทเด•เดณเดฟเตฝ เดŽเดดเตเดคเดพเด‚, เดชเตเดฐเดพเดฅเดฎเดฟเด•เดฎเดพเดฏเดฟ, เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดธเดฟเดฏเดฟเตฝ. เด‡เดคเดฟเดจเดพเดฏเดฟ, llvm-เดจเตเดณเตเดณ เด’เดฐเต เดฌเดพเด•เตเด•เต†เตปเดกเต เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเต†เดŸเตเดคเตเดคเต, เด‡เดคเต BPF เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดจเดพเดฏเดฟ เดฌเตˆเดฑเตเดฑเตเด•เต‹เดกเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

BPF เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต, เดญเดพเด—เดฟเด•เดฎเดพเดฏเดฟ, เด†เดงเตเดจเดฟเด• เดฎเต†เดทเต€เดจเตเด•เดณเดฟเตฝ เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดจเดพเดฃเต. เด‡เดคเต เดชเตเดฐเดพเดฏเต‹เด—เดฟเด•เดฎเดพเด•เตเด•เดพเตป, เดฌเดฟเดชเดฟเดŽเดซเต เดฌเตˆเดฑเตเดฑเตเด•เต‹เดกเต, เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดคเตเด•เดดเดฟเดžเตเดžเดพเตฝ, เดœเต†เดเดŸเดฟ เด•เดฎเตเดชเตˆเดฒเตผ (JIT เด•เด‚เดชเตˆเดฒเตผ) เดŽเดจเตเดจ เด˜เดŸเด•เด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเต‡เดฑเตเดฑเต€เดตเต เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต.Just In Time). เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เดจเดฟเด™เตเด™เตพ เด“เตผเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด•เตเดฒเดพเดธเดฟเด•เต BPF-เตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เด‡เดตเดจเตเดฑเต เด‰เดฑเดตเดฟเดŸเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด†เดฑเตเดฑเต‹เดฎเดฟเด•เต เด†เดฏเดฟ เด˜เดŸเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเต - เด’เดฐเตŠเดฑเตเดฑ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดฟเดจเตเดฑเต† เดชเดถเตเดšเดพเดคเตเดคเดฒเดคเตเดคเดฟเตฝ. เดชเตเดคเดฟเดฏ เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเตฝ, เด‡เดคเต เดฐเดฃเตเดŸเต เด˜เดŸเตเดŸเด™เตเด™เดณเดฟเดฒเดพเดฏเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต - เด†เดฆเตเดฏเด‚, เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‹เดกเต เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต. bpf(2)เดคเตเดŸเตผเดจเตเดจเต, เดชเดฟเดจเตเดจเต€เดŸเต, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดคเดฐเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดตเตเดฏเดคเตเดฏเดพเดธเดชเตเดชเต†เดŸเตเดจเตเดจ เดฎเดฑเตเดฑเต เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เดณเดฟเดฒเต‚เดŸเต†, เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‡เดตเดจเตเดฑเต เด‰เดฑเดตเดฟเดŸเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด…เดฑเตเดฑเดพเดšเตเดšเตเดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เด‡เดตเดฟเดŸเต† เดตเดพเดฏเดจเด•เตเด•เดพเดฐเดจเต เด’เดฐเต เดšเต‹เดฆเตเดฏเด‚ เด‰เดฃเตเดŸเดพเดฏเต‡เด•เตเด•เดพเด‚: เด…เดคเต เดธเดพเดงเตเดฏเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต‹? เด…เดคเตเดคเดฐเด‚ เด•เต‹เดกเดฟเดจเตเดฑเต† เดจเดฟเตผเดตเตเดตเดนเดฃ เดธเตเดฐเด•เตเดท เดŽเด™เตเด™เดจเต†เดฏเดพเดฃเต เด‰เดฑเดชเตเดชเต เดจเตฝเด•เตเดจเตเดจเดคเต? เดตเต†เดฐเดฟเดซเดฏเตผ (เด‡เด‚เด—เตเดฒเต€เดทเดฟเตฝ เดˆ เด˜เดŸเตเดŸเดคเตเดคเต† เดตเต†เดฐเดฟเดซเดฏเตผ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต, เดžเดพเตป เด‡เด‚เด—เตเดฒเต€เดทเต เดตเดพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดคเตเดŸเดฐเตเด‚):

เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

เดตเต†เดฐเดฟเดซเดฏเตผ เด’เดฐเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เด…เดจเดฒเตˆเดธเดฑเดพเดฃเต, เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เต‡เตผเดฃเดฒเดฟเดจเตเดฑเต† เดธเดพเดงเดพเดฐเดฃ เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเต† เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดฟเดฒเตเดฒเต†เดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเดจเตเดจเต. เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒเต†เดจเตเดจเต เด‡เดคเต เด…เตผเดคเตเดฅเดฎเดพเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ - เดคเดฐเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต, เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เด•เต‡เตผเดฃเตฝ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเตเดŸเต† เดตเดฟเดญเดพเด—เด™เตเด™เตพ เดตเดพเดฏเดฟเด•เตเด•เดพเดจเตเด‚ เดฎเดพเดฑเตเดฑเดฟเดฏเต†เดดเตเดคเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚, เดซเด‚เด—เตเดทเดจเตเด•เดณเตเดŸเต† เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดฎเดŸเด•เตเด•เดฟเดจเตฝเด•เตเด•, เดŸเตเดฐเดฟเด‚ เดšเต†เดฏเตเดฏเตเด•, เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เตเด•, เดตเต€เดฃเตเดŸเตเด‚ เดŽเดดเตเดคเตเด• เด•เต‚เดŸเดพเดคเต† เดซเต‹เตผเดตเต‡เดกเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดชเต‹เดฒเตเด‚. เด’เดฐเต เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต เด•เต‡เตผเดฃเดฒเดฟเดจเต† เด•เตเดฐเดพเดทเต เดšเต†เดฏเตเดฏเดฟเดฒเตเดฒเต†เดจเตเดจเตเด‚ เดจเดฟเดฏเดฎเด™เตเด™เตพ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต, เดฑเตˆเดฑเตเดฑเต เด†เด•เตโ€Œเดธเดธเต เด‰เดณเตเดณ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด”เดŸเตเดŸเตโ€Œเด—เต‹เดฏเดฟเด‚เด—เต เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เดกเดพเดฑเตเดฑเดฏเตเด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเต เดชเตเดฑเดคเตเดคเต เด•เต‡เตผเดฃเตฝ เดฎเต†เดฎเตเดฎเดฑเดฟ เดชเตเดจเดฐเดพเดฒเต‡เด–เดจเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒเต†เดจเตเดจเตเด‚ เดตเต†เดฐเดฟเดซเดฏเตผ เด‰เดฑเดชเตเดชเต เดจเตฝเด•เตเดจเตเดจเต. BPF-เดจเตเดฑเต† เดฎเดฑเตเดฑเต†เดฒเตเดฒเดพ เด˜เดŸเด•เด™เตเด™เดณเตเด‚ เดชเดฐเดฟเดšเดฏเดชเตเดชเต†เดŸเตเดŸเดคเดฟเดจเต เดถเต‡เดทเด‚, เด…เดจเตเดฌเดจเตเดง เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เดตเต†เดฐเดฟเดซเดฏเดฑเดฟเดจเต† เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด‚.

เด…เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ เด‡เดคเตเดตเดฐเต† เดŽเดจเตเดคเดพเดฃเต เดชเด เดฟเดšเตเดšเดคเต? เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เดธเดฟเดฏเดฟเตฝ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเดดเตเดคเตเดจเตเดจเต, เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดคเต เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต bpf(2), เด…เดตเดฟเดŸเต† เด…เดคเต เด’เดฐเต เดตเต†เดฐเดฟเดซเดฏเตผ เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเต เดจเต‡เดฑเตเดฑเต€เดตเต เดฌเตˆเดฑเตเดฑเตเด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดคเตเดŸเตผเดจเตเดจเต เด…เดคเต‡ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเตŠเดฐเต เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต† เด‡เดตเดจเตเดฑเต เด‰เดฑเดตเดฟเดŸเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดคเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเตป เดคเตเดŸเด™เตเด™เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดฌเต‚เดŸเตเดŸเตเด‚ เด•เดฃเด•เตเดทเดจเตเด‚ เดตเต‡เตผเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเดฒ เด•เดพเดฐเดฃเด™เตเด™เดณเดพเตฝ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เด’เดฐเต เดตเต†เดฐเดฟเดซเดฏเตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต เดคเดพเดฐเดคเดฎเตเดฏเต‡เดจ เดšเต†เดฒเดตเต‡เดฑเดฟเดฏเดคเดพเดฃเต, เด’เดฐเต‡ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเดฟเดฐเดตเดงเดฟ เดคเดตเดฃ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เดžเด™เตเด™เตพ เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเตผ เดธเดฎเดฏเด‚ เดชเดพเดดเดพเด•เตเด•เตเดจเตเดจเต. เดฐเดฃเตเดŸเดพเดฎเดคเดพเดฏเดฟ, เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเด™เตเด™เดจเต† เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเต เด…เดคเดฟเดจเตเดฑเต† เดคเดฐเดคเตเดคเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เด’เดฐเต เดตเตผเดทเด‚ เดฎเตเดฎเตเดชเต เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดš เด’เดฐเต "เดธเดพเตผเดตเดคเตเดฐเดฟเด•" เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดชเตเดคเดฟเดฏ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดฒเตเดฒเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚. (เด‡เดชเตเดชเต‹เตพ เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏ เด•เต‚เดŸเตเดคเตฝ เดชเด•เตเดตเดค เดชเตเดฐเดพเดชเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚, เดˆ เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดคเดฒเดคเตเดคเดฟเตฝ เดเด•เต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด’เดฐเต เด†เดถเดฏเดฎเตเดฃเตเดŸเต. libbpf.)

เดจเดฎเตเดฎเตพ เด‡เดคเตเดตเดฐเต† เดšเดฟเดคเตเดฐเด™เตเด™เตพ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เดจเตเดจเต เดถเตเดฐเดฆเตเดงเดฏเตเดณเตเดณ เดตเดพเดฏเดจเด•เตเด•เดพเดฐเตป เดถเตเดฐเดฆเตเดงเดฟเดšเตเดšเต‡เด•เตเด•เดพเด‚. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เด•เตเดฒเดพเดธเดฟเด•เต เดฌเดฟเดชเดฟเดŽเดซเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเต†เดŸเตเดคเตเดคเตเดฎเตเดชเต‹เตพ เดฌเดฟเดชเดฟเดŽเดซเต เด…เดŸเดฟเดธเตเดฅเดพเดจเดชเดฐเดฎเดพเดฏเดฟ เดšเดฟเดคเตเดฐเด‚ เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเต เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต†เดจเตเดจเต เดฎเตเด•เดณเดฟเตฝ เดชเดฑเดžเตเดžเดตเดฏเต†เดฒเตเดฒเดพเด‚ เดตเดฟเดถเดฆเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เดชเตเดฐเดฏเต‹เด—เด•เตเดทเดฎเดคเดฏเตเดŸเต† เดตเตเดฏเดพเดชเตเดคเดฟ เด—เดฃเตเดฏเดฎเดพเดฏเดฟ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เดฐเดฃเตเดŸเต เดชเตเดคเตเดฎเด•เตพ เดชเด™เตเด•เดฟเดŸเตเดŸ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเตเด‚ เด•เต‡เตผเดฃเตฝ เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเดพเดฃเต. BPF-เตฝ, เดชเด™เตเด•เดฟเดŸเตเดŸ เดฎเต†เดฎเตเดฎเดฑเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต เดฎเดพเดชเตเดชเตเด•เตพ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต - เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ API เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเด™เตเด•เดฟเดŸเตเดŸ เดกเดพเดฑเตเดฑ เด˜เดŸเดจเด•เตพ. เด†เดฆเตเดฏเด‚ เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดจเตเดจ เดฎเดพเดชเตเดชเต เด’เดฐเต เดนเดพเดทเต เดŸเต‡เดฌเดฟเตพ เด†เดฏเดคเตเด•เตŠเดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚ เด…เดตเตผเด•เตเด•เต เดˆ เดชเต‡เดฐเต เดฒเดญเดฟเดšเตเดšเดคเต. เดชเดฟเดจเตเดจเต€เดŸเต เด…เดฑเต‡เด•เตพ เดชเตเดฐเดคเตเดฏเด•เตเดทเดชเตเดชเต†เดŸเตเดŸเต, เดฒเต‹เด•เตเด•เตฝ (เด“เดฐเต‹ เดธเดฟเดชเดฟเดฏเต) เดนเดพเดทเต เดŸเต‡เดฌเดฟเดณเตเด•เดณเตเด‚ เดฒเต‹เด•เตเด•เตฝ เด…เดฑเต‡เด•เดณเตเด‚, เดธเต†เตผเดšเตเดšเต เดŸเตเดฐเต€เด•เดณเตเด‚, เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเต‹เดฏเดฟเดจเตเดฑเดฑเตเด•เตพ เด…เดŸเด™เตเด™เดฟเดฏ เดฎเดพเดชเตเดชเตเด•เดณเตเด‚ เดฎเดฑเตเดฑเตเด‚. เด‡เดชเตเดชเต‹เตพ เดžเด™เตเด™เตพเด•เตเด•เต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดคเต, เด•เต‹เดณเตเด•เตพเด•เตเด•เดฟเดŸเดฏเดฟเตฝ เดจเดฟเดฒเดจเดฟเตฝเด•เตเด•เดพเดจเตเด‚ เดฎเดฑเตเดฑเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเดฎเดพเดฏเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด‡เดŸเดตเตเดฎเดพเดฏเตเด‚ เดชเด™เตเด•เดฟเดŸเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เด‡เดชเตเดชเต‹เตพ เด‰เดฃเตเดŸเต เดŽเดจเตเดจเดคเดพเดฃเต.

เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดชเตโ€Œเดธเต เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต bpf(2), เด•เต‚เดŸเดพเดคเต† เดนเต†เตฝเดชเตเดชเตผ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‡เตผเดฃเดฒเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚. เด•เต‚เดŸเดพเดคเต†, เดฎเดพเดชเตเดชเตเด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดฎเดฑเตเดฑเต เด•เต‡เตผเดฃเตฝ เด•เดดเดฟเดตเตเด•เตพ เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดธเดนเดพเดฏเดฟเด•เตพ เดจเดฟเดฒเดตเดฟเดฒเตเดฃเตเดŸเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดฎเดฑเตเดฑเต เด‡เดจเตเดฑเตผเดซเต‡เดธเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเต†เตผเดซเต เด‡เดตเดจเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เต‡เตผเดฃเตฝ เด˜เดŸเดจเด•เตพ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เดนเต†เตฝเดชเตเดชเตผ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

เดšเตเดฐเตเด•เตเด•เดคเตเดคเดฟเตฝ, เด•เต‡เตผเดฃเตฝ เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเดฟเดฒเต‡เด•เตเด•เต เด…เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ, เด…เดคเดพเดฏเดคเต เดตเต†เดฐเดฟเดซเดฏเตผ-เดŸเต†เดธเตเดฑเตเดฑเต เดšเต†เดฏเตโ€Œเดค เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด•เต‹เดกเต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต BPF เดจเตฝเด•เตเดจเตเดจเต. เดˆ เด•เต‹เดกเดฟเดจเต เด•เต‹เดณเตเด•เตพเด•เตเด•เดฟเดŸเดฏเดฟเตฝ เด…เดตเดธเตเดฅ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเดจเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด‡เดŸเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดกเดพเดฑเตเดฑ เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚, เด•เต‚เดŸเดพเดคเต† เด‡เดคเตเดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด•เต‡เตผเดฃเตฝ เดธเดฌเตเดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เด•เตโ€Œเดธเดธเตเดธเตเด‚ เด‰เดฃเตเดŸเต.

เด‡เดคเต เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เด•เต‡เตผเดฃเตฝ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เดจเตฝเด•เตเดจเตเดจ เด•เดดเดฟเดตเตเด•เตพเด•เตเด•เต เดธเดฎเดพเดจเดฎเดพเดฃเต, เด‡เดคเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเต†เดŸเตเดคเตเดคเตเดฎเตเดชเต‹เตพ เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเต เดšเดฟเดฒ เด—เตเดฃเด™เตเด™เดณเตเดฃเตเดŸเต (เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดฎเดพเดจเดฎเดพเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเต‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดธเดฟเดธเตเดฑเตเดฑเด‚ เดŸเตเดฐเต‡เดธเดฟเด‚เด—เต - เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฌเดฟเดชเดฟเดŽเดซเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เด…เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดคเดฎเดพเดฏ เดกเตเดฐเตˆเดตเตผ เดŽเดดเตเดคเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ). เด•เตเดฑเดžเตเดž เดŽเตปเดŸเตเดฐเดฟ เดคเตเดฐเต†เดทเต‹เตพเดกเต (เดฌเดฟเดชเดฟเดŽเดซเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดšเดฟเดฒ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพเด•เตเด•เต เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เด•เต‡เตผเดฃเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เด•เดดเดฟเดตเตเด•เดณเต‹ เดชเตŠเดคเตเดตเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เด•เดดเดฟเดตเตเด•เดณเต‹ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ), เดฑเตบเดŸเตˆเด‚ เดธเตเดฐเด•เตเดท (เดŽเดดเตเดคเตเดฎเตเดชเต‹เตพ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดคเด•เตผเด•เตเด•เดพเดคเตเดคเดตเตผเด•เตเด•เตเดณเตเดณ เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเดฟเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เตˆ เด‰เดฏเตผเดคเตเดคเตเด•. เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ), เด†เดฑเตเดฑเต‹เดฎเดฟเดธเดฟเดฑเตเดฑเดฟ - เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เดตเต€เดฃเตเดŸเตเด‚ เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดธเดฎเดฏเดฎเตเดฃเตเดŸเต, เด•เต‚เดŸเดพเดคเต† เด‡เดตเดจเตเดฑเตเด•เดณเตŠเดจเตเดจเตเด‚ เดจเดทเตโ€ŒเดŸเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒเต†เดจเตเดจเต BPF เดธเดฌเตโ€Œเดธเดฟเดธเตเดฑเตเดฑเด‚ เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเดจเตเดจเต (เดจเตเดฏเดพเดฏเดฎเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ, เด‡เดคเต เดŽเดฒเตเดฒเดพเดคเตเดคเดฐเด‚ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เตเด‚ เดถเดฐเดฟเดฏเดฒเตเดฒ).

เด…เดคเตเดคเดฐเด‚ เด•เดดเดฟเดตเตเด•เดณเตเดŸเต† เดธเดพเดจเตเดจเดฟเดงเตเดฏเด‚ เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเต† เด•เต‡เตผเดฃเตฝ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดธเดพเตผเดตเดคเตเดฐเดฟเด• เด‰เดชเด•เดฐเดฃเดฎเดพเด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเต, เด‡เดคเต เดชเตเดฐเดพเดฏเต‹เด—เดฟเด•เดฎเดพเดฏเดฟ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต: เด•เต‚เดŸเตเดคเตฝ เด•เต‚เดŸเตเดคเตฝ เดชเตเดคเดฟเดฏ เดคเดฐเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดฌเดฟเดชเดฟเดŽเดซเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเตเดคเตฝ เด•เต‚เดŸเตเดคเตฝ เดตเดฒเดฟเดฏ เด•เดฎเตเดชเดจเดฟเด•เตพ เด•เต‹เด‚เดฌเดพเดฑเตเดฑเต เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ 24ร—7 เดฌเดฟเดชเดฟเดŽเดซเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเตเดคเตฝ เด•เต‚เดŸเตเดคเตฝ BPF เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เตพ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเดพเดฃเต เดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเดชเตเดชเตเด•เตพ เด…เดตเดฐเตเดŸเต† เดฌเดฟเดธเดฟเดจเดธเตเดธเต เด•เต†เดŸเตเดŸเดฟเดชเตเดชเดŸเตเด•เตเด•เตเดจเตเดจเดคเต. เดŽเดฒเตเดฒเดพเดฏเดฟเดŸเดคเตเดคเตเด‚ BPF เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต: DDoS เด†เด•เตเดฐเดฎเดฃเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดฐเดฟเดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚, SDN เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, kubernetes-เดจเดพเดฏเดฟ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚), เดชเตเดฐเดงเดพเดจ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดŸเตเดฐเต†เดฏเตโ€Œเดธเดฟเด‚เด—เต เด‰เดชเด•เดฐเดฃเดฎเดพเดฏเตเด‚ เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเดจเตเดจเดตเดฐเดพเดฏเตเด‚, เดจเตเดดเดžเตเดžเตเด•เดฏเดฑเตเดฑเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตฝ เดธเด‚เดตเดฟเดงเดพเดจเด™เตเด™เดณเดฟเดฒเตเด‚ เดธเดพเตปเดกเตโ€Œเดฌเต‹เด•เตโ€Œเดธเต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเดฒเตเด‚ เดฎเตเดคเดฒเดพเดฏเดต.

เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เด…เดตเดฒเต‹เด•เดจ เดญเดพเด—เด‚ เด‡เดตเดฟเดŸเต† เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟ เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเตเด‚ เดฌเดฟเดชเดฟเดŽเดซเต เด‡เด•เตเด•เต‹เดธเดฟเดธเตเดฑเตเดฑเดตเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเต‹เด•เตเด•เดพเด‚.

เดตเตเดฏเดคเดฟเดšเดฒเดจเด‚: เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ

เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดตเดฟเดญเดพเด—เด™เตเด™เดณเดฟเดฒเต† เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เตเดฑเดžเตเดžเดคเต เดจเดฟเดฐเดตเดงเดฟ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดจเตเดจเต‡เด•เตเด•เดพเด‚ llvm/clang bpf เดชเดฟเดจเตเดคเตเดฃเดฏเต‹เดŸเต† เด’เดชเตเดชเด‚ bpftool. เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดตเดฟเด•เดธเดจ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เต‡เตผเดฃเดฒเตเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเดพเดฏเดฟเด•เตเด•เดพเด‚. เดžเด™เตเด™เดณเตเดŸเต† เด…เดตเดคเดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เดฏเต‹เดœเดฟเดชเตเดชเดฟเดจเต เดญเด‚เด—เด‚ เดตเดฐเดพเดคเดฟเดฐเดฟเด•เตเด•เดพเดจเดพเดฃเต เดˆ เดญเดพเด—เด‚ เดคเดพเดดเต† เดจเตฝเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต.

BPF เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เตป เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เดณเตเด‚ เด‡เตปเดธเตเดŸเตเดฐเด•เตเดทเตป เดธเดฟเดธเตเดฑเตเดฑเดตเตเด‚

เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดธเดฟ เดญเดพเดทเดฏเดฟเตฝ เดŽเดดเตเดคเตเด•เดฏเตเด‚ เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดค เดถเต‡เดทเด‚ เดจเต‡เดฑเตเดฑเต€เดตเต เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚ เดŽเดจเตเดจ เดตเดธเตเดคเตเดค เด•เดฃเด•เตเด•เดฟเดฒเต†เดŸเตเดคเตเดคเดพเดฃเต เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเตเด‚ เด•เดฎเดพเตปเดกเต เดธเดฟเดธเตเดฑเตเดฑเดตเตเด‚ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเต†เดŸเตเดคเตเดคเดคเต. เด…เดคเดฟเดจเดพเตฝ, เด†เดงเตเดจเดฟเด• เดฏเดจเตเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เด•เดดเดฟเดตเตเด•เดณเตเดŸเต† เด—เดฃเดฟเดคเดถเดพเดธเตเดคเตเดฐเดชเดฐเดฎเดพเดฏ เด…เตผเดคเตเดฅเดคเตเดคเดฟเตฝ, เด•เดตเดฒเดฏเดฟเดฒเต‡เด•เตเด•เต เด•เดฃเตเดฃเตเดตเต†เดšเตเดšเดพเดฃเต เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดตเตเด‚ เด•เดฎเดพเตปเดกเตเด•เดณเตเดŸเต† เดธเต†เดฑเตเดฑเตเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเดคเต. เด•เต‚เดŸเดพเดคเต†, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเตฝ เดตเดฟเดตเดฟเดง เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เตพ เดเตผเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด…เดŸเตเดคเตเดคเดฟเดŸเต† เดตเดฐเต† เดฒเต‚เดชเตเดชเตเด•เดณเตเด‚ เดธเดฌเตเดฑเต‚เดŸเตเดŸเต€เดจเตเด•เดณเตเด‚ เดŽเดดเตเดคเตเดจเตเดจเดคเต เดธเดพเดงเตเดฏเดฎเดฒเตเดฒเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ 4096 เด†เดฏเดฟ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต (เด‡เดชเตเดชเต‹เตพ เดชเตเดฐเดฟเดตเดฟเดฒเต‡เดœเตเดกเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เด’เดฐเต เดฆเดถเดฒเด•เตเดทเด‚ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดตเดฐเต† เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚).

เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเต เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เต เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเดพเดตเตเดจเตเดจ เดชเดคเดฟเดจเตŠเดจเตเดจเต 64-เดฌเดฟเดฑเตเดฑเต เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เตพ เด‰เดฃเตเดŸเต r0-r10 เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เต—เดฃเตเดŸเดฑเตเด‚. เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเด• r10 เด’เดฐเต เดซเตเดฐเต†เดฏเดฟเด‚ เดชเต‹เดฏเดฟเดจเตเดฑเตผ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดตเดพเดฏเดฟเด•เตเด•เดพเตป เดฎเดพเดคเตเดฐเด‚. เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เดฑเตบเดŸเตˆเดฎเดฟเตฝ 512-เดฌเตˆเดฑเตเดฑเต เดธเตเดฑเตเดฑเดพเด•เตเด•เดฟเดฒเต‡เด•เตเด•เตเด‚ เดฎเดพเดชเตเดชเตเด•เดณเตเดŸเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เด…เตบเดฒเดฟเดฎเดฟเดฑเตเดฑเดกเต เดฎเต†เดฎเตเดฎเดฑเดฟ เดชเด™เตเด•เดฟเดŸเดฒเดฟเดฒเต‡เด•เตเด•เตเด‚ เด†เด•เตเดธเดธเต เด‰เดฃเตเดŸเต.

BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดธเต†เดฑเตเดฑเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚-เดŸเตˆเดชเตเดชเต เด•เต‡เตผเดฃเตฝ เดธเดนเดพเดฏเดฟเด•เดณเตเด‚ เด…เดŸเตเดคเตเดคเด•เดพเดฒเดคเตเดคเดพเดฏเดฟ เดฑเต†เด—เตเดฒเตผ เดซเด‚เด—เตเดทเดจเตเด•เดณเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดพเดฆเดฎเตเดฃเตเดŸเต. เดตเดฟเดณเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจ เด“เดฐเต‹ เดซเด‚เด—เตโ€Œเดทเดจเตเด‚ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เดณเดฟเตฝ เดชเดพเดธเดพเด•เตเด•เดฟเดฏ เด…เดžเตเดšเต เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เดตเดฐเต† เดŽเดŸเตเด•เตเด•เดพเด‚ r1-r5, เด•เต‚เดŸเดพเดคเต† เดฑเดฟเดŸเตเดŸเต‡เตบ เดฎเต‚เดฒเตเดฏเด‚ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต r0. เดซเด‚เด—เตเดทเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดŸเด™เตเด™เดฟเดฏเต†เดคเตเดคเดฟเดฏ เดถเต‡เดทเด‚, เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เดณเตเดŸเต† เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เด‰เดฑเดชเตเดชเตเดจเตฝเด•เตเดจเตเดจเต r6-r9 เดฎเดพเดฑเดฟเดฒเตเดฒ.

เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดตเดฟเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต r0-r11 เดจเดฟเดฒเดตเดฟเดฒเต† เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดจเตเดฑเต† เดŽเดฌเดฟเด เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เด•เดฃเด•เตเด•เดฟเดฒเต†เดŸเตเดคเตเดคเต, เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจ เดŽเดฒเตเดฒเดพ เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเตเด•เดณเตเด‚ เดฏเดฅเดพเตผเดคเตเดฅ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เด…เดฆเตเดตเดฟเดคเต€เดฏเดฎเดพเดฏเดฟ เดฎเดพเดชเตเดชเต เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดตเต‡เดฃเตเดŸเดฟ x86_64 เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต r1-r5, เดซเด‚เด—เตโ€Œเดทเตป เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เด•เตˆเดฎเดพเดฑเดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚ rdi, rsi, rdx, rcx, r8, เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เด•เตˆเดฎเดพเดฑเดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดต x86_64. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด‡เดŸเดคเตเดตเดถเดคเตเดคเตเดณเตเดณ เด•เต‹เดกเต เด‡เดคเตเดชเต‹เดฒเต† เดตเดฒเดคเตเดตเดถเดคเตเดคเตเดณเตเดณ เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

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

เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเด• r0 เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเดจเตเดฑเต† เดซเดฒเดตเตเด‚ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเดฒเตเด‚ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เดพเดจเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต r1 เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดธเดจเตเดฆเตผเดญเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเตผ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต - เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดคเดฐเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต, เด‡เดคเต เด’เดฐเต เด˜เดŸเดจเดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚ struct xdp_md (XDP-เดฏเตโ€Œเด•เตเด•เต) เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด˜เดŸเดจ struct __sk_buff (เดตเตเดฏเดคเตเดฏเดธเตเดค เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต) เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด˜เดŸเดจ struct pt_regs (เดตเตเดฏเดคเตเดฏเดธเตโ€Œเดค เดคเดฐเด‚ เดŸเตเดฐเต†เดฏเตโ€Œเดธเดฟเด‚เด—เต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เดพเดฏเดฟ), เดฎเตเดคเดฒเดพเดฏเดต.

เด…เดคเดฟเดจเดพเตฝ, เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เตพ, เด•เต‡เตผเดฃเตฝ เดธเดนเดพเดฏเดฟเด•เตพ, เด’เดฐเต เดธเตเดฑเตเดฑเดพเด•เตเด•เต, เด’เดฐเต เดธเดจเตเดฆเตผเดญ เดชเต‹เดฏเดฟเดจเตเดฑเตผ, เดฎเดพเดชเตเดชเตเด•เดณเตเดŸเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดชเด™เตเด•เดฟเดŸเตเดŸ เดฎเต†เดฎเตเดฎเดฑเดฟ เดŽเดจเตเดจเดฟเดต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดฏเดพเดคเตเดฐเดฏเดฟเตฝ เด‡เดคเต†เดฒเตเดฒเดพเด‚ เด…เดคเตเดฏเดพเดตเดถเตเดฏเดฎเดพเดฃเต†เดจเตเดจเดฒเตเดฒ, เดชเด•เตเดทเต‡...

เดจเดฎเตเด•เตเด•เต เดตเดฟเดตเดฐเดฃเด‚ เดคเตเดŸเดฐเดพเด‚, เดˆ เดตเดธเตเดคเตเด•เตเด•เดณเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เดฎเดพเตปเดกเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเด‚. เดŽเดฒเตเดฒเดพเด‚ (เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเดฒเตเดฒเดพ) BPF เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค 64-เดฌเดฟเดฑเตเดฑเต เดตเดฒเตเดชเตเดชเดฎเตเดฃเตเดŸเต. 64-เดฌเดฟเดฑเตเดฑเต เดฌเดฟเด—เต เดŽเตปเดกเดฟเดฏเตป เดฎเต†เดทเต€เดจเดฟเดฒเต† เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด‚ เดจเต‹เด•เตเด•เดฟเดฏเดพเตฝ เดจเดฟเด™เตเด™เตพ เด•เดพเดฃเตเด‚

เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

เด‡เดคเต Code - เด‡เดคเดพเดฃเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดŽเตปเด•เต‹เดกเดฟเด‚เด—เต, Dst/Src เดฏเดฅเดพเด•เตเดฐเดฎเด‚ เดฑเดฟเดธเต€เดตเดฑเดฟเดจเตเดฑเต†เดฏเตเด‚ เด‰เดฑเดตเดฟเดŸเดคเตเดคเดฟเดจเตเดฑเต†เดฏเตเด‚ เดŽเตปเด•เต‹เดกเดฟเด‚เด—เตเด•เดณเดพเดฃเต, Off - 16-เดฌเดฟเดฑเตเดฑเต เด’เดชเตเดชเดฟเดŸเตเดŸ เด‡เตปเดกเดจเตเดฑเต‡เดทเตป, เด’เดชเตเดชเด‚ Imm เดšเดฟเดฒ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ 32-เดฌเดฟเดฑเตเดฑเต เดธเตˆเตป เดšเต†เดฏเตเดค เดชเต‚เตผเดฃเตเดฃเดธเด‚เด–เตเดฏเดฏเดพเดฃเต (cBPF เดธเตเดฅเดฟเดฐเดพเด™เตเด•เด‚ K เดชเต‹เดฒเต†). เดŽเตปเด•เต‹เดกเดฟเด‚เด—เต Code เดฐเดฃเตเดŸเต เดคเดฐเด™เตเด™เดณเดฟเตฝ เด’เดจเตเดจเต เด‰เดฃเตเดŸเต:

เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

เด‡เตปเดธเตเดŸเตเดฐเด•เตเดทเตป เด•เตเดฒเดพเดธเตเด•เตพ 0, 1, 2, 3 เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดตเตผ เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต, BPF_LD, BPF_LDX, BPF_ST, BPF_STX, เดฏเดฅเดพเด•เตเดฐเดฎเด‚. เด•เตเดฒเดพเดธเตเด•เตพ 4, 7 (BPF_ALU, BPF_ALU64) ALU เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดฐเต‚เดชเต€เด•เดฐเดฟเด•เตเด•เตเด•. เด•เตเดฒเดพเดธเตเด•เตพ 5, 6 (BPF_JMP, BPF_JMP32) เดœเดฎเตเดชเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดฌเดฟเดชเดฟเดŽเดซเต เด‡เตปเดธเตเดŸเตเดฐเด•เตเดทเตป เดธเดฟเดธเตเดฑเตเดฑเด‚ เดชเด เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เดชเดฆเตเดงเดคเดฟ เด‡เดชเตเดฐเด•เดพเดฐเดฎเดพเดฃเต: เดŽเดฒเตเดฒเดพ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเด‚ เด…เดตเดฏเตเดŸเต† เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เดณเตเด‚ เดธเต‚เด•เตเดทเตเดฎเดฎเดพเดฏเดฟ เดฒเดฟเดธเตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดชเด•เดฐเด‚, เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดฒเต† เดฐเดฃเตเดŸเต เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เดžเด™เตเด™เตพ เดจเต‹เด•เตเด•เตเด‚, เด…เดตเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเตเด‚ เดŽเด™เตเด™เดจเต† เดšเต†เดฏเตเดฏเดพเดฎเต†เดจเตเดจเตเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด‚. BPF-เดจเดพเดฏเดฟ เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฌเตˆเดจเดฑเดฟ เดซเดฏเดฒเตเด•เตพ เดธเตเดตเดฎเต‡เดงเดฏเดพ เดกเดฟเดธเตเด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เดšเต†เดฏเตเดฏเตเด•. เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดชเดฟเดจเตเดจเต€เดŸเต เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเตฝ เดเด•เต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดตเต†เดฐเดฟเดซเดฏเตผ, เดœเต†เดเดŸเดฟ เด•เด‚เดชเตˆเดฒเตผ, เด•เตเดฒเดพเดธเดฟเด•เต เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เดตเดฟเดตเตผเดคเตเดคเดจเด‚, เดฎเดพเดชเตเดชเตเด•เตพ เดชเด เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด•เต‹เดณเดฟเด‚เด—เต เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ เดฎเตเดคเดฒเดพเดฏเดตเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดตเดฟเดญเดพเด—เด™เตเด™เดณเดฟเดฒเต† เดตเตเดฏเด•เตเดคเดฟเด—เดค เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเด‚ เดžเด™เตเด™เตพ เด•เดพเดฃเตเด‚.

เดžเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฟเด—เดค เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดžเด™เตเด™เตพ เดชเตเดฐเดงเดพเดจ เดซเดฏเดฒเตเด•เตพ เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเด‚ bpf.h ะธ bpf_common.h, BPF เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เดธเด‚เด–เตเดฏเดพ เด•เต‹เดกเตเด•เตพ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเต. เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เดชเด เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด•เต‚เดŸเดพเดคเต†/เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฌเตˆเดจเดฑเดฟเด•เตพ เดชเดพเดดเตโ€Œเดธเตเดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, เดธเด™เตเด•เต€เตผเดฃเตเดฃเดคเดฏเตเดŸเต† เด•เตเดฐเดฎเดคเตเดคเดฟเตฝ เด…เดŸเตเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเดฟเตฝ เดธเต†เดฎเดพเดจเตเดฑเดฟเด•เตโ€Œเดธเต เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เตเด‚: เด…เดจเต—เดฆเตเดฏเต‹เด—เดฟเด• eBPF เดธเตเดชเต†เดธเดฟเดซเดฟเด•เตเด•เต‡เดทเตป, BPF, XDP เดฑเดซเดฑเตปเดธเต เด—เตˆเดกเต, เด‡เตปเดธเตเดŸเตเดฐเด•เตเดทเตป เดธเต†เดฑเตเดฑเต, เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป/เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเด‚เด—เต/filter.txt เด•เต‚เดŸเดพเดคเต†, เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดฒเดฟเดจเด•เตเดธเต เดธเต‹เดดเตเดธเต เด•เต‹เดกเดฟเตฝ - เดตเต†เดฐเดฟเดซเดฏเตผ, JIT, BPF เดตเตเดฏเดพเด–เตเดฏเดพเดคเดพเดตเต.

เด‰เดฆเดพเดนเดฐเดฃเด‚: เดจเดฟเด™เตเด™เดณเตเดŸเต† เดคเดฒเดฏเดฟเตฝ BPF เดกเดฟเดธเตเด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เดšเต†เดฏเตเดฏเตเด•

เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดจเต‹เด•เตเด•เดพเด‚ readelf-example.c เดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ เดฌเตˆเดจเดฑเดฟ เดจเต‹เด•เตเด•เตเด•. เดฏเดฅเดพเตผเดคเตเดฅ เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดžเด™เตเด™เตพ เดตเต†เดณเดฟเดชเตเดชเต†เดŸเตเดคเตเดคเตเด‚ readelf-example.c เดคเดพเดดเต†, เดฌเตˆเดจเดฑเดฟ เด•เต‹เดกเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดคเดฟเดจเตเดฑเต† เดฒเต‹เดœเดฟเด•เต เดชเตเดจเดƒเดธเตเดฅเดพเดชเดฟเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚:

$ clang -target bpf -c readelf-example.c -o readelf-example.o -O2
$ llvm-readelf -x .text readelf-example.o
Hex dump of section '.text':
0x00000000 b7000000 01000000 15010100 00000000 ................
0x00000010 b7000000 02000000 95000000 00000000 ................

เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเดฟเดฒเต† เด†เดฆเตเดฏ เดจเดฟเดฐ readelf เด’เดฐเต เด‡เตปเดกเดจเตเดฑเต‡เดทเตป เด†เดฃเต, เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเตฝ เดจเดพเดฒเต เด•เดฎเดพเตปเดกเตเด•เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต:

Code Dst Src Off  Imm
b7   0   0   0000 01000000
15   0   1   0100 00000000
b7   0   0   0000 02000000
95   0   0   0000 00000000

เด•เดฎเดพเตปเดกเต เด•เต‹เดกเตเด•เตพ เดคเตเดฒเตเดฏเดฎเดพเดฃเต b7, 15, b7 ะธ 95. เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž เดชเตเดฐเดพเดงเดพเดจเตเดฏเดฎเตเดณเตเดณ เดฎเต‚เดจเตเดจเต เดฌเดฟเดฑเตเดฑเตเด•เตพ เด‡เตปเดธเตเดŸเตเดฐเด•เตเดทเตป เด•เตเดฒเดพเดธเต เด†เดฃเต†เดจเตเดจเต เด“เตผเด•เตเด•เตเด•. เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดŽเดฒเตเดฒเดพ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เดจเดพเดฒเดพเดฎเดคเตเดคเต† เดฌเดฟเดฑเตเดฑเต เดถเต‚เดจเตเดฏเดฎเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เดจเดฟเตผเดฆเตเดฆเต‡เดถ เด•เตเดฒเดพเดธเตเด•เตพ เดฏเดฅเดพเด•เตเดฐเดฎเด‚ 7, 5, 7, 5 เด†เดฃเต. เด•เตเดฒเดพเดธเต 7 เด†เดฃเต BPF_ALU64, เด•เต‚เดŸเดพเดคเต† 5 เด†เดฃเต BPF_JMP. เดฐเดฃเตเดŸเต เด•เตเดฒเดพเดธเตเด•เตพเด•เตเด•เตเด‚, เดจเดฟเตผเดฆเตเดฆเต‡เดถ เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เด’เดจเตเดจเตเดคเดจเตเดจเต†เดฏเดพเดฃเต (เดฎเตเด•เดณเดฟเตฝ เด•เดพเดฃเตเด•) เด•เต‚เดŸเดพเดคเต† เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‡เดคเตเดชเต‹เดฒเต† เดฎเดพเดฑเตเดฑเดฟเดฏเต†เดดเตเดคเดพเด‚ (เด…เดคเต‡ เดธเดฎเดฏเด‚ เดžเด™เตเด™เตพ เดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจ เด•เต‹เดณเด™เตเด™เตพ เดฎเดจเตเดทเตเดฏ เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดตเต€เดฃเตเดŸเตเด‚ เดŽเดดเตเดคเตเด‚):

Op S  Class   Dst Src Off  Imm
b  0  ALU64   0   0   0    1
1  0  JMP     0   1   1    0
b  0  ALU64   0   0   0    2
9  0  JMP     0   0   0    0

เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ b เด•เตเดฒเดพเดธเต ALU64 เด†เดฃเต BPF_MOV. เด‡เดคเต เดกเต†เดธเตเดฑเตเดฑเดฟเดจเต‡เดทเตป เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเดจเต เด’เดฐเต เดฎเต‚เดฒเตเดฏเด‚ เดจเตฝเด•เตเดจเตเดจเต. เดฌเดฟเดฑเตเดฑเต เดธเดœเตเดœเดฎเดพเด•เตเด•เดฟเดฏเดพเตฝ s (เด‰เดฑเดตเดฟเดŸเด‚), เดคเตเดŸเตผเดจเตเดจเต เดฎเต‚เดฒเตเดฏเด‚ เด‰เดฑเดตเดฟเดŸ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดŸเตเดคเตเดคเดคเดพเดฃเต, เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเดฒเต†เดจเตเดจเดชเต‹เดฒเต†, เด…เดคเต เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดฎเต‚เดฒเตเดฏเด‚ เดซเต€เตฝเดกเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต Imm. เด…เดคเดฟเดจเดพเตฝ เด†เดฆเตเดฏเดคเตเดคเต†เดฏเตเด‚ เดฎเต‚เดจเตเดจเดพเดฎเดคเตเดคเต†เดฏเตเด‚ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเดฟเตฝ เดžเด™เตเด™เตพ เด“เดชเตเดชเดฑเต‡เดทเตป เดจเดŸเดคเตเดคเตเดจเตเดจเต r0 = Imm. เด•เต‚เดŸเดพเดคเต†, JMP เด•เตเดฒเดพเดธเต 1 เดชเตเดฐเดตเตผเดคเตเดคเดจเดฎเดพเดฃเต BPF_JEQ (เดคเตเดฒเตเดฏเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ เดšเดพเดŸเตเด•). เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดฌเดฟเดฑเตเดฑเต เดฎเตเดคเตฝ S เดชเต‚เดœเตเดฏเดฎเดพเดฃเต, เด‡เดคเต เด‰เดฑเดตเดฟเดŸ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เดฎเต‚เดฒเตเดฏเดคเตเดคเต† เดซเต€เตฝเดกเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต Imm. เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเตฝ, เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเต PC + OffเดŽเดตเดฟเดŸเต† PC, เดชเดคเดฟเดตเตเดชเต‹เดฒเต†, เด…เดŸเตเดคเตเดค เดจเดฟเตผเดฆเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดฒเดพเดธเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ, JMP เด•เตเดฒเดพเดธเต 9 เด“เดชเตเดชเดฑเต‡เดทเตป เด†เดฃเต BPF_EXIT. เดˆ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เตเดจเตเดจเต r0. เดจเดฎเตเดฎเตเดŸเต† เดชเดŸเตเดŸเดฟเด•เดฏเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดชเตเดคเดฟเดฏ เด•เต‹เดณเด‚ เดšเต‡เตผเด•เตเด•เดพเด‚:

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

เดžเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เด•เต‚เดŸเตเดคเตฝ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏ เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดฎเดพเดฑเตเดฑเดฟเดฏเต†เดดเตเดคเดพเด‚:

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

เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเตฝ เด‰เดณเตเดณเดคเต เด“เตผเดคเตเดคเดพเตฝ r1 เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เต‡เตผเดฃเดฒเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เดธเดจเตเดฆเตผเดญเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเตผ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต r0 เดฎเต‚เดฒเตเดฏเด‚ เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเต, เด…เดชเตเดชเต‹เตพ เดธเดจเตเดฆเตผเดญเดคเตเดคเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเต‹เดฏเดฟเดจเตเดฑเตผ เดชเต‚เดœเตเดฏเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดžเด™เตเด™เตพ 1 เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเต, เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚ - 2. เด‰เดฑเดตเดฟเดŸเด‚ เดจเต‹เด•เตเด•เดฟ เดจเดฎเตเดฎเตพ เดถเดฐเดฟเดฏเดพเดฃเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

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

เด…เดคเต†, เด‡เดคเตŠเดฐเต เด…เตผเดคเตเดฅเดถเต‚เดจเตเดฏเดฎเดพเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เดจเดพเดฒเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เด’เดดเดฟเดตเดพเด•เตเด•เตฝ เด‰เดฆเดพเดนเดฐเดฃเด‚: 16-เดฌเตˆเดฑเตเดฑเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด‚

เดšเดฟเดฒ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ 64 เดฌเดฟเดฑเตเดฑเตเด•เดณเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เดŽเดŸเตเด•เตเด•เตเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดจเต‡เดฐเดคเตเดคเต† เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เดฌเดพเดงเด•เดฎเดพเดฃเต lddw (เด•เต‹เดกเต = 0x18 = BPF_LD | BPF_DW | BPF_IMM) - เดซเต€เตฝเดกเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด‡เดฐเดŸเตเดŸ เดตเดพเด•เตเด•เต เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด• Imm. เดตเดธเตเดคเตเดค เด…เดคเดพเดฃเต Imm 32 เดตเดฒเตเดชเตเดชเดฎเตเดฃเตเดŸเต, เด‡เดฐเดŸเตเดŸ เดตเดพเด•เตเด•เต 64 เดฌเดฟเดฑเตเดฑเตเด•เดณเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เด’เดฐเต 64-เดฌเดฟเดฑเตเดฑเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเดคเตเดคเดฟเตฝ เด’เดฐเต เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต 64-เดฌเดฟเดฑเตเดฑเต เด‰เดŸเดจเดŸเดฟ เดฎเต‚เดฒเตเดฏเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดฟเดฒเตเดฒ. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดซเต€เตฝเดกเดฟเตฝ 64-เดฌเดฟเดฑเตเดฑเต เดฎเต‚เดฒเตเดฏเดคเตเดคเดฟเดจเตเดฑเต† เดฐเดฃเตเดŸเดพเด‚ เดญเดพเด—เด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด…เดŸเตเดคเตเดคเตเดณเตเดณ เดฐเดฃเตเดŸเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต Imm. เด‰เดฆเดพเดนเดฐเดฃเด‚:

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

เด’เดฐเต เดฌเตˆเดจเดฑเดฟ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเตฝ เดฐเดฃเตเดŸเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดฎเดพเดคเตเดฐเดฎเต‡เดฏเตเดณเตเดณเต‚:

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

เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดžเด™เตเด™เตพ เดตเต€เดฃเตเดŸเตเด‚ เด•เดพเดฃเตเด‚ lddw, เดžเด™เตเด™เตพ เดธเตเดฅเดฒเด‚ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เดฎเดพเดชเตเดชเตเด•เดณเต‹เดŸเตŠเดชเตเดชเด‚ เดœเต‹เดฒเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ.

เด‰เดฆเดพเดนเดฐเดฃเด‚: เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดŸเต‚เดณเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฌเดฟเดชเดฟเดŽเดซเต เดกเดฟเดธเตเด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด…เดคเดฟเดจเดพเตฝ, เดžเด™เตเด™เตพ BPF เดฌเตˆเดจเดฑเดฟ เด•เต‹เดกเตเด•เตพ เดตเดพเดฏเดฟเด•เตเด•เดพเตป เดชเด เดฟเดšเตเดšเต, เด†เดตเดถเตเดฏเดฎเต†เด™เตเด•เดฟเตฝ เดเดคเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเดตเตเด‚ เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดฏเดพเตป เดคเดฏเตเดฏเดพเดฑเดพเดฃเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดชเตเดฐเดพเดฏเต‹เด—เดฟเด•เดฎเดพเดฏเดฟ เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดŸเต‚เดณเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดกเดฟเดธเตเด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เด•เต‚เดŸเตเดคเตฝ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดตเตเด‚ เดตเต‡เด—เดคเดฏเตเดฎเดพเดฃเต†เดจเตเดจเต เดชเดฑเดฏเต‡เดฃเตเดŸเดคเดพเดฃเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต:

$ llvm-objdump -d x64.o

Disassembly of section .text:

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

BPF เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเตเดŸเต† เดœเต€เดตเดฟเดคเดšเด•เตเดฐเด‚, bpffs เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚

(เดˆ เด‰เดชเดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดšเดฟเดฒ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพ เดžเดพเตป เด†เดฆเตเดฏเด‚ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดฟเดฏเดคเต เดจเต‡เดพเดฎเตเดชเต เด…เดฒเด•เตเดธเดฟ เดธเตเดฑเตเดฑเดพเดฐเต‹เดตเต‹เดฏเดฟเดฑเตเดฑเต‹เดตเต BPF เดฌเตเดฒเต‹เด—เต.)

BPF เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เตพ - เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเด‚ เดฎเดพเดชเตเดชเตเด•เดณเตเด‚ - เด•เดฎเดพเตปเดกเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเดพเดฃเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต BPF_PROG_LOAD ะธ BPF_MAP_CREATE เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ bpf(2), เด…เดŸเตเดคเตเดค เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เด‡เดคเต เดŽเด™เตเด™เดจเต† เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเด‚. เด‡เดคเต เด•เต‡เตผเดฃเตฝ เดกเดพเดฑเตเดฑ เด˜เดŸเดจเด•เดณเตเด‚ เด…เดตเดฏเดฟเตฝ เด“เดฐเต‹เดจเตเดจเดฟเดจเตเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต refcount (เดฑเดซเดฑเตปเดธเต เด•เต—เดฃเตเดŸเต) เด’เดจเตเดจเดพเดฏเดฟ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดšเต‚เดฃเตเดŸเดฟเด•เตเด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด‚. เดนเดพเตปเดกเดฟเตฝ เด…เดŸเดšเตเดš เดถเต‡เดทเด‚ refcount เด’เดฌเตเดœเด•เตเดฑเตเดฑเต เด’เดจเตเดจเดพเดฏเดฟ เด•เตเดฑเดฏเตเดจเตเดจเต, เด…เดคเต เดชเต‚เดœเตเดฏเดคเตเดคเดฟเตฝ เดŽเดคเตเดคเตเดฎเตเดชเต‹เตพ, เดตเดธเตเดคเต เดจเดถเดฟเดชเตเดชเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต.

เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฎเดพเดชเตเดชเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดชเดฟเดจเตเดจเต† refcount เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดคเดคเดฟเดจเตเดถเต‡เดทเด‚ เดˆ เดฎเดพเดชเตเดชเตเด•เตพ เด’เดจเตเดจเดพเดฏเดฟ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดพเดฏเดคเต. เด…เดตเดฐเตเดŸเต† เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เด‡เดชเตเดชเต‹เดดเตเด‚ เด…เดŸเดฏเตโ€Œเด•เตเด•เดพเดจเดพเด•เตเด‚ refcount เดชเต‚เดœเตเดฏเดฎเดพเด•เดฟเดฒเตเดฒ:

เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เดฒเต‹เดกเตเดšเต†เดฏเตโ€Œเดคเดคเดฟเดจเตเดถเต‡เดทเด‚, เดžเด™เตเด™เตพ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด…เดคเต เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด‡เดตเดจเตเดฑเต เดœเดจเดฑเต‡เดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เด…เดฑเตเดฑเดพเดšเตเดšเตเดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด‡เตปเด•เดฎเดฟเด‚เด—เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต‹ เดšเดฟเดฒเดคเดฟเดฒเต‡เด•เตเด•เต เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต‹ เดžเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เด’เดฐเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเตฝ เด‡เดŸเดพเด‚ tracepoint เด•เดพเดฎเตเดชเดฟเตฝ. เดˆ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ, เดฑเดซเดฑเตปเดธเต เด•เต—เดฃเตเดŸเดฑเตเด‚ เด’เดจเตเดจเดพเดฏเดฟ เดตเตผเดฆเตเดงเดฟเด•เตเด•เตเด‚, เดฒเต‹เดกเตผ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดฒเต† เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เด…เดŸเดฏเตเด•เตเด•เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เด•เดดเดฟเดฏเตเด‚.

เดจเดฎเตเดฎเตพ เด‡เดชเตเดชเต‹เตพ เดฌเต‚เดŸเตเดŸเตเดฒเต‹เดกเตผ เดทเดŸเตเดŸเตเดกเต—เตบ เดšเต†เดฏเตเดคเดพเตฝ เดŽเดจเตเดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเด‚? เด‡เดคเต เด‡เดตเดจเตเดฑเต เดœเดจเดฑเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† (เดนเตเด•เตเด•เต) เดคเดฐเดคเตเดคเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดฒเต‹เดกเตผ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดคเดฟเดจเต เดถเต‡เดทเด‚ เดŽเดฒเตเดฒเดพ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดนเตเด•เตเด•เตเด•เดณเตเด‚ เดจเดฟเดฒเดจเดฟเตฝเด•เตเด•เตเด‚, เด‡เดตเดฏเดพเดฃเต เด—เตเดฒเต‹เดฌเตฝ เดนเตเด•เตเด•เตเด•เตพ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเดต. เด•เต‚เดŸเดพเดคเต†, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดŸเตเดฐเต†เดฏเตเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดชเตเดฐเด•เตเดฐเดฟเดฏ เด…เดตเดธเดพเดจเดฟเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚ เดฑเดฟเดฒเต€เดธเต เดšเต†เดฏเตเดฏเตเด‚ (เด…เดคเดฟเดจเดพเตฝ เดฒเต‹เด•เตเด•เตฝ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต, "เดฒเต‹เด•เตเด•เตฝ เดฎเตเดคเตฝ เดชเตเดฐเต‹เดธเดธเต เดตเดฐเต†"). เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดฎเดพเดฏเดฟ, เดฒเต‹เด•เตเด•เตฝ เดนเตเด•เตเด•เตเด•เตพเด•เตเด•เต เดŽเดฒเตเดฒเดพเดฏเตโ€Œเดชเตเดชเต‹เดดเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเดฟเตฝ เด’เดฐเต เด…เดจเตเดฌเดจเตเดง เดซเดฏเตฝ เดกเดฟเดธเตโ€Œเด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเตผ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เด…เดคเดฟเดจเดพเตฝ เดชเตเดฐเต‹เดธเดธเตเดธเต เด…เดŸเดฏเตโ€Œเด•เตเด•เตเดฎเตเดชเต‹เตพ เด…เดคเต เด…เดŸเดฏเตเด•เตเด•เตเด‚, เดชเด•เตเดทเต‡ เด†เด—เต‹เดณ เด•เตŠเดณเตเดคเตเดคเตเด•เตพ เด…เด™เตเด™เดจเต†เดฏเดฒเตเดฒ. เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ, เดฑเต†เดกเต เด•เตเดฐเต‹เดธเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดฒเต‹เด•เตเด•เตฝ, เด—เตเดฒเต‹เดฌเตฝ เดนเตเด•เตเด•เตเด•เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดฒเต‹เดกเตผ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตฝ เดตเดธเตเดคเตเด•เตเด•เดณเตเดŸเต† เด†เดฏเตเดธเตเดธเดฟเดจเต† เดŽเด™เตเด™เดจเต† เดฌเดพเดงเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เด•เดพเดฃเดฟเด•เตเด•เดพเตป เดžเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเต.

เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดตเตเด‚ เด†เด—เต‹เดณเดตเตเดฎเดพเดฏ เด•เตŠเดณเตเดคเตเดคเตเด•เตพ เดคเดฎเตเดฎเดฟเตฝ เดตเตเดฏเดคเตเดฏเดพเดธเดฎเตเดณเตเดณเดคเต? เดšเดฟเดฒ เดคเดฐเด‚ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต เด’เดฐเต เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด‡เดŸเดฎเดฟเดฒเตเดฒเดพเดคเต† เด…เตผเดคเตเดฅเดฎเดพเด•เตเด•เตเดจเตเดจเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, DDoS เดชเดฐเดฟเดฐเด•เตเดทเดฃเด‚ เดธเด™เตเด•เตฝเดชเตเดชเดฟเด•เตเด•เตเด• - เดฌเต‚เดŸเตเดŸเตเดฒเต‹เดกเตผ เดจเดฟเดฏเดฎเด™เตเด™เตพ เดŽเดดเตเดคเตเด•เดฏเตเด‚ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต† เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเดฒเต‡เด•เตเด•เต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดคเดฟเดจเตเดถเต‡เดทเด‚ เดฌเต‚เดŸเตเดŸเตเดฒเต‹เดกเดฑเดฟเดจเต เดชเต‹เดฏเดฟ เดธเตเดตเดฏเด‚ เด•เตŠเดฒเตเดฒเดพเตป เด•เดดเดฟเดฏเตเด‚. เดฎเดฑเตเดตเดถเดคเตเดคเต, เดชเดคเตเดคเต เดฎเดฟเดจเดฟเดฑเตเดฑเดฟเดจเตเดณเตเดณเดฟเตฝ เดจเดฟเด™เตเด™เตพ เดฎเตเดŸเตเดŸเตเด•เตเดคเตเดคเดฟ เดŽเดดเตเดคเดฟเดฏ เด’เดฐเต เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เดŸเตเดฐเต†เดฏเตโ€Œเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดธเด™เตเด•เตฝเดชเตเดชเดฟเด•เตเด•เตเด• - เด…เดคเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเดฎเตเดชเต‹เตพ, เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดฎเดพเดฒเดฟเดจเตเดฏเด‚ เด…เดตเดถเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต, เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เด•เตŠเดณเตเดคเตเดคเตเด•เตพ เด…เดคเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเด‚.

เดฎเดฑเตเดตเดถเดคเตเดคเต, เดจเดฟเด™เตเด™เตพ เด•เต‡เตผเดฃเดฒเดฟเดฒเต† เด’เดฐเต เดŸเตเดฐเต†เดฏเตโ€Œเดธเตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเต เดจเดฟเดฐเดตเดงเดฟ เดตเตผเดทเด™เตเด™เดณเดพเดฏเดฟ เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดธเด™เตเด•เตฝเดชเตเดชเดฟเด•เตเด•เตเด•. เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดจเดฟเด™เตเด™เตพ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดญเดพเด—เด‚ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดพเดจเตเด‚ เด•เดพเดฒเดพเด•เดพเดฒเด™เตเด™เดณเดฟเตฝ เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เดพเดจเตเด‚ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. bpf เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดˆ เด…เดตเดธเดฐเด‚ เดจเตฝเด•เตเดจเตเดจเต. เดฌเดฟเดชเดฟเดŽเดซเต เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเต† เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจ เดซเดฏเดฒเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดพเดจเตเด‚ เด…เดคเตเดตเดดเดฟ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚ เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด‡เตป-เดฎเต†เดฎเตเดฎเดฑเดฟ-เด’เตบเดฒเดฟ เดธเตเดฏเต‚เดกเต‹-เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเดฎเดพเดฃเดฟเดคเต. refcount เดตเดธเตเดคเตเด•เตเด•เตพ. เด‡เดคเดฟเดจเตเดถเต‡เดทเด‚, เดฒเต‹เดกเดฑเดฟเดจเต เดชเตเดฑเดคเตเดคเตเด•เดŸเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เดคเต เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดตเดธเตเดคเตเด•เตเด•เตพ เดœเต€เดตเดจเต‹เดŸเต† เดจเดฟเดฒเดจเดฟเตฝเด•เตเด•เตเด‚.

เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เด’เดจเตเดจเต: เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš เดฌเดฟเดชเดฟเดŽเดซเต

BPF เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเต† เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เตเดจเตเดจ เดซเดฏเดฒเตเด•เตพ bpffs-เตฝ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต† "เดชเดฟเดจเตเดจเดฟเด‚เด—เต" เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต (เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดตเดพเด•เตเดฏเดคเตเดคเดฟเดฒเต†เดจเตเดจเดชเต‹เดฒเต†: "เดชเตเดฐเต‹เดธเดธเตเดธเดฟเดจเต เด’เดฐเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเต‹ เดฎเดพเดชเตเดชเต‹ เดชเดฟเตป เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚"). BPF เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดซเดฏเตฝ เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเตเดŸเต† เด†เดฏเตเดธเตเดธเต เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เด†เด—เต‹เดณ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เดณเตเดŸเต† เด‰เดชเดฏเต‹เด—เด•เตเดทเดฎเดคเดฏเตโ€Œเด•เตเด•เตเด‚ เด…เตผเดคเตเดฅเดฎเดพเด•เตเด•เตเดจเตเดจเต - เด†เด—เต‹เดณ DDoS เดชเดฐเดฟเดฐเด•เตเดทเดฃ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เตเดฎเตเดชเต‹เตพ, เดžเด™เตเด™เตพเด•เตเด•เต เดตเดจเตเดจเต เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เด•เดพเดฒเดพเด•เดพเดฒเด™เตเด™เดณเดฟเตฝ.

BPF เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดฎเตŒเดฃเตเดŸเต เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต /sys/fs/bpf, เดŽเดจเตเดจเดพเตฝ เด‡เดคเต เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเดฟ เดฎเตŒเดฃเตเดŸเต เดšเต†เดฏเตเดฏเดพเดตเตเดจเตเดจเดคเดพเดฃเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด‡เดคเตเดชเต‹เดฒเต†:

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

เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดชเต‡เดฐเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต BPF_OBJ_PIN BPF เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ. เดšเดฟเดคเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเดŸเตเด•เตเด•เดพเด‚, เด…เดคเต เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเด•, เด…เดชเตเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•, เดชเดฟเตป เดšเต†เดฏเตเดฏเตเด• bpffs. เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เด’เดจเตเดจเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดฟเดฒเตเดฒ, เดžเด™เตเด™เตพ เด•เต‹เดกเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต, เด…เดคเดฟเดจเดพเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดชเตเดจเตผเดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚:

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

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

เดจเดฎเตเด•เตเด•เต เดˆ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดคเต เดซเดฏเตฝ เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดฒเต‹เด•เตเด•เตฝ เด•เต‹เดชเตเดชเดฟ เด‰เดฃเตเดŸเดพเด•เตเด•เดพเด‚ bpffs:

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

เด‡เดชเตเดชเต‹เตพ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเดฎเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเด‚ bpftool เด’เดชเตเดชเด‚ เด‡เดคเต‹เดŸเตŠเดชเตเดชเดฎเตเดณเตเดณ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเตเด•เตพ เดจเต‹เด•เตเด•เตเด• bpf(2) (เดธเตโ€ŒเดŸเตเดฐเต‡เดธเต เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเดฟเตฝ เดจเดฟเดจเตเดจเต เดšเดฟเดฒ เด…เดชเตเดฐเดธเด•เตเดคเดฎเดพเดฏ เดตเดฐเดฟเด•เตพ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตโ€Œเดคเต):

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

เด‡เดตเดฟเดŸเต† เดžเด™เตเด™เตพ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดคเต BPF_PROG_LOAD, เด•เต‡เตผเดฃเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เดฒเดญเดฟเดšเตเดšเต 3 เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต BPF_OBJ_PIN เดˆ เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เด’เดฐเต เดซเดฏเดฒเดพเดฏเดฟ เดชเดฟเตป เดšเต†เดฏเตเดคเต "bpf-mountpoint/test". เด‡เดคเดฟเดจเตเดถเต‡เดทเด‚ เดฌเต‚เดŸเตเดŸเตเดฒเต‹เดกเตผ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ bpftool เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ, เดชเด•เตเดทเต‡ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เต‡เตผเดฃเดฒเดฟเตฝ เดคเดจเตเดจเต† เดคเตเดŸเตผเดจเตเดจเต, เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚ เดžเด™เตเด™เตพ เด‡เดคเต เด’เดฐเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเดฒเต‡เด•เตเด•เตเด‚ เด…เดฑเตเดฑเดพเดšเตเดšเตเดšเต†เดฏเตโ€ŒเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ:

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

เดจเดฎเตเด•เตเด•เต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดซเดฏเตฝ เด’เดฌเตเดœเด•เตเดฑเตเดฑเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดพเด‚ unlink(2) เด…เดคเดฟเดจเตเดถเต‡เดทเด‚ เด…เดจเตเดฌเดจเตเดง เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดชเตเดชเต†เดŸเตเด‚:

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

เดตเดธเตเดคเตเด•เตเด•เตพ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต

เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เตพ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดžเด™เตเด™เตพ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดนเตเด•เตเด•เดฟเตฝ เดจเดฟเดจเตเดจเต (เด‡เดตเดจเตเดฑเต เดœเดจเดฑเต‡เดฑเตเดฑเตผ) เดตเดฟเดšเตเด›เต‡เดฆเดฟเดšเตเดšเดคเดฟเดจเตเดถเต‡เดทเด‚, เด’เดฐเต เดชเตเดคเดฟเดฏ เด‡เดตเดจเตเดฑเตเด‚ เด…เดคเดฟเดจเตเดฑเต† เดธเดฎเดพเดฐเด‚เดญเดคเตเดคเดฟเดจเต เด•เดพเดฐเดฃเดฎเดพเด•เดฟเดฒเตเดฒเต†เดจเตเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดจเดฟเดฒเดตเดฟเดฒเต† เดŽเดฒเตเดฒเดพ เดธเด‚เดญเดตเด™เตเด™เดณเตเด‚ เดธเดพเดงเดพเดฐเดฃ เด•เตเดฐเดฎเดคเตเดคเดฟเตฝ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด‚. .

เดšเดฟเดฒ เดคเดฐเด‚ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดจเดฟเด™เตเด™เดณเต† เดˆเดšเตเดšเดฏเดฟเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดพเดฏเดคเต. เดธเต€เด•เตเดตเตปเดธเต เด†เดฑเตเดฑเต‹เดฎเดฟเดธเดฟเดฑเตเดฑเดฟ เดจเตฝเด•เตเด• replace = detach old program, attach new program. เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดชเดดเดฏ เดชเดคเดฟเดชเตเดชเดฟเดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เดธเดœเต€เดต เดธเด‚เดญเดตเด™เตเด™เดณเตเด‚ เด…เดตเดฐเตเดŸเต† เดœเต‹เดฒเดฟ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เตเด‚, เด•เต‚เดŸเดพเดคเต† เดชเตเดคเดฟเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดคเดฟเดฏ เด‡เดตเดจเตเดฑเต เดนเดพเตปเดกเตโ€Œเดฒเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด‚, เด•เต‚เดŸเดพเดคเต† เด‡เดตเดฟเดŸเต† "เด†เดฑเตเดฑเต‹เดฎเดฟเดธเดฟเดฑเตเดฑเดฟ" เดŽเดจเตเดจเดคเดฟเดจเตผเดคเตเดฅเด‚ เด’เดฐเต เด‡เดตเดจเตเดฑเต เดชเต‹เดฒเตเด‚ เดจเดทเตโ€ŒเดŸเดฎเดพเด•เดฟเดฒเตเดฒ เดŽเดจเตเดจเดพเดฃเต.

เด‡เดตเดจเตเดฑเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เด…เดฑเตเดฑเดพเดšเตเดšเตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เด‡เดตเดจเตเดฑเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต เดžเด™เตเด™เตพ เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดคเดฐเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดชเดถเตเดšเดพเดคเตเดคเดฒเดคเตเดคเดฟเตฝ เด‡เดคเต เดชเด เดฟเด•เตเด•เตเดจเตเดจเดคเต เด…เตผเดคเตเดฅเดฎเดพเด•เตเด•เตเดจเตเดจเต. เดธเต†เดฎเดฟ. เด‰เดฆเดพเดนเดฐเดฃเด‚ เดคเดพเดดเต†, 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 เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดŽเดŸเตเดคเตเดคเต เด…เดคเต เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดจเตเดจ เดจเดฟเดฎเดฟเดทเดคเตเดคเดฟเตฝ, เดตเต†เดฐเดฟเดซเดฏเตผ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต, เดคเตเดŸเตผเดจเตเดจเต JIT เด•เด‚เดชเตˆเดฒเดฑเตเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ เดจเดฟเตผเดตเตเดตเดนเดฃเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด‚. เดฎเตเดฎเตเดชเดคเตเดคเต† เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เด…เดฆเตเดฆเต‡เดนเดคเตเดคเดฟเดจเต เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ เดŽเดจเตเดคเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดžเด™เตเด™เตพ เด•เดฃเตเดŸเต BPF เดตเดธเตเดคเตเด•เตเด•เดณเตเดŸเต† เดœเต€เดตเดฟเดค เดšเด•เตเดฐเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต.

เดžเด™เตเด™เตพ เด‡เดชเตเดชเต‹เตพ เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเดดเตเดคเตเด‚, เดŽเดจเตเดจเดพเตฝ เด†เดฆเตเดฏเด‚ เดจเดฎเตเดฎเตพ เดเดคเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดพเดฃเต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเต†เดจเตเดจเต เดคเต€เดฐเตเดฎเดพเดจเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต - เดจเดฎเตเดฎเตพ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต เดคเดฐเด‚ เดˆ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดฟเดจเตเดณเตเดณเดฟเตฝ, เดตเต†เดฐเดฟเดซเดฏเตผ เดŸเต†เดธเตเดฑเตเดฑเดฟเตฝ เดตเดฟเดœเดฏเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเดดเตเดคเตเด•. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดชเตเดฐเด•เตเดฐเดฟเดฏ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเด•เตเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป, เด‡เดตเดฟเดŸเต† เด’เดฐเต เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดชเดฐเดฟเดนเดพเดฐเด‚ เด‰เดฃเตเดŸเต: เดžเด™เตเด™เตพ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเดŸเตเด•เตเด•เตเด‚ BPF_PROG_TYPE_XDP, เด…เดคเต เดฎเต‚เดฒเตเดฏเด‚ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด‚ XDP_PASS (เดŽเดฒเตเดฒเดพ เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเตเด‚ เด’เดดเดฟเดตเดพเด•เตเด•เตเด•). BPF เด…เดธเด‚เดฌเตเดฒเดฑเดฟเตฝ เด‡เดคเต เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

r0 = 2
exit

เดžเด™เตเด™เตพ เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚ เด† เดžเด™เตเด™เตพ เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด‚, เดžเด™เตเด™เตพ เด…เดคเต เดŽเด™เตเด™เดจเต† เดšเต†เดฏเตเดฏเตเดฎเต†เดจเตเดจเต เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเดพเด‚:

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

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

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

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

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

    for ( ;; )
        pause();
}

เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดฒเต† เดฐเดธเด•เดฐเดฎเดพเดฏ เดธเด‚เดญเดตเด™เตเด™เตพ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเต เด’เดฐเต เด…เดฑเต‡เดฏเตเดŸเต† เดจเดฟเตผเดตเดšเดจเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเดพเดฃเต insns - เดฎเต†เดทเต€เตป เด•เต‹เดกเดฟเดฒเตเดณเตเดณ เดžเด™เตเด™เดณเตเดŸเต† BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚. เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เด“เดฐเต‹ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเด‚ เด˜เดŸเดจเดฏเดฟเตฝ เดชเดพเดฏเตเด•เตเด•เต เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต bpf_insn. เด†เดฆเตเดฏ เด˜เดŸเด•เด‚ insns เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเต r0 = 2, เดฐเดฃเตเดŸเดพเดฎเดคเต - exit.

เดชเดฟเตปเดตเดพเด™เตเด™เตเด•. เดฎเต†เดทเต€เตป เด•เต‹เดกเตเด•เตพ เดŽเดดเตเดคเตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เต‡เตผเดฃเตฝ เดนเต†เดกเตผ เดซเดฏเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เต‚เดŸเตเดคเตฝ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏ เดฎเดพเด•เตเดฐเต‹เด•เตพ เด•เต‡เตผเดฃเตฝ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเต. tools/include/linux/filter.h เดžเด™เตเด™เตพเด•เตเด•เต เดŽเดดเตเดคเดพเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต

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

เดŽเดจเตเดจเดพเตฝ เดจเต‡เดฑเตเดฑเต€เดตเต เด•เต‹เดกเดฟเตฝ เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเดดเตเดคเตเดจเตเดจเดคเต เด•เต‡เตผเดฃเดฒเดฟเตฝ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดŽเดดเตเดคเดพเดจเตเด‚ เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดฒเต‡เด–เดจเด™เตเด™เตพ เดŽเดดเตเดคเดพเดจเตเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเต‚ เดŽเดจเตเดจเดคเดฟเดจเดพเตฝ, เดˆ เดฎเดพเด•เตเดฐเต‹เด•เดณเตเดŸเต† เด…เดญเดพเดตเด‚ เดกเต†เดตเดฒเดชเตเดชเดฑเตเดŸเต† เดœเต€เดตเดฟเดคเดคเตเดคเต† เดถเดฐเดฟเด•เตเด•เตเด‚ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ.

BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเดฟเตผเดตเดšเดฟเดšเตเดš เดถเต‡เดทเด‚, เดžเด™เตเด™เตพ เด…เดคเต เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเต‡เด•เตเด•เต เดจเต€เด™เตเด™เตเดจเตเดจเต. เดžเด™เตเด™เดณเตเดŸเต† เดฎเดฟเดจเดฟเดฎเดฒเดฟเดธเตเดฑเตเดฑเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ attr เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดคเดฐเด‚, เดธเต†เดฑเตเดฑเต, เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚, เด†เดตเดถเตเดฏเดฎเดพเดฏ เดฒเตˆเดธเตปเดธเต, เดชเต‡เดฐเต เดŽเดจเตเดจเดฟเดต เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต "woo", เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดคเดคเดฟเดจเต เดถเต‡เดทเด‚ เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดชเตเดฐเต‹เด—เตเดฐเดพเด‚, เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดคเดคเตเดชเต‹เดฒเต†, เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต bpf.

เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจเด‚, เดชเต‡เดฒเต‹เดกเดฟเดจเต† เด…เดจเตเด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เด…เดจเดจเตเดคเดฎเดพเดฏ เดฒเต‚เดชเตเดชเดฟเตฝ เดžเด™เตเด™เตพ เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เด•เต‚เดŸเดพเดคเต†, เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดžเด™เตเด™เตพเด•เตเด•เต เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เดฟเดฏ เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เด…เดŸเดฏเตเด•เตเด•เตเดฎเตเดชเต‹เตพ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เต‡เตผเดฃเตฝ เดจเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚. bpf, เดžเด™เตเด™เตพ เด…เดคเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เด•เดพเดฃเดฟเดฒเตเดฒ.

เดถเดฐเดฟ, เดžเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฃเดคเตเดคเดฟเดจเต เดคเดฏเตเดฏเดพเดฑเดพเดฃเต. เดคเดพเดดเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดธเด‚เดฌเดฟเตพ เดšเต†เดฏเตเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚ straceเดŽเดฒเตเดฒเดพเด‚ เดถเดฐเดฟเดฏเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹เดฏเต†เดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป:

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

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

เดŽเดฒเตเดฒเดพเด‚ เดจเดจเตเดจเดพเดฏเดฟ, bpf(2) เดžเด™เตเด™เตพเด•เตเด•เต เดนเดพเตปเดกเดฟเตฝ 3 เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เดฟ, เดžเด™เตเด™เตพ เด…เดจเดจเตเดคเดฎเดพเดฏ เดฒเต‚เดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ pause(). เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดžเด™เตเด™เตพ เดฎเดฑเตเดฑเตŠเดฐเต เดŸเต†เตผเดฎเดฟเดจเดฒเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เดฏเดฟ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚ bpftool:

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

เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เด’เดฐเต เดฒเต‹เดกเต เดšเต†เดฏเตเดค เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‰เดฃเตเดŸเต†เดจเตเดจเต เดžเด™เตเด™เตพ เด•เดพเดฃเตเดจเตเดจเต woo เด†เด—เต‹เดณ เดเดกเดฟ 390 เด†เดฃเต, เดจเดฟเดฒเดตเดฟเตฝ เดชเตเดฐเต‹เด—เดคเดฟเดฏเดฟเดฒเดพเดฃเต simple-prog เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดฒเต‡เด•เตเด•เต เดšเต‚เดฃเตเดŸเดฟเด•เตเด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดคเตเดฑเดจเตเดจ เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เด‰เดฃเตเดŸเต (เด…เด™เตเด™เดจเต†เดฏเต†เด™เตเด•เดฟเตฝ simple-prog เด…เดชเตเดชเต‹เตพ เดœเต‹เดฒเดฟ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เตเด‚ woo เด…เดชเตเดฐเดคเตเดฏเด•เตเดทเดฎเดพเด•เตเด‚). เดชเตเดฐเดคเต€เด•เตเดทเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต†, เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ woo BPF เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดฒเต† เดฌเตˆเดจเดฑเดฟ เด•เต‹เดกเตเด•เดณเตเดŸเต† 16 เดฌเตˆเดฑเตเดฑเตเด•เตพ - เดฐเดฃเตเดŸเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เด…เดคเดฟเดจเตเดฑเต† เดจเต‡เดฑเตเดฑเต€เดตเต เดฐเต‚เดชเดคเตเดคเดฟเตฝ (x86_64) เด‡เดคเต เด‡เดคเดฟเดจเด•เด‚ 40 เดฌเตˆเดฑเตเดฑเตเด•เตพ เด†เดฃเต. เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดคเดฟเดจเตเดฑเต† เดฏเดฅเดพเตผเดคเตเดฅ เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดจเต‹เด•เตเด•เดพเด‚:

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

เด…เดคเตเดญเตเดคเด™เตเด™เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เด‡เดจเดฟ JIT เด•เดฎเตเดชเตˆเดฒเตผ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เด•เต‹เดกเต เดจเต‹เด•เตเด•เดพเด‚:

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

เดตเดณเดฐเต† เดซเดฒเดชเตเดฐเดฆเดฎเดฒเตเดฒ exit(2), เดŽเดจเตเดจเดพเตฝ เดจเตเดฏเดพเดฏเดฎเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ, เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต, เดจเดฟเดธเตเดธเดพเดฐเดฎเดฒเตเดฒเดพเดคเตเดค เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต JIT เด•เด‚เดชเตˆเดฒเตผ เดšเต‡เตผเดคเตเดค เด†เดฎเตเด–เดตเตเด‚ เดŽเดชเตเดชเดฟเดฒเต‹เด—เตเด‚ เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต.

เดฎเดพเดชเตเดธเต

BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต เดฎเดฑเตเดฑเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดธเตเดฅเดฒเดคเตเดคเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเดตเตเดจเตเดจ เด˜เดŸเดจเดพเดชเดฐเดฎเดพเดฏ เดฎเต†เดฎเตเดฎเดฑเดฟ เดเดฐเดฟเดฏเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เดˆ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เดณเต† เดฎเดพเดชเตเดชเตเด•เตพ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต, เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดต เดŽเด™เตเด™เดจเต† เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเดฎเต†เดจเตเดจเต เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เด•เดพเดฃเดฟเด•เตเด•เตเด‚ bpf.

เดฎเดพเดชเตเดชเตเด•เดณเตเดŸเต† เด•เดดเดฟเดตเตเด•เตพ เดชเด™เตเด•เดฟเดŸเตเดŸ เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เด•เตโ€Œเดธเดธเตเดธเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒเต†เดจเตเดจเต เดจเดฎเตเด•เตเด•เต เด‡เดชเตเดชเต‹เตพ เดคเดจเตเดจเต† เดชเดฑเดฏเดพเด‚. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเต‹เดฏเดฟเดจเตเดฑเดฑเตเด•เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‡เดจเตเดฑเตผเดซเต‡เดธเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเต‹เดฏเดฟเดจเตเดฑเดฑเตเด•เตพ, เดชเต†เตผเดซเต เด‡เดตเดจเตเดฑเตเด•เตพเด•เตเด•เตŠเดชเตเดชเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดฎเดพเดชเตเดชเตเด•เตพ เดฎเตเดคเดฒเดพเดฏเดต เด…เดŸเด™เตเด™เตเดจเตเดจ เดชเตเดฐเดคเตเดฏเต‡เด•-เด‰เดฆเตเดฆเต‡เดถเตเดฏ เดฎเดพเดชเตเดชเตเด•เตพ เด‰เดฃเตเดŸเต. เดตเดพเดฏเดจเด•เตเด•เดพเดฐเดจเต† เด†เดถเดฏเด•เตเด•เตเดดเดชเตเดชเดคเตเดคเดฟเดฒเดพเด•เตเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เด…เดตเดฐเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด‡เดตเดฟเดŸเต† เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดฟเดฒเตเดฒ. เด‡เดคเตเด•เต‚เดŸเดพเดคเต†, เดธเดฎเดจเตเดตเดฏ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดžเด™เตเด™เตพ เด…เดตเด—เดฃเดฟเด•เตเด•เตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ เด‡เดคเต เดžเด™เตเด™เดณเตเดŸเต† เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดงเดพเดจเดฎเดฒเตเดฒ. เดฒเดญเตเดฏเดฎเดพเดฏ เดฎเดพเดชเตเดชเต เดคเดฐเด™เตเด™เดณเตเดŸเต† เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดฒเดฟเดธเตเดฑเตเดฑเต เด‡เดคเดฟเตฝ เด•เดพเดฃเดพเด‚ <linux/bpf.h>, เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดจเดฎเตเดฎเตพ เดšเดฐเดฟเดคเตเดฐเดชเดฐเดฎเดพเดฏเดฟ เด†เดฆเตเดฏ เดคเดฐเด‚ เดนเดพเดทเต เดŸเต‡เดฌเดฟเตพ เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ เดŽเดŸเตเด•เตเด•เตเด‚ BPF_MAP_TYPE_HASH.

เดจเดฟเด™เตเด™เตพ C++ เดŽเดจเตเดจเดคเดฟเตฝ เด’เดฐเต เดนเดพเดทเต เดŸเต‡เดฌเดฟเตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เดชเดฑเดฏเตเด‚ unordered_map<int,long> woo, เดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเตฝ "เดŽเดจเดฟเด•เตเด•เต เด’เดฐเต เดฎเต‡เดถ เดตเต‡เดฃเด‚ woo เดชเดฐเดฟเดงเดฟเดฏเดฟเดฒเตเดฒเดพเดคเตเดค เดตเดฒเตเดชเตเดชเด‚, เด…เดคเดฟเดจเตเดฑเต† เด•เต€เด•เตพ เดคเดฐเด‚ int, เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดคเดฐเด‚ long" เด’เดฐเต เดฌเดฟเดชเดฟเดŽเดซเต เดนเดพเดทเต เดŸเต‡เดฌเดฟเตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดชเดŸเตเดŸเดฟเด•เดฏเตเดŸเต† เดชเดฐเดฎเดพเดตเดงเดฟ เดตเดฒเตเดชเตเดชเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฃเด‚ เดŽเดจเตเดจเดคเตŠเดดเดฟเดšเตเดšเดพเตฝ, เดžเด™เตเด™เตพ เด’เดฐเต‡ เด•เดพเดฐเตเดฏเด‚ เดคเดจเตเดจเต† เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต, เด•เต‚เดŸเดพเดคเต† เด•เต€เด•เดณเตเดŸเต†เดฏเตเด‚ เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เดคเดฐเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดชเด•เดฐเด‚, เด…เดตเดฏเตเดŸเต† เดตเดฒเตเดชเตเดชเด™เตเด™เตพ เดฌเตˆเดฑเตเดฑเตเด•เดณเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. . เดฎเดพเดชเตเดชเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด• BPF_MAP_CREATE เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ bpf. เด’เดฐเต เดฎเดพเดชเตเดชเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจ เด•เต‚เดŸเตเดคเดฒเต‹ เด•เตเดฑเดตเต‹ เด•เตเดฑเดžเตเดž เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเต‹เด•เตเด•เดพเด‚. BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เดฎเตเตป เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เดถเต‡เดทเด‚, เด‡เดคเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดคเต‹เดจเตเดจเตเด‚:

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

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

    for ( ;; )
        pause();
}

เด‡เดตเดฟเดŸเต† เดจเดฎเตเดฎเตพ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดจเดฟเตผเดตเตเดตเดšเดฟเด•เตเด•เตเดจเตเดจเต attr, เด…เดคเดฟเตฝ เดจเดฎเตเดฎเตพ เดชเดฑเดฏเตเดจเตเดจเต โ€œเดŽเดจเดฟเด•เตเด•เต เด•เต€เด•เดณเตเด‚ เดตเดฒเตเดชเตเดช เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเตเด‚ เด‰เดณเตเดณ เด’เดฐเต เดนเดพเดทเต เดŸเต‡เดฌเดฟเตพ เดตเต‡เดฃเด‚ sizeof(int), เด…เดคเดฟเตฝ เดŽเดจเดฟเด•เตเด•เต เดชเดฐเดฎเดพเดตเดงเดฟ เดจเดพเดฒเต เด˜เดŸเด•เด™เตเด™เตพ เด‡เดŸเดพเด‚." BPF เดฎเดพเดชเตเดชเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเดฑเตเดฑเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดฒเต† เด…เดคเต‡ เดฐเต€เดคเดฟเดฏเดฟเตฝ, เดžเด™เตเด™เตพ เด’เดฌเตเดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† เดชเต‡เดฐเต เด‡เดคเดพเดฏเดฟ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟ. "woo".

เดจเดฎเตเด•เตเด•เต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚:

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

เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เด‡เดคเดพ bpf(2) เดžเด™เตเด™เตพเด•เตเด•เต เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เดฎเดพเดชเตเดชเต เดจเดฎเตเดชเตผ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เดฟ 3 เดคเตเดŸเตผเดจเตเดจเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚, เดชเตเดฐเดคเต€เด•เตเดทเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต†, เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต pause(2).

เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเดถเตเดšเดพเดคเตเดคเดฒเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตเด•เตเด•เดพเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเตŠเดฐเต เดŸเต†เตผเดฎเดฟเดจเตฝ เดคเตเดฑเดจเตเดจเต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเดฎเตเดŸเต† เด’เดฌเตเดœเด•เตเดฑเตเดฑเต เดจเต‹เด•เตเด•เดพเด‚ bpftool (เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต† เดฎเดพเดชเตเดชเดฟเดจเต† เด…เดคเดฟเดจเตเดฑเต† เดชเต‡เดฐเดฟเตฝ เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฐเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเต‡เตผเดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚):

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

114 เดŽเดจเตเดจ เดธเด‚เด–เตเดฏเดฏเดพเดฃเต เดจเดฎเตเดฎเตเดŸเต† เดตเดธเตเดคเตเดตเดฟเดจเตเดฑเต† เด†เด—เต‹เดณ เดเดกเดฟ. เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เด’เดฐเต เดฎเดพเดชเตเดชเต เดคเตเดฑเด•เตเด•เดพเตป เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต† เดเดคเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเด‚ เดˆ เดเดกเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚ BPF_MAP_GET_FD_BY_ID เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ bpf.

เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต† เดนเดพเดทเต เดŸเต‡เดฌเดฟเตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เดณเดฟเด•เตเด•เดพเด‚. เด…เดคเดฟเดจเตเดฑเต† เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดจเต‹เด•เตเด•เดพเด‚:

$ sudo bpftool map dump id 114
Found 0 elements

เดถเต‚เดจเตเดฏเด‚. เดจเดฎเตเด•เตเด•เต เด…เดคเดฟเตฝ เด’เดฐเต เดฎเต‚เดฒเตเดฏเด‚ เดจเตฝเด•เดพเด‚ hash[1] = 1:

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

เดจเดฎเตเด•เตเด•เต เดตเต€เดฃเตเดŸเตเด‚ เดชเดŸเตเดŸเดฟเด• เดจเต‹เด•เตเด•เดพเด‚:

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

เดนเต‚เดฑเต‡! เด’เดฐเต เด˜เดŸเด•เด‚ เดšเต‡เตผเด•เตเด•เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เด•เดดเดฟเดžเตเดžเต. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดžเด™เตเด™เตพ เดฌเตˆเดฑเตเดฑเต เดคเดฒเดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต†เดจเตเดจ เด•เดพเดฐเตเดฏเด‚ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด• bptftool เดนเดพเดทเต เดŸเต‡เดฌเดฟเดณเดฟเดฒเต† เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดเดคเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณเดคเดพเดฃเต†เดจเตเดจเต เด…เดฑเดฟเดฏเดฟเดฒเตเดฒ. (BTF เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดˆ เด…เดฑเดฟเดตเต เด…เดตเตพเด•เตเด•เต เด•เตˆเดฎเดพเดฑเดพเตป เด•เดดเดฟเดฏเตเด‚, เดŽเดจเตเดจเดพเตฝ เด‡เดชเตเดชเต‹เตพ เด…เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ.)

เดŽเด™เตเด™เดจเต† เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ bpftool เด˜เดŸเด•เด™เตเด™เตพ เดตเดพเดฏเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต‡เตผเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต? เดนเต‚เดกเดฟเดจเต เดคเดพเดดเต† เดจเดฎเตเด•เตเด•เต เดจเต‹เด•เตเด•เดพเด‚:

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

เด†เดฆเตเดฏเด‚ เดžเด™เตเด™เตพ เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดคเดฟเดจเตเดฑเต† เด—เตเดฒเต‹เดฌเตฝ เดเดกเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเดพเดชเตเดชเต เดคเตเดฑเดจเตเดจเต BPF_MAP_GET_FD_BY_ID ะธ bpf(2) เดžเด™เตเด™เตพเด•เตเด•เต เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ 3 เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เดฟ, เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต BPF_MAP_GET_NEXT_KEY เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เดžเด™เตเด™เตพ เดชเดŸเตเดŸเดฟเด•เดฏเดฟเดฒเต† เด†เดฆเตเดฏเดคเตเดคเต† เด•เต€ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ NULL "เดฎเตเดฎเตเดชเดคเตเดคเต†" เด•เต€เดฏเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเดฑเดพเดฏเดฟ. เดคเดพเด•เตเด•เต‹เตฝ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดจเดฎเตเด•เตเด•เต เดšเต†เดฏเตเดฏเดพเด‚ BPF_MAP_LOOKUP_ELEMเด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดฎเต‚เดฒเตเดฏเด‚ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเต value. เด…เดŸเตเดคเตเดค เด˜เดŸเตเดŸเด‚, เดจเดฟเดฒเดตเดฟเดฒเต† เด•เต€เดฏเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเตผ เด•เตˆเดฎเดพเดฑเดฟเด•เตเด•เตŠเดฃเตเดŸเต เด…เดŸเตเดคเตเดค เด˜เดŸเด•เด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เดžเด™เตเด™เตพ เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เดณเตเดŸเต† เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ เด’เดฐเต เด˜เดŸเด•เดตเตเด‚ เด•เดฎเดพเตปเดกเตเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดŸเตเดŸเตเดณเตเดณเต‚ BPF_MAP_GET_NEXT_KEY เดฎเดŸเด™เตเด™เตเดจเตเดจเต ENOENT.

เดถเดฐเดฟ, เดจเดฎเตเด•เตเด•เต เด•เต€ 1 เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเต‚เดฒเตเดฏเด‚ เดฎเดพเดฑเตเดฑเดพเด‚, เดจเดฎเตเดฎเตเดŸเต† เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดฒเต‹เดœเดฟเด•เตเด•เดฟเดจเต เดฐเดœเดฟเดธเตเดŸเตเดฐเต‡เดทเตป เด†เดตเดถเตเดฏเดฎเดพเดฃเต†เดจเตเดจเต เดชเดฑเดฏเดพเด‚ hash[1] = 2:

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

เดชเตเดฐเดคเต€เด•เตเดทเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต†, เด‡เดคเต เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต: เด•เดฎเดพเตปเดกเต BPF_MAP_GET_FD_BY_ID เดเดกเดฟเดฏเตเด‚ เด•เดฎเดพเตปเดกเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เดณเตเดŸเต† เดฎเดพเดชเตเดชเต เดคเตเดฑเด•เตเด•เตเดจเตเดจเต BPF_MAP_UPDATE_ELEM เดฎเต‚เดฒเด•เดคเตเดคเต† เดคเดฟเดฐเตเดคเตเดคเดฟเดฏเต†เดดเตเดคเตเดจเตเดจเต.

เด…เดคเดฟเดจเดพเตฝ, เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดนเดพเดทเต เดŸเต‡เดฌเดฟเตพ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดถเต‡เดทเด‚, เดจเดฎเตเด•เตเด•เต เดฎเดฑเตเดฑเตŠเดจเตเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดคเดฟเดจเตเดฑเต† เด‰เดณเตเดณเดŸเด•เตเด•เด™เตเด™เตพ เดตเดพเดฏเดฟเด•เตเด•เดพเดจเตเด‚ เดŽเดดเตเดคเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เด•เดฎเดพเตปเดกเต เดฒเตˆเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เด‡เดคเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดฎเต†เด™เตเด•เดฟเตฝ, เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต† เดฎเดฑเตเดฑเต‡เดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เด‡เดคเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚. เดฎเตเด•เดณเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดš เด•เดฎเดพเตปเดกเตเด•เตพเด•เตเด•เต เดชเตเดฑเดฎเต‡, เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเตเดณเตเดณ เดฎเดพเดชเตเดชเตเด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดต:

  • BPF_MAP_LOOKUP_ELEM: เด•เต€ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเต‚เดฒเตเดฏเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•
  • BPF_MAP_UPDATE_ELEM: เดฎเต‚เดฒเตเดฏเด‚ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•/เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•
  • BPF_MAP_DELETE_ELEM: เด•เต€ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด•
  • BPF_MAP_GET_NEXT_KEY: เด…เดŸเตเดคเตเดค (เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด†เดฆเตเดฏ) เด•เต€ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•
  • BPF_MAP_GET_NEXT_ID: เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เดฎเดพเดชเตเดชเตเด•เดณเดฟเดฒเต‚เดŸเต†เดฏเตเด‚ เดชเต‹เด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เด…เด™เตเด™เดจเต†เดฏเดพเดฃเต เด‡เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต bpftool map
  • BPF_MAP_GET_FD_BY_ID: เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เด’เดฐเต เดฎเดพเดชเตเดชเต เด…เดคเดฟเดจเตเดฑเต† เด†เด—เต‹เดณ เดเดกเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดคเตเดฑเด•เตเด•เตเด•
  • BPF_MAP_LOOKUP_AND_DELETE_ELEM: เด’เดฐเต เดตเดธเตเดคเตเดตเดฟเดจเตเดฑเต† เดฎเต‚เดฒเตเดฏเด‚ เด†เดฑเตเดฑเต‹เดฎเดฟเด•เต เด†เดฏเดฟ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดชเดดเดฏเดคเต เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด•
  • BPF_MAP_FREEZE: เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด‡เดŸเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดชเตเดชเต เดฎเดพเดฑเตเดฑเดฎเดฟเดฒเตเดฒเดพเดคเตเดคเดคเดพเด•เตเด•เตเด• (เดˆ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดชเดดเดฏเดชเดŸเดฟเดฏเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ)
  • BPF_MAP_LOOKUP_BATCH, BPF_MAP_LOOKUP_AND_DELETE_BATCH, BPF_MAP_UPDATE_BATCH, BPF_MAP_DELETE_BATCH: เดฌเดนเตเดœเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, BPF_MAP_LOOKUP_AND_DELETE_BATCH - เดฎเดพเดชเตเดชเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดฒเตเดฒเดพ เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเตเด‚ เดตเดพเดฏเดฟเด•เตเด•เดพเดจเตเด‚ เดชเตเดจเดƒเดธเดœเตเดœเดฎเดพเด•เตเด•เดพเดจเตเดฎเตเดณเตเดณ เดเด• เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดฎเดพเตผเด—เดฎเดพเดฃเดฟเดคเต

เดˆ เด•เดฎเดพเตปเดกเตเด•เดณเต†เดฒเตเดฒเดพเด‚ เดŽเดฒเตเดฒเดพ เดฎเดพเดชเตเดชเต เดคเดฐเด™เตเด™เตพเด•เตเด•เตเด‚ เดตเต‡เดฃเตเดŸเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดฟเดฒเตเดฒ, เดŽเดจเตเดจเดพเตฝ เดชเตŠเดคเตเดตเต‡, เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเตเดณเตเดณ เดฎเดฑเตเดฑเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดฎเดพเดชเตเดชเตเด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เดนเดพเดทเต เดŸเต‡เดฌเดฟเดณเตเด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฃเต.

เด•เตเดฐเดฎเดคเตเดคเดฟเดจเต เดตเต‡เดฃเตเดŸเดฟ, เดจเดฎเตเด•เตเด•เต เดนเดพเดทเต เดŸเต‡เดฌเดฟเตพ เดชเดฐเต€เด•เตเดทเดฃเด™เตเด™เตพ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด•เดพเด‚. เดจเดพเดฒเต เด•เต€เด•เตพ เดตเดฐเต† เด‰เตพเด•เตเด•เตŠเดณเตเดณเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เด’เดฐเต เดชเดŸเตเดŸเดฟเด•เดฏเดพเดฃเต เดžเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเดคเต†เดจเตเดจเต เด“เตผเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹? เดจเดฎเตเด•เตเด•เต เด•เตเดฑเดšเตเดšเต เด˜เดŸเด•เด™เตเด™เตพ เด•เต‚เดŸเดฟ เดšเต‡เตผเด•เตเด•เดพเด‚:

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

เด‡เดคเตเดตเดฐเต† เดตเดณเดฐเต† เดจเดฒเตเดฒเดคเดพเดฏเดฟเดฐเตเดจเตเดจเต:

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

เด’เดจเตเดจเต เด•เต‚เดŸเดฟ เดšเต‡เตผเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚:

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

เดชเตเดฐเดคเต€เด•เตเดทเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต†, เดžเด™เตเด™เตพ เดตเดฟเดœเดฏเดฟเดšเตเดšเดฟเดฒเตเดฒ. เดชเดฟเดถเด•เต เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเต‹เด•เตเด•เดพเด‚:

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

เดŽเดฒเตเดฒเดพเด‚ เดถเดฐเดฟเดฏเดพเดฃเต: เดชเตเดฐเดคเต€เด•เตเดทเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต†, เดŸเต€เด‚ BPF_MAP_UPDATE_ELEM เด’เดฐเต เดชเตเดคเดฟเดฏ, เด…เดžเตเดšเดพเดฎเดคเตเดคเต†, เด•เต€ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเต, เดชเด•เตเดทเต‡ เด•เตเดฐเดพเดทเตเด•เตพ E2BIG.

เด…เดคเดฟเดจเดพเตฝ, เดžเด™เตเด™เตพเด•เตเด•เต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดพเดจเตเด‚ เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเต เดฎเดพเดชเตเดชเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดพเดจเตเด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดจเตเดจเต† เดจเดฎเตเด•เตเด•เต เดฎเดพเดชเตเดชเตเด•เตพ เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดจเต‹เด•เตเด•เตเดจเตเดจเดคเต เด‡เดชเตเดชเต‹เตพ เดฏเตเด•เตเดคเดฟเดธเดนเดฎเดพเดฃเต. เดฎเต†เดทเต€เตป เดฎเดพเด•เตเดฐเต‹ เด•เต‹เดกเตเด•เดณเดฟเดฒเต† เดตเดพเดฏเดฟเด•เตเด•เดพเตป เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเดŸเต† เดญเดพเดทเดฏเดฟเตฝ เดจเดฎเตเด•เตเด•เต เด‡เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเด‚, เดŽเดจเตเดจเดพเตฝ เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเด™เตเด™เดจเต† เดŽเดดเตเดคเตเด•เดฏเตเด‚ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเตเดตเต†เดจเตเดจเต เด•เดพเดฃเดฟเด•เตเด•เต‡เดฃเตเดŸ เดธเดฎเดฏเด‚ เด…เดคเดฟเด•เตเดฐเดฎเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. libbpf.

(เดคเดพเดดเตเดจเตเดจ เดจเดฟเดฒเดฏเดฟเดฒเตเดณเตเดณ เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เด…เดญเดพเดตเดคเตเดคเดฟเตฝ เด…เดธเด‚เดคเตƒเดชเตเดคเดฐเดพเดฏ เดตเดพเดฏเดจเด•เตเด•เดพเตผเด•เตเด•เต: เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดฎเดพเดชเตเดชเตเด•เดณเตเด‚ เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดตเดฟเดถเดฆเดฎเดพเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดžเด™เตเด™เตพ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเด‚ libbpf เดจเดฟเตผเดฆเตเดฆเต‡เดถ เดคเดฒเดคเตเดคเดฟเตฝ เดŽเดจเตเดคเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเด•. เด…เดธเด‚เดคเตƒเดชเตเดคเดฐเดพเดฏ เดตเดพเดฏเดจเด•เตเด•เดพเตผเด•เตเด•เต เดตเดณเดฐเต†, เดžเด™เตเด™เตพ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเดคเตเดคเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เด‰เดšเดฟเดคเดฎเดพเดฏ เดธเตเดฅเดฒเดคเตเดคเต.)

libbpf เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเดดเตเดคเตเดจเตเดจเต

เดฎเต†เดทเต€เตป เด•เต‹เดกเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเดดเตเดคเตเดจเตเดจเดคเต เด†เดฆเตเดฏเดฎเดพเดฏเดฟ เดฐเดธเด•เดฐเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เดคเตเดŸเตผเดจเตเดจเต เดธเด‚เดคเตƒเดชเตเดคเดฟ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด‚. เดˆ เดจเดฟเดฎเดฟเดทเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเตเดฐเดฆเตเดง เดคเดฟเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต llvm, BPF เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดจเดพเดฏเดฟ เด•เต‹เดกเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดฌเดพเด•เตเด•เต†เตปเดกเตเด‚ เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเตเด‚ เด‰เดฃเตเดŸเต libbpf, เด‡เดคเต BPF เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเตเดŸเต† เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดตเดถเด‚ เดŽเดดเตเดคเดพเดจเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเตƒเดทเตเดŸเดฟเดšเตเดš BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเดŸเต† เด•เต‹เดกเต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต llvm/clang.

เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เด‡เดคเดฟเดฒเตเด‚ เดคเตเดŸเตผเดจเตเดจเตเดณเตเดณ เดฒเต‡เด–เดจเด™เตเด™เดณเดฟเดฒเตเด‚ เดจเดฎเตเดฎเตพ เด•เดพเดฃเตเด‚, libbpf เด‡เดคเต เด•เต‚เดŸเดพเดคเต† เดงเดพเดฐเดพเดณเด‚ เดœเต‹เดฒเดฟเด•เตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต (เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดธเดฎเดพเดจเดฎเดพเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ - iproute2, libbcc, libbpf-go, เดฎเตเดคเดฒเดพเดฏเดต) เดœเต€เดตเดฟเด•เตเด•เดพเตป เด…เดธเดพเดงเตเดฏเดฎเดพเดฃเต. เดชเดฆเตเดงเดคเดฟเดฏเตเดŸเต† เด•เตŠเดฒเดฏเดพเดณเดฟ เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเดฟเตฝ เด’เดจเตเดจเต libbpf BPF CO-RE (เด’เดฐเดฟเด•เตเด•เตฝ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเด•, เดŽเดฒเตเดฒเดพเดฏเดฟเดŸเดคเตเดคเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•) - เดตเตเดฏเดคเตเดฏเดธเตเดค API-เด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต‹เดŸเต† (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเดคเดฟเดชเตเดชเดฟเตฝ เดจเดฟเดจเตเดจเต เด•เต‡เตผเดฃเตฝ เด˜เดŸเดจ เดฎเดพเดฑเตเดฎเตเดชเต‹เตพ, เด’เดฐเต เด•เต‡เตผเดฃเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดฑเตเดฑเตŠเดจเตเดจเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เตผเดŸเตเดŸเดฌเดฟเตพ เดšเต†เดฏเตเดฏเดพเดตเตเดจเตเดจ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเดดเตเดคเดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดชเดคเดฟเดชเตเดชเดฟเดฒเต‡เด•เตเด•เต). CO-RE เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เต‡เตผเดฃเตฝ BTF เดชเดฟเดจเตเดคเตเดฃเดฏเต‹เดŸเต† เดธเดฎเดพเดนเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เดฃเด‚ (เด‡เดคเต เดŽเด™เตเด™เดจเต† เดšเต†เดฏเตเดฏเดฃเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต เดตเดฟเด•เดธเดจ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ. เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เต‡เตผเดฃเตฝ 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, เดจเดฎเตเด•เตเด•เต เดจเดฟเดฐเดตเดงเดฟ (เด•เต‚เดŸเตเดคเดฒเต‹ เด•เตเดฑเดตเต‹ เด…เตผเดคเตเดฅเดถเต‚เดจเตเดฏเดฎเดพเดฏ) เดŸเต†เดธเตเดฑเตเดฑเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเดดเตเดคเตเด•เดฏเตเด‚ เดŽเดฒเตเดฒเดพเด‚ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเดพเด‚. เดฎเดพเดชเตเดชเตเด•เตพ, เด•เต‡เตผเดฃเตฝ เดธเดนเดพเดฏเดฟเด•เตพ, BTF เดฎเตเดคเดฒเดพเดฏเดตเดฏเตเดฎเดพเดฏเดฟ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเด™เตเด™เดจเต† เดธเด‚เดตเดฆเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดตเดฟเดญเดพเด—เด™เตเด™เดณเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดตเดฟเดถเดฆเต€เด•เดฐเดฟเด•เตเด•เดพเตป เด‡เดคเต เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด‚.

เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เตพ libbpf เด’เดฐเต git เดธเดฌเตโ€Œเดฎเต‹เดกเตเดฏเต‚เดณเดพเดฏเดฟ เด’เดฐเต GitHub เดถเต‡เด–เดฐเด‚ เดšเต‡เตผเด•เตเด•เตเด•, เดžเด™เตเด™เตพ เด…เดคเต เดšเต†เดฏเตเดฏเตเด‚:

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

เดชเต‡เดพเด•เตเดจเตเดจเต libbpf เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต:

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

เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดฒเต† เดžเด™เตเด™เดณเตเดŸเต† เด…เดŸเตเดคเตเดค เดชเตเดฒเดพเตป เด‡เดชเตเดฐเด•เดพเดฐเดฎเดพเดฃเต: เดžเด™เตเด™เตพ เด’เดฐเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเดดเตเดคเตเด‚ BPF_PROG_TYPE_XDP, เดฎเตเดฎเตเดชเดคเตเดคเต† เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดฒเต† เดชเต‹เดฒเต† เดคเดจเตเดจเต†, เดŽเดจเตเดจเดพเตฝ เดธเดฟเดฏเดฟเตฝ, เดžเด™เตเด™เตพ เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเต clang, เด•เต‚เดŸเดพเดคเต† เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เดธเดนเดพเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเดดเตเดคเตเด•. เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดตเดฟเดญเดพเด—เด™เตเด™เดณเดฟเตฝ เดžเด™เตเด™เตพ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต†เดฏเตเด‚ เด…เดธเดฟเดธเตเดฑเตเดฑเดจเตเดฑเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต†เดฏเตเด‚ เด•เดดเดฟเดตเตเด•เตพ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚.

เด‰เดฆเดพเดนเดฐเดฃเด‚: libbpf เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต

เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดžเด™เตเด™เตพ เดซเดฏเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต /sys/kernel/btf/vmlinux, เดฎเตเด•เดณเดฟเตฝ เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเดคเต, เด’เดฐเต เดคเดฒเด•เตเด•เต†เดŸเตเดŸเต เดซเดฏเดฒเดฟเดจเตเดฑเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เด…เดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏเดคเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•:

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

เดˆ เดซเดฏเตฝ เดจเดฎเตเดฎเตเดŸเต† เด•เต‡เตผเดฃเดฒเดฟเตฝ เดฒเดญเตเดฏเดฎเดพเดฏ เดŽเดฒเตเดฒเดพ เดกเดพเดฑเตเดฑเดพ เด˜เดŸเดจเด•เดณเตเด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เต‡เตผเดฃเดฒเดฟเตฝ IPv4 เดคเดฒเด•เตเด•เต†เดŸเตเดŸเต เด‡เด™เตเด™เดจเต†เดฏเดพเดฃเต เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต:

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

เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ C-เดฏเดฟเตฝ เดŽเดดเตเดคเดพเด‚:

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

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

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

เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดฎเดพเดฑเดฟเดฏเต†เด™เตเด•เดฟเดฒเตเด‚, เดžเด™เตเด™เตพ เด‡เดชเตเดชเต‹เดดเตเด‚ เดชเดฒ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเตเด‚ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด†เดฆเตเดฏเด‚, เดžเด™เตเด™เตพ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจ เด†เดฆเตเดฏเดคเตเดคเต† เดนเต†เดกเตเดกเตผ เดซเดฏเตฝ vmlinux.h, เดžเด™เตเด™เตพ เด‡เดชเตเดชเต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเตƒเดทเตเดŸเดฟเดšเตเดšเดคเต bpftool btf dump - เด‡เดชเตเดชเต‹เตพ เด•เต‡เตผเดฃเตฝ เด˜เดŸเดจเด•เตพ เดŽเด™เตเด™เดจเต†เดฏเตเดฃเตเดŸเต†เดจเตเดจเต เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เดจเดฎเตเด•เตเด•เต เด•เต‡เตผเดฃเตฝ-เดนเต†เดกเต‡เดดเตเดธเต เดชเดพเด•เตเด•เต‡เดœเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ. เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดนเต†เดกเตเดกเตผ เดซเดฏเตฝ เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพเด•เตเด•เต เดตเดฐเตเดจเตเดจเต libbpf. เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต เดฎเดพเด•เตเดฐเต‹ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดพเตป เดฎเดพเดคเตเดฐเดฎเต‡ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเต‚ SEC, เด‡เดคเต ELF เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดซเดฏเดฒเดฟเดจเตเดฑเต† เด‰เดšเดฟเดคเดฎเดพเดฏ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดคเต€เด•เด‚ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต. เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต xdp/simple, เดธเตเดฒเดพเดทเดฟเดจเต เดฎเตเดฎเตเดชเต เดจเดฎเตเดฎเตพ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดคเดฐเด‚ BPF เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเต - เด‡เดคเดพเดฃเต เด•เตบเดตเต†เตปเดทเดจเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต libbpf, เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดจเตเดฑเต† เดชเต‡เดฐเต เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เด…เดคเต เดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเดชเตเดชเดฟเตฝ เดถเดฐเดฟเดฏเดพเดฏ เดคเดฐเด‚ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด‚ bpf(2). BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดคเดจเตเดจเต†เดฏเดพเดฃเต C - เดตเดณเดฐเต† เดฒเดณเดฟเดคเดตเตเด‚ เด’เดฐเต เดตเดฐเดฟ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเต return XDP_PASS. เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ, เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดตเดฟเดญเดพเด—เด‚ "license" เดฒเตˆเดธเตปเดธเดฟเดจเตเดฑเต† เดชเต‡เดฐเต เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

llvm/clang, เดชเดคเดฟเดชเตเดชเต >= 10.0.0, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดคเดฟเดฒเตเด‚ เดฎเดฟเด•เดšเตเดšเดคเต, เดตเดฒเตเดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเด•เตเด•เต เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเดพเด‚ (เดตเดฟเดญเดพเด—เด‚ เด•เดพเดฃเตเด• เดตเดฟเด•เดธเดจ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ):

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

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

เดฐเดธเด•เดฐเดฎเดพเดฏ เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเดฟเตฝ: เดŸเดพเตผเด—เต†เดฑเตเดฑเต เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เดžเด™เตเด™เตพ เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต -target bpf เดคเดฒเด•เตเด•เต†เดŸเตเดŸเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเดพเดคเดฏเตเด‚ libbpf, เดžเด™เตเด™เตพ เด…เดŸเตเดคเตเดคเดฟเดŸเต† เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดคเดคเต. เด•เต‚เดŸเดพเดคเต†, เด…เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดฎเดฑเด•เตเด•เดฐเตเดคเต -O2, เดˆ เด“เดชเตเดทเตป เด•เต‚เดŸเดพเดคเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดญเดพเดตเดฟเดฏเดฟเตฝ เด†เดถเตเดšเดฐเตเดฏเด™เตเด™เตพ เด‰เดฃเตเดŸเดพเดฏเต‡เด•เตเด•เดพเด‚. เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต† เด•เต‹เดกเต เดจเต‹เด•เตเด•เดพเด‚, เดžเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเดดเตเดคเดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เด•เดดเดฟเดžเตเดžเต‹?

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

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

Disassembly of section xdp/simple:

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

เด…เดคเต†, เด…เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดšเต! เด‡เดชเตเดชเต‹เตพ, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตŠเดชเตเดชเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดฌเตˆเดจเดฑเดฟ เดซเดฏเตฝ เด‰เดฃเตเดŸเต, เด…เดคเต เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเดฟเดจเดพเดฏเดฟ เดฒเตˆเดฌเตเดฐเดฑเดฟ libbpf เดžเด™เตเด™เตพเด•เตเด•เต เดฐเดฃเตเดŸเต เด“เดชเตเดทเดจเตเด•เตพ เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต - เด’เดฐเต เดคเดพเดดเตเดจเตเดจ เดจเดฟเดฒเดฏเดฟเดฒเตเดณเตเดณ API เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด‰เดฏเตผเดจเตเดจ เดคเดฒเดคเตเดคเดฟเดฒเตเดณเตเดณ API เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•. BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เด…เดตเดฐเตเดŸเต† เดคเตเดŸเตผเดจเตเดจเตเดณเตเดณ เดชเด เดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เด•เตเดฑเดžเตเดž เดชเตเดฐเดฏเดคเตเดจเดคเตเดคเต‹เดŸเต† เดŽเด™เตเด™เดจเต† เดŽเดดเตเดคเดพเด‚, เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเดพเด‚, เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚ เดŽเดจเตเดจเต เดชเด เดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เดžเด™เตเด™เตพ เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดตเดดเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเด‚.

เด†เดฆเตเดฏเด‚, เดจเดฎเตเดฎเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† "เด…เดธเตเดฅเดฟเด•เต‚เดŸเด‚" เด…เดคเดฟเดจเตเดฑเต† เดฌเตˆเดจเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดคเต‡ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต bpftool - เดฌเดฟเดชเดฟเดŽเดซเต เดฒเต‹เด•เดคเตเดคเดฟเดจเตเดฑเต† เดธเตเดตเดฟเดธเต เด•เดคเตเดคเดฟ (เด…เด•เตเดทเดฐเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดŽเดŸเตเด•เตเด•เดพเด‚, เด•เดพเดฐเดฃเด‚ เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เดธเตเดฐเดทเตเดŸเดพเด•เตเด•เดณเดฟเดฒเตเด‚ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเดตเดฐเดฟเดฒเตŠเดฐเดพเดณเดพเดฏ เดกเดพเดจเดฟเดฏเตฝ เดฌเต‹เตผเด•เตเด•เตเดฎเดพเตป เดธเตเดตเดฟเดธเตเดธเต เด†เดฃเต):

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

เดซเดฏเดฒเดฟเตฝ xdp-simple.skel.h เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดฌเตˆเดจเดฑเดฟ เด•เต‹เดกเตเด‚ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต - เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตฝ, เด…เดฑเตเดฑเดพเดšเตเดšเตเดšเต†เดฏเตเดฏเตฝ, เดžเด™เตเด™เดณเตเดŸเต† เด’เดฌเตเดœเด•เตเดฑเตเดฑเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตฝ. เดžเด™เตเด™เดณเตเดŸเต† เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เด‡เดคเต เด“เดตเตผเด•เดฟเตฝ เดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดซเดฏเดฒเดฟเตฝ เดจเดฟเดฐเดตเดงเดฟ เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเด‚ เดฎเดพเดชเตเดชเตเด•เดณเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเดฒเตเด‚ เด‡เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เดˆ เดญเต€เดฎเตป ELF เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเดพเตป เดจเดฎเตเด•เตเด•เต เด…เดธเตเดฅเดฟเด•เต‚เดŸเด‚ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดšเต เดžเด™เตเด™เตพ เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดจเตเดจเต‹ เดฐเดฃเตเดŸเต‹ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ เดตเดฟเดณเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดŽเดดเตเดคเตเดจเตเดจเต เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เดฎเตเดจเตเดจเต‹เดŸเตเดŸเต เดชเต‹เด•เดพเด‚.

เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ, เดžเด™เตเด™เดณเตเดŸเต† เดฒเต‹เดกเตผ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเดฟเดธเตเดธเดพเดฐเดฎเดพเดฃเต:

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

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

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

    pause();

    xdp_simple_bpf__destroy(obj);
}

เด‡เดคเต struct xdp_simple_bpf เดซเดฏเดฒเดฟเตฝ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต xdp-simple.skel.h เดžเด™เตเด™เดณเตเดŸเต† เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดซเดฏเดฒเดฟเดจเต† เดตเดฟเดตเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

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

เด’เดฐเต เดคเดพเดดเตเดจเตเดจ เดจเดฟเดฒเดฏเดฟเดฒเตเดณเตเดณ API เดฏเตเดŸเต† เด…เดŸเดฏเดพเดณเด™เตเด™เตพ เดจเดฎเตเด•เตเด•เต เด‡เดตเดฟเดŸเต† เด•เดพเดฃเดพเด‚: เด˜เดŸเดจ struct bpf_program *simple ะธ struct bpf_link *simple. เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต† เด†เดฆเตเดฏ เด˜เดŸเดจ เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต xdp/simple, เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเด™เตเด™เดจเต† เด‡เดตเดจเตเดฑเต เด‰เดฑเดตเดฟเดŸเดตเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเต เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดซเด‚เด—เตเดทเตป xdp_simple_bpf__open_and_load, เด’เดฐเต ELF เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดคเตเดฑเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เดŽเดฒเตเดฒเดพ เด˜เดŸเดจเด•เดณเตเด‚ เด‰เดชเด˜เดŸเดจเด•เดณเตเด‚ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเต (เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เดชเตเดฑเดฎเต‡, ELF-เตฝ เดฎเดฑเตเดฑเต เดตเดฟเดญเดพเด—เด™เตเด™เดณเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต - เดกเดพเดฑเตเดฑ, เดฑเต€เดกเต เดฎเดพเดคเตเดฐเด‚ เดกเดพเดฑเตเดฑ, เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เดตเดฟเดตเดฐเด™เตเด™เตพ, เดฒเตˆเดธเตปเดธเต เดฎเตเดคเดฒเดพเดฏเดต), เดคเตเดŸเตผเดจเตเดจเต เด’เดฐเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดคเต เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดตเดฟเดณเดฟ bpf, เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เดจเดฎเตเด•เตเด•เต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

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

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

เด‡เดชเตเดชเต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดจเดฎเตเดฎเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเต‹เด•เตเด•เดพเด‚ bpftool. เดจเดฎเตเด•เตเด•เต เด…เดตเดณเตเดŸเต† เดเดกเดฟ เด•เดฃเตเดŸเต†เดคเตเดคเดพเด‚:

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

เด•เต‚เดŸเดพเดคเต† เดกเด‚เดชเต (เดžเด™เตเด™เตพ เด•เดฎเดพเตปเดกเดฟเดจเตเดฑเต† เด’เดฐเต เดšเตเดฐเตเด•เตเด•เดฟเดฏ เดฐเต‚เดชเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต bpftool prog dump xlated):

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

เดชเตเดคเดฟเดฏ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚! เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดžเด™เตเด™เดณเตเดŸเต† เดธเดฟ เดธเต‹เดดเตโ€Œเดธเต เดซเดฏเดฒเดฟเดจเตเดฑเต† เดญเดพเด—เด™เตเด™เตพ เด…เดšเตเดšเดŸเดฟเดšเตเดšเต. เด‡เดคเต เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเดพเดฃเต เดšเต†เดฏเตเดคเดคเต libbpf, เดฌเตˆเดจเดฑเดฟเดฏเดฟเดฒเต† เดกเต€เดฌเด—เต เดตเดฟเดญเดพเด—เด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ, เด…เดคเต เด’เดฐเต เดฌเดฟเดŸเดฟเดŽเดซเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดธเดฎเดพเดนเดฐเดฟเดšเตเดšเต, เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดคเต BPF_BTF_LOAD, เดคเตเดŸเตผเดจเตเดจเต เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟ BPG_PROG_LOAD.

เด•เต‡เตผเดฃเตฝ เดธเดนเดพเดฏเดฟเด•เตพ

BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เต "เดฌเดพเดนเตเดฏ" เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ - เด•เต‡เตผเดฃเตฝ เดธเดนเดพเดฏเดฟเด•เตพ. เดˆ เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเต† เด•เต‡เตผเดฃเตฝ เด˜เดŸเดจเด•เตพ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดฎเดพเดชเตเดชเตเด•เตพ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเดจเตเด‚ "เดฏเดฅเดพเตผเดคเตเดฅ เดฒเต‹เด•เดตเตเดฎเดพเดฏเดฟ" เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚ เดจเดŸเดคเตเดคเดพเดจเตเด‚ เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต - เดชเต†เตผเดซเต เด‡เดตเดจเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•, เดนเดพเตผเดกเตโ€Œเดตเต†เดฏเตผ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เตเด• (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดฑเต€เดกเดฏเดฑเด•เตโ€ŒเดŸเต เดšเต†เดฏเตเดฏเตเด•) เดฎเตเดคเดฒเดพเดฏเดต.

เด‰เดฆเดพเดนเดฐเดฃเด‚: bpf_get_smp_processor_id

"เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดฒเต‚เดŸเต† เดชเด เดฟเด•เตเด•เตเด•" เดŽเดจเตเดจ เดฎเดพเดคเตƒเด•เดฏเตเดŸเต† เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดฟเดจเตเดณเตเดณเดฟเตฝ, เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเดฟเตฝ เด’เดจเตเดจเต เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เดพเด‚, bpf_get_smp_processor_id(), เด‰เดฑเดชเตเดชเดพเดฃเต เดซเดฏเดฒเดฟเตฝ kernel/bpf/helpers.c. BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเต‹เดธเดธเดฑเดฟเดจเตเดฑเต† เดจเดฎเตเดชเตผ เด‡เดคเต เดจเตฝเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดพเตฝ เด…เดคเดฟเดจเตเดฑเต† เดจเดฟเตผเดตเตเดตเดนเดฃเด‚ เด’เดฐเต เดตเดฐเดฟ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เด…เดคเดฟเดจเตเดฑเต† เด…เตผเดคเตเดฅเดถเดพเดธเตเดคเตเดฐเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเดฟเดฒเตเดฒ:

BPF_CALL_0(bpf_get_smp_processor_id)
{
    return smp_processor_id();
}

BPF เดนเต†เตฝเดชเตเดชเตผ เดซเด‚เด—เตโ€Œเดทเตป เดจเดฟเตผเดตเดšเดจเด™เตเด™เตพ Linux เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เตพ เดจเดฟเตผเดตเดšเดจเด™เตเด™เตพเด•เตเด•เต เดธเดฎเดพเดจเดฎเดพเดฃเต. เด‡เดตเดฟเดŸเต†, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เดณเดฟเดฒเตเดฒเดพเดคเตเดค เด’เดฐเต เดซเด‚เด—เตเดทเตป เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. (เดฎเต‚เดจเตเดจเต เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เดŽเดŸเตเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดซเด‚เด—เตเดทเตป เดฎเดพเด•เตเดฐเต‹ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต BPF_CALL_3. เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เดณเตเดŸเต† เดชเดฐเดฎเดพเดตเดงเดฟ เดŽเดฃเตเดฃเด‚ เด…เดžเตเดšเต เด†เดฃเต.) เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เด‡เดคเต เดจเดฟเตผเดตเดšเดจเดคเตเดคเดฟเดจเตเดฑเต† เด†เดฆเตเดฏ เดญเดพเด—เด‚ เดฎเดพเดคเตเดฐเดฎเดพเดฃเต. เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดญเดพเด—เด‚ เดคเดฐเด‚ เด˜เดŸเดจ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต struct bpf_func_proto, เดตเต†เดฐเดฟเดซเดฏเตผ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจ เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดตเดฟเดตเดฐเดฃเด‚ เด‡เดคเดฟเตฝ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต:

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

เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดˆ เดซเด‚เด—เตเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด…เดตเตผ เด…เดคเต เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเดฃเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต เดคเดฐเด‚ BPF_PROG_TYPE_XDP เด’เดฐเต เดซเด‚เด—เตเดทเตป เด•เต‡เตผเดฃเดฒเดฟเตฝ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต xdp_func_proto, เด‡เดคเต เดธเดนเดพเดฏ เดซเด‚เด—เตโ€Œเดทเตป เดเดกเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต XDP เดˆ เดซเด‚เด—เตโ€Œเดทเดจเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹ เด‡เดฒเตเดฒเดฏเต‹ เดŽเดจเตเดจเต เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เตเดจเตเดจเต. เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต:

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

เดชเตเดคเดฟเดฏ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดคเดฐเด™เตเด™เตพ เดซเดฏเดฒเดฟเตฝ "เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต" include/linux/bpf_types.h เด’เดฐเต เดฎเดพเด•เตเดฐเต‹ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต BPF_PROG_TYPE. เด‰เดฆเตเดงเดฐเดฃเดฟเด•เดณเดฟเตฝ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด•เดพเดฐเดฃเด‚ เด‡เดคเต เด’เดฐเต เดฒเต‹เดœเดฟเด•เตเด•เตฝ เดจเดฟเตผเดตเดšเดจเดฎเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† เดธเดฟ เดญเดพเดทเดฏเดฟเตฝ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เด•เต‹เตบเด•เตเดฐเต€เดฑเตเดฑเต เด˜เดŸเดจเด•เดณเตเดŸเต† เดจเดฟเตผเดตเดšเดจเด‚ เดฎเดฑเตเดฑเต เดธเตเดฅเดฒเด™เตเด™เดณเดฟเตฝ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเต. เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเต, เดซเดฏเดฒเดฟเตฝ kernel/bpf/verifier.c เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เดจเดฟเตผเดตเดšเดจเด™เตเด™เดณเตเด‚ bpf_types.h เด˜เดŸเดจเด•เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดฐ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต bpf_verifier_ops[]:

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

เด…เดคเดพเดฏเดคเต, เด“เดฐเต‹ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพเด•เตเด•เตเด‚, เดคเดฐเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดกเดพเดฑเตเดฑเดพ เด˜เดŸเดจเดฏเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเตผ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต struct bpf_verifier_ops, เด…เดคเต เดฎเต‚เดฒเตเดฏเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต _name ## _verifier_ops, เด…เดคเดพเดฏเดคเต, xdp_verifier_ops เดตเต‡เดฃเตเดŸเดฟ xdp... เด˜เดŸเดจ xdp_verifier_ops เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเต เดซเดฏเดฒเดฟเตฝ net/core/filter.c เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดชเตเดฐเด•เดพเดฐเด‚:

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

เด‡เดตเดฟเดŸเต† เดจเดฎเตเด•เตเด•เต เดชเดฐเดฟเดšเดฟเดคเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เด•เดพเดฃเดพเด‚ xdp_func_proto, เดตเต†เดฐเดฟเดซเดฏเตผ เด’เดฐเต เดตเต†เดฒเตเดฒเตเดตเดฟเดณเดฟ เดจเต‡เดฐเดฟเดŸเตเดฎเตเดชเต‹เดดเต†เดฒเตเดฒเดพเด‚ เด…เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚ เดšเดฟเดฒเดคเต เด’เดฐเต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดณเตเดณเดฟเดฒเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ, เด•เดพเดฃเตเด• verifier.c.

เด’เดฐเต เดธเดพเด™เตเด•เตฝเดชเตเดชเดฟเด• BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดซเด‚เด—เตเดทเตป เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚ bpf_get_smp_processor_id. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดžเด™เตเด™เดณเตเดŸเต† เดฎเตเดฎเตเดชเดคเตเดคเต† เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดตเต€เดฃเตเดŸเตเด‚ เดŽเดดเตเดคเตเดจเตเดจเต:

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

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

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

ะกะธะผะฒะพะป bpf_get_smp_processor_id เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเต ะฒ <bpf/bpf_helper_defs.h> เดฒเตˆเดฌเตเดฐเดฑเดฟเด•เตพ libbpf เดŽเด™เตเด™เดจเต†

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

เด…เดคเดพเดฃเต, bpf_get_smp_processor_id เด’เดฐเต เดซเด‚เด—เตเดทเตป เดชเต‹เดฏเดฟเดจเตเดฑเดฑเดพเดฃเต, เด…เดคเดฟเดจเตเดฑเต† เดฎเต‚เดฒเตเดฏเด‚ 8 เด†เดฃเต, เด‡เดตเดฟเดŸเต† 8 เดŽเดจเตเดจเดคเต เดฎเต‚เดฒเตเดฏเดฎเดพเดฃเต BPF_FUNC_get_smp_processor_id เดŸเตˆเดชเตเดชเต เดšเต†เดฏเตเดฏเตเด• enum bpf_fun_id, เดซเดฏเดฒเดฟเตฝ เดžเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต vmlinux.h (เดซเดฏเตฝ bpf_helper_defs.h เด•เต‡เตผเดฃเดฒเดฟเตฝ เด’เดฐเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเดšเตเดšเดคเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ "เดฎเดพเดœเดฟเด•เต" เดจเดฎเตเดชเดฑเตเด•เตพ เดถเดฐเดฟเดฏเดพเดฃเต). เดˆ เดซเด‚เด—เตโ€Œเดทเตป เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เดณเตŠเดจเตเดจเตเด‚ เดŽเดŸเตเด•เตเด•เดพเดคเต† เดคเดฐเดคเตเดคเดฟเดจเตเดฑเต† เดฎเต‚เดฒเตเดฏเด‚ เดจเตฝเด•เตเดจเตเดจเต __u32. เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเตฝ เด‡เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, clang เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต BPF_CALL "เดถเดฐเดฟเดฏเดพเดฏ เดคเดฐเด‚" เดจเดฎเตเด•เตเด•เต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดคเต เดธเต†เด•เตเดทเตป เดจเต‹เด•เตเด•เดพเด‚ xdp/simple:

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

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

Disassembly of section xdp/simple:

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

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

เด†เดฆเตเดฏ เดตเดฐเดฟเดฏเดฟเตฝ เดจเดฎเตเด•เตเด•เต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เด•เดพเดฃเดพเด‚ call, เดชเดฐเดพเดฎเต€เดฑเตเดฑเตผ IMM เด‡เดคเต 8 เดจเต เดคเตเดฒเตเดฏเดฎเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† SRC_REG - เดชเต‚เดœเตเดฏเด‚. เดตเต†เดฐเดฟเดซเดฏเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดŽเดฌเดฟเด เด•เดฐเดพเตผ เดชเตเดฐเด•เดพเดฐเด‚, เด‡เดคเต เดนเต†เตฝเดชเตเดชเตผ เดซเด‚เด—เตโ€Œเดทเตป เดจเดฎเตเดชเตผ เดŽเดŸเตเดŸเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด•เต‹เดณเดพเดฃเต. เด…เดคเต เดธเดฎเดพเดฐเด‚เดญเดฟเดšเตเดšเตเด•เดดเดฟเดžเตเดžเดพเตฝ, เดฏเตเด•เตเดคเดฟ เดฒเดณเดฟเดคเดฎเดพเดฃเต. เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเต‚เดฒเตเดฏเด‚ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด• r0 เดฒเต‡เด•เตเด•เต เดชเด•เตผเดคเตเดคเดฟ r1 เด•เต‚เดŸเดพเดคเต† 2,3 เดตเดฐเดฟเด•เดณเดฟเตฝ เด‡เดคเต เดŸเตˆเดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต u32 - เดฎเตเด•เดณเดฟเดฒเต† 32 เดฌเดฟเดฑเตเดฑเตเด•เตพ เดฎเดพเดฏเตเดšเตเดšเต. 4,5,6,7 เดตเดฐเดฟเด•เดณเดฟเตฝ เดžเด™เตเด™เตพ 2 เดฎเดŸเด™เตเด™เตเดจเตเดจเต (XDP_PASS) เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ 1 (XDP_DROP) เดตเดฐเดฟ 0-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดชเต‚เดœเตเดฏเดฎเต‹ เดชเต‚เดœเตเดฏเดฎเต‹ เด…เดฒเตเดฒเดพเดคเตเดค เดฎเต‚เดฒเตเดฏเด‚ เดจเตฝเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเดคเดฟเดจเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต.

เดจเดฎเตเด•เตเด•เต เดธเตเดตเดฏเด‚ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเด‚: เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดคเต เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดจเต‹เด•เตเด•เตเด• bpftool prog dump xlated:

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

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

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

เดถเดฐเดฟ, เดตเต†เดฐเดฟเดซเดฏเตผ เดถเดฐเดฟเดฏเดพเดฏ เด•เต‡เตผเดฃเตฝ เดธเดนเดพเดฏเดฟเดฏเต† เด•เดฃเตเดŸเต†เดคเตเดคเดฟ.

เด‰เดฆเดพเดนเดฐเดฃเด‚: เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เดชเดพเดธเดพเด•เตเด•เตเด•เดฏเตเด‚ เด’เดŸเตเดตเดฟเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด•!

เดŽเดฒเตเดฒเดพ เดฑเตบ-เดฒเต†เดตเตฝ เดนเต†เตฝเดชเตเดชเตผ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพเด•เตเด•เตเด‚ เด’เดฐเต เดชเตเดฐเต‹เดŸเตเดŸเต‹เดŸเตˆเดชเตเดชเต เด‰เดฃเตเดŸเต

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

เดธเดนเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเตเด•เดณเดฟเตฝ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต r1-r5, เดฎเต‚เดฒเตเดฏเด‚ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเตฝ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดจเตเดจเต r0. เด…เดžเตเดšเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เดŽเดŸเตเด•เตเด•เตเดจเตเดจ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ, เด…เดตเดฏเตโ€Œเด•เตเด•เตเดณเตเดณ เดชเดฟเดจเตเดคเตเดฃ เดญเดพเดตเดฟเดฏเดฟเตฝ เดšเต‡เตผเด•เตเด•เตเดฎเต†เดจเตเดจเต เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ.

เดชเตเดคเดฟเดฏ เด•เต‡เตผเดฃเตฝ เดนเต†เตฝเดชเตเดชเดฑเตเด‚ BPF เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เดŽเด™เตเด™เดจเต† เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเดจเตเดจเตเดตเต†เดจเตเดจเตเด‚ เดจเต‹เด•เตเด•เดพเด‚. เดฎเดพเดฑเตเดฑเดฟเดฏเต†เดดเตเดคเดพเด‚ xdp-simple.bpf.c เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฐเต€เดคเดฟเดฏเดฟเตฝ (เดฌเดพเด•เตเด•เดฟ เดตเดฐเดฟเด•เตพ เดฎเดพเดฑเดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ):

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

เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดธเดฟเดชเดฟเดฏเต เดจเดฎเตเดชเตผ เดชเตเดฐเดฟเดจเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดจเดฎเตเด•เตเด•เต เด…เดคเต เดธเดฎเดพเดนเดฐเดฟเดšเตเดšเต เด•เต‹เดกเต เดจเต‹เด•เตเด•เดพเด‚:

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

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

0-7 เดตเดฐเดฟเด•เดณเดฟเตฝ เดžเด™เตเด™เตพ เดธเตเดŸเตเดฐเดฟเด‚เด—เต เดŽเดดเตเดคเตเดจเตเดจเต running on CPU%un, เดคเตเดŸเตผเดจเตเดจเต 8 เดตเดฐเดฟเดฏเดฟเตฝ เดžเด™เตเด™เตพ เดชเดฐเดฟเดšเดฟเดคเดฎเดพเดฏ เด’เดจเตเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต bpf_get_smp_processor_id. 9-12 เดตเดฐเดฟเด•เดณเดฟเตฝ เดžเด™เตเด™เตพ เดธเดนเดพเดฏ เดตเดพเดฆเด™เตเด™เตพ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตเดจเตเดจเต bpf_printk - เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต r1, r2, r3. เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด…เดตเดฏเดฟเตฝ เดฎเต‚เดจเตเดจเต†เดฃเตเดฃเด‚, เดฐเดฃเตเดŸเดฒเตเดฒ? เด•เดพเดฐเดฃเด‚ bpf_printkเด‡เดคเตŠเดฐเต เดฎเดพเด•เตเดฐเต‹ เดฑเดพเดชเตเดชเดฑเดพเดฃเต เดฏเดฅเดพเตผเดคเตเดฅ เดธเดนเดพเดฏเดฟเดฏเต† เดšเตเดฑเตเดฑเดฟเดชเตเดชเดฑเตเดฑเดฟ bpf_trace_printk, เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เดธเตเดŸเตเดฐเดฟเด‚เด—เดฟเดจเตเดฑเต† เดตเดฒเตเดชเตเดชเด‚ เด•เตˆเดฎเดพเดฑเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เดฐเดฃเตเดŸเต เดตเดฐเดฟเด•เตพ เดšเต‡เตผเด•เตเด•เดพเด‚ xdp-simple.cเด…เด™เตเด™เดจเต† เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‡เดจเตเดฑเตผเดซเต‡เดธเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต lo เดถเดฐเดฟเด•เตเด•เตเด‚ เดคเตเดŸเด™เตเด™เดฟ!

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

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

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

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

cleanup:
    xdp_simple_bpf__destroy(obj);
}

เด‡เดตเดฟเดŸเต† เดจเดฎเตเดฎเตพ เดซเด‚เด—เตเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต bpf_set_link_xdp_fd, เด‡เดคเต XDP-เดคเดฐเด‚ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเต† เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เด‡เดจเตเดฑเตผเดซเต‡เดธเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เดžเด™เตเด™เตพ เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดจเดฎเตเดชเตผ เดนเดพเตผเดกเตเด•เต‹เดกเต เดšเต†เดฏเตเดคเต lo, เด‡เดคเต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ 1. เดชเดดเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดฑเตเดฑเดพเดšเตเดšเต เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เด†เดฆเตเดฏเด‚ เดตเต‡เตผเดชเต†เดŸเตเดคเตเดคเดพเตป เดžเด™เตเด™เตพ เดซเด‚เด—เตเดทเตป เดฐเดฃเตเดŸเตเดคเดตเดฃ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดชเตเดชเต‹เตพ เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดตเต†เดฒเตเดฒเตเดตเดฟเดณเดฟ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด• pause เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดจเดจเตเดคเดฎเดพเดฏ เดฒเต‚เดชเตเดชเต: เดžเด™เตเด™เดณเตเดŸเต† เดฒเต‹เดกเตผ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฑเดคเตเดคเตเด•เดŸเด•เตเด•เตเด‚, เดŽเดจเตเดจเดพเตฝ เด‡เดตเดจเตเดฑเต เด‰เดฑเดตเดฟเดŸเดตเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเดถเดฟเดชเตเดชเดฟเด•เตเด•เดชเตเดชเต†เดŸเดฟเดฒเตเดฒ. เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ เดกเต—เตบเดฒเต‹เดกเดฟเดจเตเด‚ เด•เดฃเด•เตเดทเดจเตเด‚ เดถเต‡เดทเด‚, เดŽเดคเตเดคเตเดจเตเดจ เด“เดฐเต‹ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเตเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด‚ lo.

เดจเดฎเตเด•เตเด•เต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดคเต เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดจเต‹เด•เตเด•เดพเด‚ lo:

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

เดžเด™เตเด™เตพ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดค เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เดเดกเดฟ 669 เด‰เดฃเตเดŸเต, เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเตฝ เดžเด™เตเด™เตพ เด…เดคเต‡ เดเดกเดฟ เด•เดพเดฃเตเดจเตเดจเต lo. เดžเด™เตเด™เตพ เดฐเดฃเตเดŸเต เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเด‚ 127.0.0.1 (เด…เดญเตเดฏเตผเดคเตเดฅเดจ + เดฎเดฑเตเดชเดŸเดฟ):

$ ping -c1 localhost

เด‡เดชเตเดชเต‹เตพ เดกเต€เดฌเด—เต เดตเต†เตผเดšเตเดตเตฝ เดซเดฏเดฒเดฟเดจเตเดฑเต† เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดจเต‹เด•เตเด•เดพเด‚ /sys/kernel/debug/tracing/trace_pipe, เด…เดคเดฟเตฝ bpf_printk เด…เดตเดจเตเดฑเต† เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดŽเดดเตเดคเตเดจเตเดจเต:

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

เดฐเดฃเตเดŸเต เดชเตŠเดคเดฟเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ lo เด•เต‚เดŸเดพเดคเต† CPU0-เตฝ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดคเต - เดžเด™เตเด™เดณเตเดŸเต† เด†เดฆเตเดฏเดคเตเดคเต† เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด…เตผเดคเตเดฅเดถเต‚เดจเตเดฏเดฎเดพเดฏ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดšเต!

เด…เดคเต เดŽเดŸเตเดคเตเดคเตเดชเดฑเดฏเต‡เดฃเตเดŸเดคเดพเดฃเต bpf_printk เด‡เดคเต เดกเต€เดฌเด—เต เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เต เดŽเดดเตเดคเตเดจเตเดจเดคเต เดตเต†เดฑเตเดคเต†เดฏเดฒเตเดฒ: เด‡เดคเต เด‰เตฝโ€Œเดชเดพเดฆเดจเดคเตเดคเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ เดธเดนเดพเดฏเดฟเดฏเดฒเตเดฒ, เดชเด•เตเดทเต‡ เดฒเดณเดฟเดคเดฎเดพเดฏ เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด•เดพเดฃเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฏเดฟเดฐเตเดจเตเดจเต เดžเด™เตเด™เดณเตเดŸเต† เดฒเด•เตเดทเตเดฏเด‚.

BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดชเตเดชเตเด•เตพ เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด‰เดฆเดพเดนเดฐเดฃเด‚: BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด’เดฐเต เดฎเดพเดชเตเดชเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต

เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดธเตเดฅเดฒเดคเตเดคเต เดจเดฟเดจเตเดจเต เดฎเดพเดชเตเดชเตเด•เตพ เดŽเด™เตเด™เดจเต† เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเตเด‚ เดฎเตเดฎเตเดชเดคเตเดคเต† เดตเดฟเดญเดพเด—เด™เตเด™เดณเดฟเตฝ เดžเด™เตเด™เตพ เดชเด เดฟเดšเตเดšเต, เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต เด•เต‡เตผเดฃเตฝ เดญเดพเด—เด‚ เดจเต‹เด•เตเด•เดพเด‚. เดจเดฎเตเด•เตเด•เต เดธเดพเดงเดพเดฐเดฃ เดชเต‹เดฒเต†, เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚. เดจเดฎเตเด•เตเด•เต เดจเดฎเตเดฎเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฎเดพเดฑเตเดฑเดฟเดฏเต†เดดเตเดคเดพเด‚ xdp-simple.bpf.c เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดชเตเดฐเด•เดพเดฐเด‚:

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

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

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

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

    *val += 1;

    return XDP_PASS;
}

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

เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เด’เดฐเต เดฎเดพเดชเตเดชเต เดจเดฟเตผเดตเดšเดจเด‚ เดšเต‡เตผเดคเตเดคเต woo: เด‡เดคเต เดชเต‹เดฒเตเดณเตเดณ เดฎเต‚เดฒเตเดฏเด™เตเด™เตพ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต 8-เด˜เดŸเด• เด…เดฑเต‡ เด†เดฃเต u64 (เดธเดฟ-เดฏเดฟเตฝ เดžเด™เตเด™เตพ เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด…เดฑเต‡เดฏเต† เดจเดฟเตผเดตเตเดตเดšเดฟเด•เตเด•เตเด‚ u64 woo[8]). เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเตฝ "xdp/simple" เดจเดฎเตเด•เตเด•เต เดจเดฟเดฒเดตเดฟเดฒเต† เดชเตเดฐเต‹เดธเดธเตผ เดจเดฎเตเดชเตผ เด’เดฐเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดฟเดฒเต‡เด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเด‚ key เดคเตเดŸเตผเดจเตเดจเต เดนเต†เตฝเดชเตเดชเตผ เดซเด‚เด—เตโ€Œเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต bpf_map_lookup_element เด…เดฑเต‡เดฏเดฟเดฒเต† เด…เดจเตเดฌเดจเตเดง เดŽเตปเดŸเตเดฐเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเตผ เดฒเดญเดฟเด•เตเด•เตเด‚, เด…เดคเต เดจเดฎเตเดฎเตพ เด’เดจเตเดจเดพเดฏเดฟ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚. เดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตโ€Œเดคเต: เด‡เตปเด•เดฎเดฟเด‚เด—เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดเดคเต เดธเดฟเดชเดฟเดฏเต เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดคเต เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เตพ เดžเด™เตเด™เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเต. เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚:

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

เด…เดตเดณเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฎเตเดฃเตเดŸเต†เดจเตเดจเต เดจเดฎเตเด•เตเด•เต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚ lo เด•เต‚เดŸเดพเดคเต† เด•เตเดฑเดšเตเดšเต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเด•:

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

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

เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เด…เดฑเต‡เดฏเตเดŸเต† เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดจเต‹เด•เตเด•เดพเด‚:

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

เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเดฒเตเดฒเดพ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเตเด‚ CPU7-เตฝ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดคเต. เด‡เดคเต เดžเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดงเดพเดจเดฎเดฒเตเดฒ, เดชเตเดฐเดงเดพเดจ เด•เดพเดฐเตเดฏเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดชเตเดชเตเด•เตพ เดŽเด™เตเด™เดจเต† เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเดพเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต - เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต ั…ะตะปะฟะตั€ะพะฒ bpf_mp_*.

เดฎเดฟเดธเตเดฑเตเดฑเดฟเด•เตเด•เตฝ เดธเต‚เดšเดฟเด•

เด…เดคเดฟเดจเดพเตฝ, เดชเต‹เดฒเตเดณเตเดณ เด•เต‹เดณเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเด•เตเด•เต BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดชเตเดชเต เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚

val = bpf_map_lookup_elem(&woo, &key);

เดนเต†เตฝเดชเตเดชเตผ เดซเด‚เด—เตโ€Œเดทเตป เด‡เด™เตเด™เดจเต†เดฏเดพเดฃเต เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเดคเต

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

เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เตพ เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเตผ เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเดจเตเดจเต &woo เดชเต‡เดฐเดฟเดฒเตเดฒเดพเดคเตเดค เด’เดฐเต เด˜เดŸเดจเดฏเดฟเดฒเต‡เด•เตเด•เต struct { ... }เดชเด™เตเด•เต โ‚ฌ |

เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด…เดธเด‚เดฌเตเดฒเตผ เดจเต‹เด•เตเด•เดฟเดฏเดพเตฝ, เดฎเต‚เดฒเตเดฏเด‚ เดจเดฎเตเด•เตเด•เต เด•เดพเดฃเดพเด‚ &woo เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ (เดตเดฐเดฟ 4):

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

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

Disassembly of section xdp/simple:

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

เด•เต‚เดŸเดพเดคเต† เดธเตเดฅเดฒเด‚เดฎเดพเดฑเตเดฑเด™เตเด™เดณเดฟเตฝ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต:

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

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

เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดค เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเต‹เด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดถเดฐเดฟเดฏเดพเดฏ เดฎเดพเดชเตเดชเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเตผ เด•เดพเดฃเดพเด‚ (เดฒเตˆเตป 4):

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

เด…เดคเดฟเดจเดพเตฝ, เดžเด™เตเด™เดณเตเดŸเต† เดฒเต‹เดกเตผ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต, เด‡เดคเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดฒเดฟเด™เตเด•เต เดŽเดจเตเดจเต เดจเดฎเตเด•เตเด•เต เดจเดฟเด—เดฎเดจเด‚ เดšเต†เดฏเตเดฏเดพเด‚ &woo เด’เดฐเต เดฒเตˆเดฌเตเดฐเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเดšเตเดšเต libbpf. เด†เดฆเตเดฏเด‚ เดจเดฎเตเด•เตเด•เต เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดจเต‹เด•เตเด•เดพเด‚ strace:

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

เดžเด™เตเด™เตพ เด…เดคเต เด•เดพเดฃเตเดจเตเดจเต libbpf เด’เดฐเต เดฎเดพเดชเตเดชเต เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต woo เดŽเดจเตเดจเดฟเดŸเตเดŸเต เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดคเต simple. เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดŽเด™เตเด™เดจเต†เดฏเต†เดจเตเดจเต เดจเดฎเตเด•เตเด•เต เดธเต‚เด•เตเดทเตเดฎเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

  • เดตเดฟเดณเดฟ xdp_simple_bpf__open_and_load เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต xdp-simple.skel.h
  • เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเต xdp_simple_bpf__load เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต xdp-simple.skel.h
  • เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเต bpf_object__load_skeleton เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต libbpf/src/libbpf.c
  • เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเต bpf_object__load_xattr เดจเดฟเดจเตเดจเต libbpf/src/libbpf.c

เด…เดตเดธเดพเดจ เดซเด‚เด—เตเดทเตป, เดฎเดฑเตเดฑเต เด•เดพเดฐเตเดฏเด™เตเด™เตพเด•เตเด•เตŠเดชเตเดชเด‚, เดตเดฟเดณเดฟเด•เตเด•เตเด‚ bpf_object__create_maps, เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดฎเดพเดชเตเดชเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเต‹ เดคเตเดฑเด•เตเด•เตเด•เดฏเต‹ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดต เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฑเตเด•เดณเดพเด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเต. (เด‡เดตเดฟเดŸเต†เดฏเดพเดฃเต เดจเดฎเตเดฎเตพ เด•เดพเดฃเตเดจเตเดจเดคเต BPF_MAP_CREATE เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเดฟเตฝ strace.) เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ เดซเด‚เด—เตเดทเตป เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต bpf_object__relocate เดžเด™เตเด™เตพ เด•เดฃเตเดŸเดคเต เด“เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เด…เดตเดณเดพเดฃเต เดžเด™เตเด™เตพเด•เตเด•เต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดคเต woo เดธเตเดฅเดฒเด‚เดฎเดพเดฑเตเดฑ เดชเดŸเตเดŸเดฟเด•เดฏเดฟเตฝ. เด…เดคเต เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†, เด’เดŸเตเดตเดฟเตฝ เดจเดฎเตเดฎเตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเตฝ เดธเตเดตเดฏเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเต bpf_program__relocate, เดเดคเต เดญเต‚เดชเดŸเดคเตเดคเดฟเดจเตเดฑเต† เดธเตเดฅเดพเดจเดฎเดพเดฑเตเดฑเด™เตเด™เตพ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

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

เด…เดคเดฟเดจเดพเตฝ เดžเด™เตเด™เตพ เดžเด™เตเด™เดณเตเดŸเต† เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต

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

เด…เดคเดฟเดฒเต† เด‰เดฑเดตเดฟเดŸ เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเดจเต เดชเด•เดฐเด‚ เดตเดฏเตเด•เตเด•เตเด• BPF_PSEUDO_MAP_FD, เด•เต‚เดŸเดพเดคเต† เดžเด™เตเด™เดณเตเดŸเต† เดฎเดพเดชเตเดชเดฟเดจเตเดฑเต† เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เดฆเตเดฏ IMM, เด…เดคเต เดคเตเดฒเตเดฏเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, 0xdeadbeef, เด…เดชเตเดชเต‹เตพ เดซเดฒเดฎเดพเดฏเดฟ เดจเดฎเตเด•เตเด•เต เดจเดฟเตผเดฆเตเดฆเต‡เดถเด‚ เดฒเดญเดฟเด•เตเด•เตเด‚

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

เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดฒเต‹เดกเต เดšเต†เดฏเตเดค BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดชเตเดชเต เดตเดฟเดตเดฐเด™เตเด™เตพ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเดคเต เด‡เด™เตเด™เดจเต†เดฏเดพเดฃเต. เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดฎเดพเดชเตเดชเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ BPF_MAP_CREATE, เด•เต‚เดŸเดพเดคเต† เดเดกเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดคเตเดฑเดจเตเดจเดคเต BPF_MAP_GET_FD_BY_ID.

เด†เด•เต†, เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ libbpf เด…เตฝเด—เต‹เดฐเดฟเดคเด‚ เด‡เดชเตเดฐเด•เดพเดฐเดฎเดพเดฃเต:

  • เดธเดฎเดพเดนเดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต, เดฎเดพเดชเตเดชเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดฒเดฟเด™เตเด•เตเด•เตพเด•เตเด•เดพเดฏเดฟ เดฑเดฟเดฒเตŠเด•เตเด•เต‡เดทเตป เดŸเต‡เดฌเดฟเดณเดฟเตฝ เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต
  • libbpf ELF เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเต เดฌเตเด•เตเด•เต เดคเตเดฑเด•เตเด•เตเดจเตเดจเต, เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เดŽเดฒเตเดฒเดพ เดฎเดพเดชเตเดชเตเด•เดณเตเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ เด…เดตเดฏเตโ€Œเด•เตเด•เดพเดฏเดฟ เดซเดฏเตฝ เดกเดฟเดธเตโ€Œเด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเดฑเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเต
  • เดจเดฟเตผเดฆเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเดฟ เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฑเตเด•เตพ เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต LD64

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŠเดนเดฟเด•เตเด•เดพเดตเตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เด‡เดจเดฟเดฏเตเด‚ เดตเดฐเดพเดจเตเดฃเตเดŸเต, เดžเด™เตเด™เตพ เด•เดพเดฎเตเดชเดฟเดฒเต‡เด•เตเด•เต เดจเต‹เด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดธเต‚เดšเดจเดฏเตเดฃเตเดŸเต - เดžเด™เตเด™เตพ เด…เตผเดคเตเดฅเด‚ เดŽเดดเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต BPF_PSEUDO_MAP_FD เดธเตเดฐเต‹เดคเดธเต เดฐเดœเดฟเดธเตเดฑเตเดฑเดฑเดฟเตฝ เด‡เดŸเตเด•, เดจเดฎเตเด•เตเด•เต เด…เดคเต เด…เดŸเด•เตเด•เด‚ เดšเต†เดฏเตเดฏเดพเด‚, เด…เดคเต เดจเดฎเตเดฎเต† เดŽเดฒเตเดฒเดพ เดตเดฟเดถเตเดฆเตเดงเดฐเตเดŸเต†เดฏเตเด‚ เดตเดฟเดถเตเดฆเตเดงเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดจเดฏเดฟเด•เตเด•เตเด‚ - kernel/bpf/verifier.c, เด‡เดตเดฟเดŸเต† เด’เดฐเต เดตเตเดฏเดคเดฟเดฐเดฟเด•เตเดคเดฎเดพเดฏ เดชเต‡เดฐเตเดณเตเดณ เด’เดฐเต เดซเด‚เด—เตโ€Œเดทเตป เด’เดฐเต เดซเดฏเตฝ เดกเดฟเดธเตโ€Œเด•เตเดฐเดฟเดชเตโ€Œเดฑเตเดฑเดฑเดฟเดจเต† เดŸเตˆเดชเตเดชเดฟเดจเตเดฑเต† เด˜เดŸเดจเดฏเตเดŸเต† เดตเดฟเดฒเดพเดธเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเดจเตเดจเต struct bpf_map:

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

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

(เดชเต‚เตผเดฃเตเดฃ เด•เต‹เดกเต เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เตเด‚ เดฌเดจเตเดงเด‚). เด…เดคเดฟเดจเดพเตฝ เดจเดฎเตเด•เตเด•เต เดžเด™เตเด™เดณเตเดŸเต† เด…เตฝเด—เต‹เดฐเดฟเดคเด‚ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚:

  • เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, เดตเต†เดฐเดฟเดซเดฏเตผ เดฎเดพเดชเตเดชเดฟเดจเตเดฑเต† เดถเดฐเดฟเดฏเดพเดฏ เด‰เดชเดฏเต‹เด—เด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดจเตเดฌเดจเตเดง เด˜เดŸเดจเดฏเตเดŸเต† เดตเดฟเดฒเดพเดธเด‚ เดŽเดดเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต struct bpf_map

เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต ELF เดฌเตˆเดจเดฑเดฟ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ libbpf เด‡เดจเดฟเดฏเตเด‚ เด’เดฐเตเดชเดพเดŸเต เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดจเดŸเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต, เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เตพ เด…เดคเต เดฎเดฑเตเดฑเต เดฒเต‡เด–เดจเด™เตเด™เดณเดฟเตฝ เดšเตผเดšเตเดš เดšเต†เดฏเตเดฏเตเด‚.

libbpf เด‡เดฒเตเดฒเดพเดคเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเด‚ เดฎเดพเดชเตเดชเตเด•เดณเตเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดคเดคเตเดชเต‹เดฒเต†, เดธเดนเดพเดฏเดฎเดฟเดฒเตเดฒเดพเดคเต† เดฎเดพเดชเตเดชเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเด™เตเด™เดจเต† เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเตเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเดฎเต†เดจเตเดจเตเด‚ เด…เดฑเดฟเดฏเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจ เดตเดพเดฏเดจเด•เตเด•เดพเตผเด•เตเด•เตเดณเตเดณ เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‡เดคเดพ libbpf. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเดจเต‹ เด“เดฐเต‹ เดฌเดฟเดฑเตเดฑเตเด‚ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเดจเต‹ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดŽเดดเตเดคเดพเดจเต‹ เด•เดดเดฟเดฏเดพเดคเตเดค เด’เดฐเต เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเดฟเตฝ เดจเดฟเด™เตเด™เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด‡เดคเต เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเด‚. ply, เด…เดคเต เดˆเดšเตเดšเดฏเดฟเตฝ 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[]. เดŽเดจเตเดจเดพเตฝ เดจเดฎเตเดฎเตพ เดธเดฟเดฏเดฟเตฝ เด‰เดณเตเดณ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดจเดฎเตเด•เตเด•เต เด•เตเดฑเดšเตเดšเต เดšเดคเดฟเด•เตเด•เดพเด‚:

$ 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 เด‰เด‚ เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดš เด†เดณเตเด•เตพ เด“เตบเดฒเตˆเตป เดฒเดฟเดจเด•เตโ€Œเดธเต เด•เดฎเตเดฎเตเดฏเต‚เดฃเดฟเดฑเตเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณเดตเดฐเดพเดฃเต, เด…เดคเดฟเดจเตผเดคเตเดฅเด‚ เด…เดตเตผ เด…เดตเตผเด•เตเด•เต เดเดฑเตเดฑเดตเตเด‚ เดชเดฐเดฟเดšเดฟเดคเดฎเดพเดฏ เด’เดจเตเดจเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต (เดชเด•เตเดทเต‡ เด…เดฒเตเดฒ เดธเดพเดงเดพเดฐเดฃ เด†เดณเตเด•เตพ) เด•เต‡เตผเดฃเดฒเตเดฎเดพเดฏเดฟ เดธเด‚เดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด‡เดจเตเดฑเตผเดซเต‡เดธเต: เดจเต†เดฑเตเดฑเตเดฒเดฟเด™เตเด•เต เดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เตพ, เด‡เดคเตเด‚ เด•เดพเดฃเตเด• RFC3549. เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เดฒเดณเดฟเดคเดฎเดพเดฏ เดฎเดพเตผเด—เด‚ xdp_attach เดŽเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เด•เต‹เดกเต เดชเด•เตผเดคเตเดคเตเดจเตเดจเต libbpf, เด…เดคเดพเดฏเดคเต, เดซเดฏเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต netlink.c, เดžเด™เตเด™เตพ เดŽเดจเตเดคเดพเดฃเต เดšเต†เดฏเตเดคเดคเต, เด‡เดคเต เด…เตฝเดชเตเดชเด‚ เดšเตเดฐเตเด•เตเด•เดฟ:

เดจเต†เดฑเตเดฑเตเดฒเดฟเด™เตเด•เต เดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เดณเตเดŸเต† เดฒเต‹เด•เดคเตเดคเต‡เด•เตเด•เต เดธเตเดตเดพเด—เดคเด‚

เด’เดฐเต เดจเต†เดฑเตเดฑเตเดฒเดฟเด™เตเด•เต เดธเต‹เด•เตเด•เดฑเตเดฑเต เดคเดฐเด‚ เดคเตเดฑเด•เตเด•เตเด• NETLINK_ROUTE:

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

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

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

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

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

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

    *nl_pid = sa.nl_pid;
    return sock;
}

เดˆ เดธเต‹เด•เตเด•เดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพ เดตเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต:

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

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

        if (len == 0)
            break;

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

เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ, เด’เดฐเต เดธเต‹เด•เตเด•เดฑเตเดฑเต เดคเตเดฑเดจเตเดจเต เด…เดคเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดซเดฏเตฝ เดกเดฟเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตผ เด…เดŸเด™เตเด™เตเดจเตเดจ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดธเดจเตเดฆเต‡เดถเด‚ เด…เดฏเด•เตเด•เตเดจเตเดจ เดžเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เด‡เดคเดพ:

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

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

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

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

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

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

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

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

cleanup:
    close(sock);
    return ret;
}

เด…เดคเดฟเดจเดพเตฝ, เดŽเดฒเตเดฒเดพเด‚ เดชเดฐเต€เด•เตเดทเดฃเดคเตเดคเดฟเดจเต เดคเดฏเตเดฏเดพเดฑเดพเดฃเต:

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

เดจเดฎเตเดฎเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚ lo:

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

เดจเดฎเตเด•เตเด•เต เดชเดฟเด‚เด—เตเด•เตพ เด…เดฏเดšเตเดšเต เดฎเดพเดชเตเดชเต เดจเต‹เด•เตเด•เดพเด‚:

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

เดนเตเดฑเต‡, เดŽเดฒเตเดฒเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต. เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•, เดžเด™เตเด™เดณเตเดŸเต† เดฎเดพเดชเตเดชเต เดตเต€เดฃเตเดŸเตเด‚ เดฌเตˆเดฑเตเดฑเตเด•เดณเตเดŸเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เดชเต‹เดฒเต†เดฏเดฒเตเดฒ, เดตเดธเตเดคเตเดค เด•เดพเดฐเดฃเด‚ libbpf เดžเด™เตเด™เตพ เดคเดฐเด‚ เดตเดฟเดตเดฐเด™เตเด™เตพ เดฒเต‹เดกเต เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ (BTF). เดŽเดจเตเดจเดพเตฝ เด…เดŸเตเดคเตเดค เดคเดตเดฃ เด‡เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเด‚.

เดตเดฟเด•เดธเดจ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ

เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ, เดžเด™เตเด™เตพ เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž BPF เดกเต†เดตเดฒเดชเตเดชเตผ เดŸเต‚เตพเด•เดฟเดฑเตเดฑเต เดจเต‹เด•เตเด•เดพเด‚.

เดชเตŠเดคเตเดตเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ, BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตŠเดจเตเดจเตเด‚ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ - BPF เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฎเดพเดจเตเดฏเดฎเดพเดฏ เดตเดฟเดคเดฐเดฃ เด•เต‡เตผเดฃเดฒเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต clang, เดชเดพเด•เตเด•เต‡เดœเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดคเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดฌเดฟเดชเดฟเดŽเดซเต เดตเดฟเด•เดธเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด•เต‡เตผเดฃเดฒเตเด‚ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเด‚ เดจเดฟเดฐเดจเตเดคเดฐเด‚ เดฎเดพเดฑเดฟเด•เตเด•เตŠเดฃเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, 2019 เดฎเตเดคเตฝ เดชเดดเดฏ เดฐเต€เดคเดฟเดฏเดฟเดฒเตเดณเตเดณ เดฐเต€เดคเดฟเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเดดเตเดคเดพเตป เดจเดฟเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดฟเดตเดฐเตเด‚.

  • llvm/clang
  • pahole
  • เด…เดคเดฟเดจเตเดฑเต† เด•เดพเดคเตฝ
  • bpftool

(เดฑเดซเดฑเตปเดธเดฟเดจเดพเดฏเดฟ, เดˆ เดตเดฟเดญเดพเด—เดตเตเด‚ เดฒเต‡เด–เดจเดคเตเดคเดฟเดฒเต† เดŽเดฒเตเดฒเดพ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚ เดกเต†เดฌเดฟเดฏเตป 10-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดšเตเดšเดคเดพเดฃเต.)

llvm/clang

เดฌเดฟโ€Œเดชเดฟโ€ŒเดŽเดซเต เดŽเตฝโ€ŒเดŽเตฝโ€Œเดตเดฟโ€ŒเดŽเดฎเตเดฎเตเดฎเดพเดฏเดฟ เดธเต—เดนเตƒเดฆเดชเดฐเดฎเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† เด…เดŸเตเดคเตเดคเดฟเดŸเต† เดฌเดฟโ€Œเดชเดฟโ€ŒเดŽเดซเดฟเดจเดพเดฏเตเดณเตเดณ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพโ€Œ เดœเดฟโ€Œเดธเดฟโ€Œเดธเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดธเดฎเดพเดนเดฐเดฟเด•เตเด•เดพเตปโ€Œ เด•เดดเดฟเดฏเตเดฎเต†เด™เตเด•เดฟเดฒเตเด‚, เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เดตเดฟเด•เดธเดจเดตเตเด‚ เดŽเตฝโ€ŒเดŽเตฝโ€Œเดตเดฟโ€ŒเดŽเดฎเตเดฎเดฟเดจเดพเดฏเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ, เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดžเด™เตเด™เตพ เดจเดฟเดฒเดตเดฟเดฒเต† เดชเดคเดฟเดชเตเดชเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด‚ clang git เตฝ เดจเดฟเดจเตเดจเต:

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

เดŽเดฒเตเดฒเดพเด‚ เดถเดฐเดฟเดฏเดพเดฏเดฟ เดตเดจเตเดจเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเต เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

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

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

(เด…เดธเด‚เดฌเตเดฒเดฟ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ clang เดžเดพเตป เดŽเดŸเตเดคเตเดคเดคเต bpf_devel_QA.)

เดžเด™เตเด™เตพ เด‡เดชเตเดชเต‹เตพ เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดš เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดฟเดฒเตเดฒ, เดชเด•เดฐเด‚ เด…เดต เดšเต‡เตผเด•เตเด•เตเด• PATHเด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต:

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

(เด‡เดคเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต .bashrc เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เต. เดตเตเดฏเด•เตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ, เดžเดพเตป เด‡เดคเตเดชเต‹เดฒเตเดณเตเดณ เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เตเดจเตเดจเต ~/bin/activate-llvm.sh เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดชเตเดชเต‹เตพ เดžเดพเตป เด…เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต . activate-llvm.sh.)

เดชเดนเต‹เดณเตเด‚ เดฌเดฟ.เดŸเดฟ.เดŽเดซเตเด‚

เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ pahole BTF เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เดตเดฟเดตเดฐเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด•เต‡เตผเดฃเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. BTF เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏเดฏเตเดŸเต† เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฑเดฏเดฟเดฒเตเดฒ, เด…เดคเต เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฃเต, เดžเด™เตเด™เตพ เด…เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดฟเดจเดชเตเดชเตเดฑเด‚. เด…เดคเดฟเดจเดพเตฝ เดจเดฟเด™เตเด™เตพ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เต‡เตผเดฃเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เดชเต‹เด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด†เดฆเตเดฏเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด• pahole (เด‡เดฒเตเดฒเดพเดคเต† pahole เด“เดชเตเดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‡เตผเดฃเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ CONFIG_DEBUG_INFO_BTF:

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

เดฌเดฟเดชเดฟเดŽเดซเต เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เต‡เตผเดฃเดฒเตเด•เตพ

เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เดธเดพเดงเตเดฏเดคเด•เตพ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, เดŽเดจเตเดฑเต† เดธเตเดตเดจเตเดคเด‚ เด•เต‹เตผ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เดชเตŠเดคเตเดตเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ, เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเดฟเดคเดฐเดฃ เด•เต‡เตผเดฃเดฒเดฟเตฝ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚, เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เด•เต†เตผเดฃเตฝ เด‰เดณเตเดณเดคเต เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ BPF เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เดฎเดพเดธเด™เตเด™เตพเด•เตเด•เตเดณเตเดณเดฟเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดตเดฟเดคเดฐเดฃเดคเตเดคเดฟเตฝ เดฆเตƒเดถเตเดฏเดฎเดพเด•เตเด‚. , เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดšเดฟเดฒ เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เดŸเต‚เดณเตเด•เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเดฒเต†เดจเตเดจเดชเต‹เดฒเต†, เดญเดพเดตเดฟเดฏเดฟเตฝ เดชเดพเด•เตเด•เต‡เดœเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเดฟเดฒเตเดฒ. เด•เต‚เดŸเดพเดคเต†, เด…เดคเดฟเดจเตเดฑเต† เดธเตเดตเดจเตเดคเด‚ เด•เดพเดฎเตเดชเต เด•เต‹เดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต†เดจเตเดจเต เดคเต‹เดจเตเดจเตเดจเตเดจเต.

เด’เดฐเต เด•เต‡เตผเดฃเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด†เดฆเตเดฏเด‚, เด•เต‡เตผเดฃเตฝ เดคเดจเตเดจเต†, เดฐเดฃเตเดŸเดพเดฎเดคเดพเดฏเดฟ, เด’เดฐเต เด•เต‡เตผเดฃเตฝ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. BPF เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดจเดฎเตเด•เตเด•เต เดธเดพเดงเดพเดฐเดฃ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚ เดตเดพเดจเดฟเดฒ เด•เต‡เตผเดฃเตฝ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดตเดฟเด•เดธเดจ เด•เต‡เตผเดฃเดฒเตเด•เดณเดฟเตฝ เด’เดจเตเดจเต. เดšเดฐเดฟเดคเตเดฐเดชเดฐเดฎเดพเดฏเดฟ, BPF เดตเดฟเด•เดธเดจเด‚ เดจเดŸเด•เตเด•เตเดจเตเดจเดคเต เดฒเดฟเดจเด•เตเดธเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเด‚เด—เต เด•เดฎเตเดฎเตเดฏเต‚เดฃเดฟเดฑเตเดฑเดฟเดฏเดฟเดฒเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เดŽเดฒเตเดฒเดพ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเตเด‚ เดคเดพเดฎเดธเดฟเดฏเดพเดคเต† เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเดฟเดจเตเดจเต€เดŸเต เดฒเดฟเดจเด•เตเดธเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเด‚เด—เต เดฎเต†เดฏเดฟเดจเตเดฑเดจเดฑเดพเดฏ เดกเต‡เดตเดฟเดกเต เดฎเดฟเดฒเตเดฒเดฑเดฟเดฒเต‚เดŸเต† เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเดจเตเดจเต. เด…เดตเดฏเตเดŸเต† เดธเตเดตเดญเดพเดตเดคเตเดคเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต - เดŽเดกเดฟเดฑเตเดฑเตเด•เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเตเดคเดฟเดฏ เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ - เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดฐเดฃเตเดŸเต เด•เต‹เดฑเตเด•เดณเดฟเตฝ เด’เดจเตเดจเดพเดฏเดฟ เดตเดฐเตเดจเตเดจเต - net เด…เดฅเดตเดพ net-next. BPF-เดจเตเดณเตเดณ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดคเดฎเตเดฎเดฟเตฝ เด…เดคเต‡ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเต bpf ะธ bpf-next, เด…เดต เดฏเดฅเดพเด•เตเดฐเดฎเด‚ เดจเต†เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เตเด‚ เดจเต†เดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เตเด‚ เดฏเดฅเดพเด•เตเดฐเดฎเด‚ เดชเต‚เตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพเด•เตเด•เต, เด•เดพเดฃเตเด• bpf_devel_QA ะธ netdev-FAQ. เด…เดคเดฟเดจเดพเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดญเดฟเดฐเตเดšเดฟเดฏเตเด‚ เดจเดฟเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจ เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เดธเตเดฅเดฟเดฐเดค เด†เดตเดถเตเดฏเด•เดคเด•เดณเตเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เด’เดฐเต เด•เต‡เตผเดฃเตฝ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด• (*-next เดฒเดฟเดธเตเดฑเตเดฑเตเดšเต†เดฏเตเดคเดตเดฏเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เด…เดธเตเดฅเดฟเดฐเดฎเดพเดฏเดคเต เด•เต‡เตผเดฃเดฒเตเด•เดณเดพเดฃเต).

เด•เต‡เตผเดฃเตฝ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเตเด•เตพ เดŽเด™เตเด™เดจเต† เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดชเดฐเดฟเดงเดฟเด•เตเด•เดชเตเดชเตเดฑเดฎเดพเดฃเต - เด’เดจเตเดจเตเด•เดฟเตฝ เด‡เดคเต เดŽเด™เตเด™เดจเต† เดšเต†เดฏเตเดฏเดฃเดฎเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเดฟเดจเด•เด‚ เด…เดฑเดฟเดฏเดพเดฎเต†เดจเตเดจเต เด…เดจเตเดฎเดพเดจเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเด เดฟเด•เตเด•เดพเตป เดคเดฏเตเดฏเดพเดฑเดพเดฃเต เดธเตเดตเดจเตเดคเด‚ เดจเดฟเดฒเดฏเดฟเตฝ. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเดฏ BPF-เดชเตเดฐเดพเดชเตโ€Œเดคเดฎเดพเดฏ เดธเดฟเดธเตเดฑเตเดฑเด‚ เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เด•เต‚เดŸเตเดคเดฒเต‹ เด•เตเดฑเดตเต‹ เดฎเดคเดฟเดฏเดพเด•เตเด‚.

เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เด•เต‡เตผเดฃเดฒเตเด•เดณเดฟเตฝ เด’เดจเตเดจเต เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•:

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

เด’เดฐเต เดฎเดฟเดจเดฟเดฎเด‚ เดตเตผเด•เตเด•เดฟเด‚เด—เต เด•เต‡เตผเดฃเตฝ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด•:

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

เดซเดฏเดฒเดฟเตฝ BPF เด“เดชเตเดทเดจเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเด• .config เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เด‡เดทเตเดŸเดชเตเดฐเด•เดพเดฐเด‚ (เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ CONFIG_BPF systemd เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เด‡เดคเดฟเดจเด•เด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚). เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เด•เต‡เตผเดฃเดฒเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด“เดชเตเดทเดจเตเด•เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เด‡เดคเดพ:

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

เด…เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เต เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เดณเตเด‚ เด•เต‡เตผเดฃเดฒเตเด‚ เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเดจเตเด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚ (เดตเดดเดฟ, เดชเตเดคเตเดคเดพเดฏเดฟ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเดคเตเดคเดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‡เตผเดฃเตฝ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเด‚ clangเดšเต‡เตผเดคเตเดคเตเด•เตŠเดฃเตเดŸเต CC=clang):

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

เดชเตเดคเดฟเดฏ เด•เต‡เตผเดฃเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฑเต€เดฌเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเด• (เดžเดพเตป เด‡เดคเดฟเดจเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต kexec เดชเดพเด•เตเด•เต‡เดœเดฟเตฝ เดจเดฟเดจเตเดจเต kexec-tools):

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

bpftool

เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดเดฑเตเดฑเดตเตเด‚ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚ bpftool, Linux เด•เต‡เตผเดฃเดฒเดฟเดจเตเดฑเต† เดญเดพเด—เดฎเดพเดฏเดฟ เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดคเต. เด‡เดคเต เดฌเดฟเดชเดฟเดŽเดซเต เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เดพเดฏเดฟ เดฌเดฟเดชเดฟเดŽเดซเต เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดŽเดดเตเดคเตเด•เดฏเตเด‚ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดŽเดฒเตเดฒเดพเดคเตเดคเดฐเด‚ เดฌเดฟเดชเดฟเดŽเดซเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เดณเตเด‚ - เดฒเต‹เดกเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ, เดฎเดพเดชเตเดชเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•, เดŽเดกเดฟเดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเด•, เดฌเดฟเดชเดฟเดŽเดซเต เด‡เด•เตเด•เต‹เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เดœเต€เดตเดฟเดคเด‚ เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเด• เดคเตเดŸเด™เตเด™เดฟเดฏเดต เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเตป เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เดฎเดพเตป เดชเต‡เดœเตเด•เตพเด•เตเด•เตเดณเตเดณ เดธเต‹เดดเตเดธเต เด•เต‹เดกเตเด•เดณเตเดŸเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เตเด‚ เด•เดพเดฎเตเดชเดฟเตฝ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด‡เดคเดฟเดจเด•เด‚ เดธเดฎเดพเดนเดฐเดฟเดšเตเดšเดคเต, เดจเต†เดฑเตเดฑเดฟเตฝ.

เด‡เดคเต เดŽเดดเตเดคเตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต bpftool RHEL, Fedora, Ubuntu เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เดพเดฏเดฟ เดฎเดพเดคเตเดฐเด‚ เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดตเดฐเตเดจเตเดจเต (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เดพเดฃเตเด•, เดˆ เดคเตเดฐเต†เดกเต, เด‡เดคเต เดชเดพเด•เตเด•เต‡เดœเดฟเด‚เด—เดฟเดจเตเดฑเต† เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เดพเดคเตเดค เด•เดฅ เดชเดฑเดฏเตเดจเตเดจเต bpftool เดกเต†เดฌเดฟเดฏเดจเดฟเตฝ). เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เต‡เตผเดฃเตฝ เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด• bpftool เดชเตˆ เดชเต‹เดฒเต† เดŽเดณเตเดชเตเดชเดฎเดพเดฃเต:

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

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

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

$

(เด‡เดตเดฟเดŸเต† ${linux} - เด‡เดคเดพเดฃเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เต‡เตผเดฃเตฝ เดกเดฏเดฑเด•เตเดŸเดฑเดฟ.) เดˆ เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟเดฏ เดถเต‡เดทเด‚ bpftool เด’เดฐเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเตฝ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด‚ ${linux}/tools/bpf/bpftool เด…เดคเต เดชเดพเดคเดฏเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚ (เด†เดฆเตเดฏเด‚ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต root) เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเด•เตผเดคเตเดคเตเด• /usr/local/sbin.

เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด• bpftool เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต clang, เดฎเตเด•เดณเดฟเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต† เด…เดธเด‚เดฌเดฟเตพ เดšเต†เดฏเตเดคเต, เด…เดคเต เดถเดฐเดฟเดฏเดพเดฏเดฟ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹เดฏเต†เดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด• - เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต

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

เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เต†เตผเดฃเดฒเดฟเตฝ เดเดคเต เดฌเดฟเดชเดฟเดŽเดซเต เดซเต€เดšเตเดšเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เดจเตเดจเต เด‡เดคเต เด•เดพเดฃเดฟเด•เตเด•เตเด‚.

เดตเดดเดฟเดฏเดฟเตฝ, เดฎเตเดฎเตเดชเดคเตเดคเต† เด•เดฎเดพเตปเดกเต เด‡เดคเตเดชเต‹เดฒเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚

# bpftool f p k

เดชเดพเด•เตเด•เต‡เดœเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเดฎเดพเดฏเตเดณเตเดณ เดธเดพเดฎเตเดฏเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต iproute2, เดจเดฎเตเด•เตเด•เต เดŽเดตเดฟเดŸเต†, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเดฑเดฏเดพเด‚ ip a s eth0 เดชเด•เดฐเด‚ ip addr show dev eth0.

เดคเต€เดฐเตเดฎเดพเดจเด‚

เด•เดพเดฎเตเดชเดฟเดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดค เดซเดฒเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เด…เดณเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด“เตบ-เดฆเดฟ-เดซเตเดฒเตˆ เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเตเด‚ เด’เดฐเต เดšเต†เดณเตเดณเดฟเดจเต† เดทเต‚ เดšเต†เดฏเตเดฏเดพเตป BPF เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. UNIX-เดจเตเดฑเต† เดเดฑเตเดฑเดตเตเด‚ เดฎเดฟเด•เดšเตเดš เดชเดพเดฐเดฎเตเดชเดฐเตเดฏเด™เตเด™เดณเดฟเตฝ, เดธเดฟเดธเตเดฑเตเดฑเด‚ เดตเดณเดฐเต† เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต: เด•เต‡เตผเดฃเตฝ (เดตเต€เดฃเตเดŸเตเด‚) เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดšเต†เดฏเตเดฏเดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เดงเดพเดฐเดพเดณเด‚ เด†เดณเตเด•เดณเต†เดฏเตเด‚ เด“เตผเด—เดจเตˆเดธเต‡เดทเดจเตเด•เดณเต†เดฏเตเด‚ เดชเดฐเต€เด•เตเดทเดฃเด™เตเด™เตพ เดจเดŸเดคเตเดคเดพเตป เด…เดจเตเดตเดฆเดฟเดšเตเดšเต. เด•เต‚เดŸเดพเดคเต†, เดชเดฐเต€เด•เตเดทเดฃเด™เตเด™เดณเตเด‚ เด…เดคเตเดชเต‹เดฒเต† เดคเดจเตเดจเต† เดฌเดฟเดชเดฟเดŽเดซเต เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเดฑเดฟเดจเตเดฑเต† เดตเดฟเด•เดธเดจเดตเตเด‚ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚, เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเต เด‡เดคเดฟเดจเด•เด‚ เดธเตเดฅเดฟเดฐเดคเดฏเตเดณเตเดณ เด’เดฐเต เดŽเดฌเดฟเด เด‰เดฃเตเดŸเต, เด…เดคเต เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดตเตเด‚ เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเดฟ เดซเดฒเดชเตเดฐเดฆเดตเตเดฎเดพเดฏ เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดฒเต‹เดœเดฟเด•เตเด•เต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เดŽเดจเตเดฑเต† เด…เดญเดฟเดชเตเดฐเดพเดฏเดคเตเดคเดฟเตฝ, เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏ เดตเดณเดฐเต† เดœเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏเดฟเดคเตเดคเต€เตผเดจเตเดจเตเดตเต†เดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ เด’เดฐเต เดตเดถเดคเตเดคเต เด…เดคเดฟเดจเต เด•เดดเดฟเดฏเตเด‚ เด•เดณเดฟเด•เตเด•เตเด• (เด’เดฐเต เดฏเดจเตเดคเตเดฐเดคเตเดคเดฟเดจเตเดฑเต† เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏ เด’เดฐเต เดธเดพเดฏเดพเดนเตเดจเดคเตเดคเดฟเตฝ เด•เต‚เดŸเตเดคเดฒเต‹ เด•เตเดฑเดตเต‹ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเด‚), เดฎเดฑเตเดตเดถเดคเตเดคเต, เด…เดคเดฟเดจเตเดฑเต† เดฐเต‚เดชเดคเตเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดพเดคเตเดค (เดฎเดจเต‹เดนเดฐเดฎเดพเดฏเดฟ) เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเตป. เดˆ เดฐเดฃเตเดŸเต เด˜เดŸเด•เด™เตเด™เดณเตเด‚ เด’เดฐเตเดฎเดฟเดšเตเดšเต เด†เดณเตเด•เดณเต† เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเดจเตเด‚ เดธเตเดตเดชเตเดจเด‚ เด•เดพเดฃเดพเดจเตเด‚ เดชเตเดฐเต‡เดฐเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เด•เต‚เดŸเตเดคเตฝ เดจเต‚เดคเดจเดฎเดพเดฏ เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เดณเตเดŸเต† เด†เดตเดฟเตผเดญเดพเดตเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดจเดฏเดฟเด•เตเด•เตเดจเตเดจเต.

เดˆ เดฒเต‡เด–เดจเด‚, เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเต เดšเต†เดฑเตเดคเดฒเตเดฒเต†เด™เตเด•เดฟเดฒเตเด‚, เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เดฒเต‹เด•เดคเตเดคเต‡เด•เตเด•เตเดณเตเดณ เด’เดฐเต เด†เดฎเตเด–เด‚ เดฎเดพเดคเตเดฐเดฎเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† "เดตเดฟเดชเตเดฒเดฎเดพเดฏ" เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเตเด‚ เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏเดฏเตเดŸเต† เดชเตเดฐเดงเดพเดจ เดญเดพเด—เด™เตเด™เดณเตเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เดฎเตเดจเตเดจเต‹เดŸเตเดŸเต เดชเต‹เด•เตเดจเตเดจ เดชเตเดฒเดพเตป เด‡เดคเตเดชเต‹เดฒเต†เดฏเดพเดฃเต: เด…เดŸเตเดคเตเดค เดฒเต‡เด–เดจเด‚ BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเดŸเต† เด’เดฐเต เด…เดตเดฒเต‹เด•เดจเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚ (5.8 เด•เต‡เตผเดฃเดฒเดฟเตฝ 30 เดคเดฐเด‚ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต), เดคเตเดŸเตผเดจเตเดจเต เด•เต‡เตผเดฃเตฝ เดŸเตเดฐเต†เดฏเตโ€Œเดธเดฟเด‚เด—เต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฏเดฅเดพเตผเดคเตเดฅ BPF เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดŽเด™เตเด™เดจเต† เดŽเดดเตเดคเดพเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดจเต‹เด•เตเด•เดพเด‚. เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ, เดฌเดฟเดชเดฟเดŽเดซเต เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เด†เดดเดคเตเดคเดฟเดฒเตเดณเตเดณ เด•เต‹เดดเตโ€Œเดธเดฟเดจเตเดณเตเดณ เดธเดฎเดฏเดฎเดพเดฃเดฟเดคเต, เดคเตเดŸเตผเดจเตเดจเต เดฌเดฟเดชเดฟเดŽเดซเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเด‚เด—เดฟเดจเตเดฑเต†เดฏเตเด‚ เดธเตเดฐเด•เตเดทเดพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเตเดŸเต†เดฏเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ.

เดˆ เดชเดฐเดฎเตเดชเดฐเดฏเดฟเดฒเต† เดฎเตเตป เดฒเต‡เด–เดจเด™เตเด™เตพ

  1. เดšเต†เดฑเดฟเดฏ เด•เตเดŸเตเดŸเดฟเด•เตพเด•เตเด•เตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเต, เดญเดพเด—เด‚ เดชเต‚เดœเตเดฏเด‚: เด•เตเดฒเดพเดธเดฟเด•เต เดฌเดฟเดชเดฟเดŽเดซเต

เดฒเดฟเด™เตเด•เตเด•เตพ

  1. BPF, XDP เดฑเดซเดฑเตปเดธเต เด—เตˆเดกเต - เดธเดฟเดฒเดฟเดฏเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เดธเตเดฐเดทเตโ€ŒเดŸเดพเด•เตเด•เดณเดฟเดฒเตเด‚ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเดตเดฐเดฟเดฒเตŠเดฐเดพเดณเดพเดฏ เดกเดพเดจเดฟเดฏเตฝ เดฌเต‹เตผเด•เตเด•เตโ€Œเดฎเดพเดจเดฟเตฝ เดจเดฟเดจเตเดจเต. เดกเดพเดจเดฟเดฏเต‡เดฒเดฟเดจเต เดคเดพเตป เดŽเดจเตเดคเดพเดฃเต เดŽเดดเตเดคเตเดจเตเดจเดคเต†เดจเตเดจเต เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เด…เดฑเดฟเดฏเดพเดฎเต†เดจเตเดจเตเด‚ เด…เดคเดฟเตฝ เดคเต†เดฑเตเดฑเตเด•เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเดฒเตเด‚ เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฐเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏ เด†เดฆเตเดฏเดคเตเดคเต† เด—เตเดฐเตเดคเดฐเดฎเดพเดฏ เดตเดฟเดตเดฐเดฃเด™เตเด™เดณเดฟเตฝ เด’เดจเตเดจเดพเดฃเดฟเดคเต. เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚, เด…เดฑเดฟเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต XDP, TC เดคเดฐเด™เตเด™เดณเตเดŸเต† BPF เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เดณเตเดฎเดพเดฏเดฟ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดˆ เดชเตเดฐเดฎเดพเดฃเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต. ip เดชเดพเด•เตเด•เต‡เดœเดฟเตฝ เดจเดฟเดจเตเดจเต iproute2.

  2. เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป/เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเด‚เด—เต/filter.txt โ€” เด•เตเดฒเดพเดธเดฟเด•เตเด•เดฟเดจเตเดณเตเดณ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเดจเต‹เดŸเตเด•เต‚เดŸเดฟเดฏ เดฏเดฅเดพเตผเดคเตเดฅ เดซเดฏเตฝ, เดคเตเดŸเตผเดจเตเดจเต เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเดšเตเดš BPF. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดธเด‚เดฌเตเดฒเดฟ เดญเดพเดทเดฏเตเด‚ เดธเดพเด™เตเด•เต‡เดคเดฟเด• เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏเดพ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดฃเดฎเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดจเดฒเตเดฒ เดตเดพเดฏเดจ.

  3. เดซเต‡เดธเตเดฌเตเด•เตเด•เดฟเตฝ เดจเดฟเดจเตเดจเต BPF เดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดฌเตเดฒเต‹เด—เต. เด…เดฒเด•เตเดธเดฟ เดธเตเดฑเตเดฑเดพเดฑเต‹เดตเต‹เดฏเดฟเดฑเตเดฑเต‹เดตเต (เด‡เดฌเดฟเดชเดฟเดŽเดซเดฟเดจเตเดฑเต† เดฐเดšเดฏเดฟเดคเดพเดตเต) เด†เตปเดกเตเดฐเดฟ เดจเด•เตเดฐเดฟเด•เตเด•เต‹ - (เดชเดฐเดฟเดชเดพเดฒเด•เตป) เดŽเดจเตเดจเดฟเดตเตผ เด…เดตเดฟเดŸเต† เดŽเดดเตเดคเตเดจเตเดจเดคเต เดชเต‹เดฒเต†, เด‡เดคเต เดตเดณเดฐเต† เด…เดชเต‚เตผเดตเดฎเดพเดฏเดฟ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจเตเดณเตเดณเต‚, เดŽเดจเตเดจเดพเตฝ เด‰เดšเดฟเดคเดฎเดพเดฏเดฟ. libbpf).

  4. bpftool-เดจเตเดฑเต† เดฐเดนเดธเตเดฏเด™เตเด™เตพ. bpftool เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚ เดฐเดนเดธเตเดฏเด™เตเด™เดณเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏ Quentin Monnet-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดฐเดธเด•เดฐเดฎเดพเดฏ เดŸเตเดตเดฟเดฑเตเดฑเตผ เดคเตเดฐเต†เดกเต.

  5. BPF-เดฒเต‡เด•เตเด•เต เดกเตˆเดตเต เดšเต†เดฏเตเดฏเตเด•: เดตเดพเดฏเดจ เดธเดพเดฎเด—เตเดฐเดฟเด•เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต. Quentin Monnet-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ BPF เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเดจเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดฒเดฟเด™เตเด•เตเด•เดณเตเดŸเต† เด’เดฐเต เดตเดฒเดฟเดฏ (เด‡เดชเตเดชเต‹เดดเตเด‚ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจ) เดฒเดฟเดธเตเดฑเตเดฑเต.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•