BPF เช…เชจเซ‡ eBPF เชจเซ‹ เชธเช‚เช•เซเชทเชฟเชชเซเชค เชชเชฐเชฟเชšเชฏ

เชนเซ‡ เชนเชฌเชฐ! เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เชœเชพเชฃ เช•เชฐเซ€เช เช›เซ€เช เช•เซ‡ เช…เชฎเซ‡ เชเช• เชชเซเชธเซเชคเช• เชฌเชนเชพเชฐ เชชเชพเชกเชตเชพเชจเซ€ เชคเซˆเชฏเชพเชฐเซ€ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช"BPF เชธเชพเชฅเซ‡ Linux เช…เชตเชฒเซ‹เช•เชจเช•เซเชทเชฎเชคเชพ".

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

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

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

เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชœเช—เซเชฏเชพเชฎเชพเช‚ เชจเซ‡เชŸเชตเชฐเซเช• เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเช“เชจเชพ เชธเช‚เช—เช เชจเชฎเชพเช‚ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เช—เซ‡เชฐเชซเชพเชฏเชฆเชพ เช›เซ‡:

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

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

BPF เช…เชจเซ‡ eBPF

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

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

$ sudo tcpdump -d "tcp dst port 80"
(000) ldh [12] (001) jeq #0x86dd jt 2 jf 6
(002) ldb [20] (003) jeq #0x6 jt 4 jf 15
(004) ldh [56] (005) jeq #0x50 jt 14 jf 15
(006) jeq #0x800 jt 7 jf 15
(007) ldb [23] (008) jeq #0x6 jt 9 jf 15
(009) ldh [20] (010) jset #0x1fff jt 15 jf 11
(011) ldxb 4*([14]&0xf)
(012) ldh [x + 16] (013) jeq #0x50 jt 14 jf 15
(014) ret #262144
(015) ret #0

เช† เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เช‰เชชเชฐเซ‹เช•เซเชค เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชถเซเช‚ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เช›เซ‡:

  • เชธเซ‚เชšเชจเชพ (000): เช‘เชซเชธเซ‡เชŸ 12 เชชเชฐ เชชเซ‡เช•เซ‡เชŸเชจเซ‡ 16-เชฌเซ€เชŸ เชถเชฌเซเชฆ เชคเชฐเซ€เช•เซ‡, เชเช•เซเชฏเซเชฎเซเชฏเซเชฒเซ‡เชŸเชฐเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‹. เช“เชซเชธเซ‡เชŸ 12 เชชเซ‡เช•เซ‡เชŸเชจเชพ เชˆเชฅเชฐเชŸเชพเชˆเชชเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช›เซ‡.
  • เชธเซ‚เชšเชจเชพ (001): 0x86dd เชธเชพเชฅเซ‡ เชธเช‚เชšเชฏเช•เชฎเชพเช‚ เชฎเซ‚เชฒเซเชฏเชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ‡ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡, IPv6 เชฎเชพเชŸเซ‡ เช‡เชฅเชฐเชŸเชพเช‡เชช เชฎเซ‚เชฒเซเชฏ เชธเชพเชฅเซ‡. เชœเซ‹ เชชเชฐเชฟเชฃเชพเชฎ เชธเชพเชšเซเช‚ เชนเซ‹เชฏ, เชคเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชพเช‰เชจเซเชŸเชฐ เชธเซ‚เชšเชจเชพ (002) เชชเชฐ เชœเชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชœเซ‹ เชจเชนเซ€เช‚, เชคเซ‹ เชชเช›เซ€ (006) เชชเชฐ เชœเชพเชฏ เช›เซ‡.
  • เชธเซ‚เชšเชจเชพ (006): 0x800 (IPv4 เชฎเชพเชŸเซ‡ เช‡เชฅเชฐเชŸเชพเช‡เชช เชฎเซ‚เชฒเซเชฏ) เชธเชพเชฅเซ‡ เชฎเซ‚เชฒเซเชฏเชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เชœเชตเชพเชฌ เชธเชพเชšเซ‹ เชนเซ‹เชฏ, เชคเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ (007) เชชเชฐ เชœเชพเชฏ เช›เซ‡, เชœเซ‹ เชจเชนเซ€เช‚, เชคเซ‹ เชชเช›เซ€ (015) เชชเชฐ เชœเชพเชฏ เช›เซ‡.

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

BPF เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชฌเชพเชˆเชŸเช•เซ‹เชกเชจเซ‡ เชธเซเชŸเซ€เชต เชฎเซ‡เช•เช•เซ‡เชจ เช…เชจเซ‡ เชตเซ‡เชจ เชœเซ‡เช•เซ‹เชฌเชธเชจ เชฆเซเชตเชพเชฐเชพ 1992เชจเชพ เช…เช‚เชคเชฎเชพเช‚ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡เชฎเชจเชพ เชชเซ‡เชชเชฐ เชฌเชนเชพเชฐ เช†เชตเซเชฏเชพ เชคเซเชฏเชพเชฐเซ‡ เชชเซเชฐเชธเซเชคเชพเชตเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ. BSD เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐ: เชฏเซเชเชฐ-เชฒเซ‡เชตเชฒ เชชเซ‡เช•เซ‡เชŸ เช•เซ‡เชชเซเชšเชฐ เชฎเชพเชŸเซ‡ เชจเชตเซเช‚ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ, 1993 เชจเชพ เชถเชฟเชฏเชพเชณเชพเชฎเชพเช‚ เชฏเซเชเชจเชฟเช•เซเชธ เช•เซ‹เชจเซเชซเชฐเชจเซเชธเชฎเชพเช‚ เชชเซเชฐเชฅเชฎ เชตเช–เชค เช† เชŸเซ‡เช•เชจเซ‹เชฒเซ‹เชœเซ€ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€.

เช•เชพเชฐเชฃ เช•เซ‡ BPF เช เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เช›เซ‡, เชคเซ‡ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชšเชพเชฒเซ‡ เช›เซ‡. เชฌเชพเชˆเชŸเช•เซ‹เชก เช‰เชชเชฐเชพเช‚เชค, เชคเซ‡ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‡เชฎเชฐเซ€ เชฎเซ‹เชกเชฒ (เชฒเซ‹เชก เชธเซ‚เชšเชจเชพเช“ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชชเซ‡เช•เซ‡เชŸ เชชเชฐ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡), เชฐเชœเชฟเชธเซเชŸเชฐ (A เช…เชจเซ‡ X; เชธเช‚เชšเชฏเช• เช…เชจเซ‡ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เชฐเชœเชฟเชธเซเชŸเชฐ), เชธเซเช•เซเชฐเซ‡เชš เชฎเซ‡เชฎเชฐเซ€ เชธเซเชŸเซ‹เชฐเซ‡เชœ เช…เชจเซ‡ เช—เชฐเซเชญเชฟเชค เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชพเช‰เชจเซเชŸเชฐ เชชเชฃ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชฐเชธเชชเซเชฐเชฆ เชตเชพเชค เช เช›เซ‡ เช•เซ‡, BPF เชฌเชพเชˆเชŸเช•เซ‹เชกเชจเซ‡ Motorola 6502 ISA เชชเช›เซ€ เชฎเซ‹เชกเชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚. เชœเซ‡เชฎ เช•เซ‡ เชธเซเชŸเซ€เชต เชฎเซ‡เช•เช•เซ‡เชจเซ‡ เชคเซ‡เชจเชพเชฎเชพเช‚ เชฏเชพเชฆ เช•เชฐเซเชฏเซเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เช…เชนเซ‡เชตเชพเชฒ เชถเชพเชฐเซเช•เชซเซ‡เชธเซเชŸ '11เชฎเชพเช‚, Apple II เชชเชฐ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชคเซ‡ เชนเชพเชˆเชธเซเช•เซ‚เชฒเชฎเชพเช‚เชฅเซ€ เชฌเชฟเชฒเซเชก 6502 เชฅเซ€ เชชเชฐเชฟเชšเชฟเชค เชนเชคเซ‹, เช…เชจเซ‡ เช† เชœเซเชžเชพเชจเซ‡ BPF เชฌเชพเชˆเชŸเช•เซ‹เชก เชกเชฟเชเชพเช‡เชจ เช•เชฐเชตเชพเชจเชพ เชคเซ‡เชฎเชจเชพ เช•เชพเชฐเซเชฏเชจเซ‡ เชชเซเชฐเชญเชพเชตเชฟเชค เช•เชฐเซเชฏเซเช‚.

BPF เชธเชชเซ‹เชฐเซเชŸ Linux เช•เชฐเซเชจเชฒเชฎเชพเช‚ v2.5 เช…เชจเซ‡ เชชเช›เซ€เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡, เชœเซ‡ เชฎเซเช–เซเชฏเชคเซเชตเซ‡ เชœเชฏ เชถเซเชฒเชฟเชธเซเชŸ เชฆเซเชตเชพเชฐเชพ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡. BPF เช•เซ‹เชก 2011 เชธเซเชงเซ€ เชฏเชฅเชพเชตเชค เชฐเชนเซเชฏเซ‹, เชœเซเชฏเชพเชฐเซ‡ เชเชฐเชฟเช• เชกเซเชฎเชพเชธเซ‡เชŸเซ‡ BPF เชฆเซเชญเชพเชทเชฟเชฏเชพเชจเซ‡ JIT เชฎเซ‹เชกเชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชซเชฐเซ€เชฅเซ€ เชกเชฟเชเชพเช‡เชจ เช•เชฐเซเชฏเซ‹ (เชธเซเชฐเซ‹เชค: เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐเซเชธ เชฎเชพเชŸเซ‡ JIT). เชคเซ‡ เชชเช›เซ€, BPF เชฌเชพเช‡เชŸเช•เซ‹เชกเชจเซเช‚ เช…เชฐเซเชฅเช˜เชŸเชจ เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เช•เชฐเซเชจเชฒ เชธเซ€เชงเชพ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชจเซ‡ เชฒเช•เซเชทเซเชฏ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚ เช•เชจเซเชตเชฐเซเชŸ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡: x86, ARM, MIPS, เชตเช—เซ‡เชฐเซ‡.

เชชเชพเช›เชณเชฅเซ€, 2014 เชฎเชพเช‚, เชเชฒเซ‡เช•เซเชธเซ€ เชธเซเชŸเชพเชฐเซ‹เชตเซ‹เช‡เชŸเซ‹เชตเซ‡ BPF เชฎเชพเชŸเซ‡ เชจเชตเซ€ JIT เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชจเซ‹ เชชเซเชฐเชธเซเชคเชพเชต เชฎเซ‚เช•เซเชฏเซ‹. เชตเชพเชธเซเชคเชตเชฎเชพเช‚, เช† เชจเชตเซ€ JIT BPF เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชจเชตเซ€ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชฌเชจเซ€ เชนเชคเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ eBPF เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเชคเซเช‚ เชนเชคเซเช‚. เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชฌเช‚เชจเซ‡ VM เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชฎเชพเชŸเซ‡ เชธเชนเช…เชธเซเชคเชฟเชคเซเชต เชงเชฐเชพเชตเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชชเซ‡เช•เซ‡เชŸ เชซเชฟเชฒเซเชŸเชฐเชฟเช‚เช— เชนเชพเชฒเชฎเชพเช‚ eBPF เชจเซ€ เชŸเซ‹เชš เชชเชฐ เช…เชฎเชฒเชฎเชพเช‚ เช›เซ‡. เชนเช•เซ€เช•เชคเชฎเชพเช‚, เช˜เชฃเชพ เช†เชงเซเชจเชฟเช• เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชฎเชพเช‚, BPF เชจเซ‡ eBPF เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เช•เซเชฒเชพเชธเชฟเช•เชฒ BPF เช†เชœเซ‡ cBPF เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชพเชฏ เช›เซ‡.

eBPF เช•เซเชฒเชพเชธเชฟเช• BPF เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเชจเซ‡ เช˜เชฃเซ€ เชฐเซ€เชคเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ‡ เช›เซ‡:

  • เช†เชงเซเชจเชฟเช• 64-เชฌเซ€เชŸ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ‡ เช›เซ‡. eBPF 64-เชฌเซ€เชŸ เชฐเชœเชฟเชธเซเชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช‰เชชเชฒเชฌเซเชง เชฐเชœเชฟเชธเซเชŸเชฐเชจเซ€ เชธเช‚เช–เซเชฏเชพ 2 (เชเช•เซเชฏเซเชฎเซเชฏเซเชฒเซ‡เชŸเชฐ เช…เชจเซ‡ X) เชฅเซ€ เชตเชงเชพเชฐเซ€เชจเซ‡ 10 เช•เชฐเซ‡ เช›เซ‡. eBPF เชตเชงเชพเชฐเชพเชจเชพ opcodes (BPF_MOV, BPF_JNE, BPF_CALLโ€ฆ) เชชเชฃ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡.
  • เชจเซ‡เชŸเชตเชฐเซเช• เชฒเซ‡เชฏเชฐ เชธเชฌเชธเชฟเชธเซเชŸเชฎเชฅเซ€ เช…เชฒเช—. BPF เชฌเซ‡เชš เชกเซ‡เชŸเชพ เชฎเซ‹เชกเซ‡เชฒ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒเซเช‚ เชนเชคเซเช‚. เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชคเซ‹ เชนเซ‹เชตเชพเชฅเซ€, เชคเซ‡เชจเซ‹ เช•เซ‹เชก เชธเชฌเชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชนเชคเซ‹ เชœเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเช“ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เช•เซ‡, eBPF เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจ เชนเชตเซ‡ เชกเซ‡เชŸเชพ เชฎเซ‹เชกเซ‡เชฒ เชธเชพเชฅเซ‡ เชฌเช‚เชงเชพเชฏเซ‡เชฒ เชจเชฅเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‹เชˆเชชเชฃ เชนเซ‡เชคเซ เชฎเชพเชŸเซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€, เชนเชตเซ‡ eBPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชŸเซเชฐเซ‡เชธเชชเซ‹เช‡เชจเซเชŸ เช…เชฅเชตเชพ kprobe เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เช† เช…เชจเซเชฏ เช•เชฐเซเชจเชฒ เชธเชฌเชธเชฟเชธเซเชŸเชฎเชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ eBPF เช‡เชจเซเชธเซเชŸเซเชฐเซเชฎเซ‡เชจเซเชŸเซ‡เชถเชจ, เชชเชฐเซเชซเซ‹เชฐเซเชฎเชจเซเชธ เชเชจเชพเชฒเชฟเชธเชฟเชธ เช…เชจเซ‡ เช…เชจเซเชฏ เช˜เชฃเชพ เช‰เชชเชฏเซ‹เช—เชจเชพ เช•เซ‡เชธเซ‹เชจเชพ เชฆเชฐเชตเชพเชœเชพ เช–เซ‹เชฒเซ‡ เช›เซ‡. เชนเชตเซ‡ eBPF เช•เซ‹เชก เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ เชชเชพเชฅเชฎเชพเช‚ เชธเซเชฅเชฟเชค เช›เซ‡: kernel/bpf.
  • เชจเช•เชถเชพ เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชพเชคเชพ เชตเซˆเชถเซเชตเชฟเช• เชกเซ‡เชŸเชพ เชธเซเชŸเซ‹เชฐเซเชธ. เชจเช•เชถเชพ เช เช•เซ€-เชตเซ‡เชฒเซเชฏเซ เชธเซเชŸเซ‹เชฐเซเชธ เช›เซ‡ เชœเซ‡ เชฏเซเชเชฐ เชธเซเชชเซ‡เชธ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชธเซเชชเซ‡เชธ เชตเชšเซเชšเซ‡ เชกเซ‡เชŸเชพ เชเช•เซเชธเชšเซ‡เชจเซเชœ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. eBPF เช…เชจเซ‡เช• เชชเซเชฐเช•เชพเชฐเชจเชพ เช•เชพเชฐเซเชก เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡.
  • เช—เซŒเชฃ เช•เชพเชฐเซเชฏเซ‹. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชชเซ‡เช•เซ‡เชœ เชชเชฐ เชซเชฐเซ€เชฅเซ€ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡, เชšเซ‡เช•เชธเชฎเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‹, เช…เชฅเชตเชพ เชชเซ‡เช•เซ‡เชœเชจเซ‡ เช•เซเชฒเซ‹เชจ เช•เชฐเซ‹. เช† เชซเช‚เช•เซเชถเชจ เช•เชฐเซเชจเชฒเชจเซ€ เช…เช‚เชฆเชฐ เชšเชพเชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชฏเซเชเชฐ-เชธเซเชชเซ‡เชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเชพเชฅเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เชจเชฅเซ€. เชตเชงเซเชฎเชพเช‚, eBPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธเชฎเชพเช‚เชฅเซ€ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒเซเชธ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.
  • เช•เซ‰เชฒเซเชธ เชธเชฎเชพเชชเซเชค เช•เชฐเซ‹. eBPF เชฎเชพเช‚ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซเช‚ เช•เชฆ 4096 เชฌเชพเช‡เชŸเซเชธ เชธเซเชงเซ€ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช›เซ‡. เชเชจเซเชก เช•เซ‹เชฒ เชซเซ€เชšเชฐ eBPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชจเชตเชพ eBPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เชฐเชตเชพเชจเซ€ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡ เช…เชจเซ‡ เช† เชฐเซ€เชคเซ‡ เช† เชฎเชฐเซเชฏเชพเชฆเชพเชจเซ‡ เชฌเชพเชฏเชชเชพเชธ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ (32 เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชธเซเชงเซ€ เช† เชฐเซ€เชคเซ‡ เชธเชพเช‚เช•เชณเซ€ เชถเช•เชพเชฏ เช›เซ‡).

eBPF เช‰เชฆเชพเชนเชฐเชฃ

Linux เช•เชฐเซเชจเชฒ เชธเซเชคเซเชฐเซ‹เชคเซ‹เชฎเชพเช‚ eBPF เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เช›เซ‡. เชคเซ‡เช“ เชจเชฎเซ‚เชจเชพเช“/bpf/ เชชเชฐ เช‰เชชเชฒเชฌเซเชง เช›เซ‡. เช† เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซเช‚ เชธเช‚เช•เชฒเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชซเช•เซเชค เชŸเชพเช‡เชช เช•เชฐเซ‹:

$ sudo make samples/bpf/

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

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชจเชฎเซ‚เชจเชพเช“/bpf/เชฎเชพเช‚เชจเชพ เชฆเชฐเซ‡เช• เช‰เชฆเชพเชนเชฐเชฃเซ‹เชฎเชพเช‚ เชฌเซ‡ เชซเชพเช‡เชฒเซ‹ เชนเซ‹เชฏ เช›เซ‡. เช† เชฌเชพเชฌเชคเซ‡:

  • tracex4_kern.c, เช•เชฐเซเชจเชฒเชฎเชพเช‚ eBPF เชฌเชพเช‡เชŸเช•เซ‹เชก เชคเชฐเซ€เช•เซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เชธเซเชฐเซ‹เชค เช•เซ‹เชก เชงเชฐเชพเชตเซ‡ เช›เซ‡.
  • tracex4_user.c, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเซเชชเซ‡เชธเชฎเชพเช‚เชฅเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชงเชฐเชพเชตเซ‡ เช›เซ‡.

เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช†เชชเชฃเซ‡ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ tracex4_kern.c eBPF เชฌเชพเช‡เชŸเช•เซ‹เชก เชชเชฐ. เช† เช•เซเชทเชฃเซ‡ เชฎเชพเช‚ gcc eBPF เชฎเชพเชŸเซ‡ เช•เซ‹เชˆ เชธเชฐเซเชตเชฐ เชญเชพเช— เชจเชฅเซ€. เชธเชฆเชจเชธเซ€เชฌเซ‡, clang eBPF เชฌเชพเชˆเชŸเช•เซ‹เชก เชชเซ‡เชฆเชพ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. Makefile เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ clang เชธเช‚เช•เชฒเชจ เช•เชฐเชตเซเช‚ tracex4_kern.c เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชซเชพเช‡เชฒเชฎเชพเช‚.

เชฎเซ‡เช‚ เช‰เชชเชฐ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเซ‹ เช›เซ‡ เช•เซ‡ eBPF เชจเซ€ เชธเซŒเชฅเซ€ เชฐเชธเชชเซเชฐเชฆ เชตเชฟเชถเซ‡เชทเชคเชพเช“เชฎเชพเช‚เชจเซ€ เชเช• เชจเช•เชถเชพ เช›เซ‡. tracex4_kern เชเช• เชจเช•เชถเซ‹ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡ เช›เซ‡:

struct pair {
    u64 val;
    u64 ip;
};  

struct bpf_map_def SEC("maps") my_map = {
    .type = BPF_MAP_TYPE_HASH,
    .key_size = sizeof(long),
    .value_size = sizeof(struct pair),
    .max_entries = 1000000,
};

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

SEC("kprobe/kmem_cache_free")
int bpf_prog1(struct pt_regs *ctx)
{   
    long ptr = PT_REGS_PARM2(ctx);

    bpf_map_delete_elem(&my_map, &ptr); 
    return 0;
}
    
SEC("kretprobe/kmem_cache_alloc_node") 
int bpf_prog2(struct pt_regs *ctx)
{
    long ptr = PT_REGS_RC(ctx);
    long ip = 0;

    // ะฟะพะปัƒั‡ะฐะตะผ ip-ะฐะดั€ะตั ะฒั‹ะทั‹ะฒะฐัŽั‰ะตะน ัั‚ะพั€ะพะฝั‹ kmem_cache_alloc_node() 
    BPF_KRETPROBE_READ_RET_IP(ip, ctx);

    struct pair v = {
        .val = bpf_ktime_get_ns(),
        .ip = ip,
    };
    
    bpf_map_update_elem(&my_map, &ptr, &v, BPF_ANY);
    return 0;
}   

เช† เชฌเซ‡ เช•เชพเชฐเซเชฏเซ‹ เชคเชฎเชจเซ‡ เชจเช•เชถเชพเชฎเชพเช‚เชฅเซ€ เชเชจเซเชŸเซเชฐเซ€ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชจเซ€ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡ (kprobe/kmem_cache_free) เช…เชจเซ‡ เชจเช•เชถเชพเชฎเชพเช‚ เชจเชตเซ€ เชเชจเซเชŸเซเชฐเซ€ เช‰เชฎเซ‡เชฐเซ‹ (kretprobe/kmem_cache_alloc_node). เชฎเซ‹เชŸเชพ เช…เช•เซเชทเชฐเซ‹เชฎเชพเช‚ เชฒเช–เซ‡เชฒเชพ เชฌเชงเชพ เชซเช‚เช•เซเชถเชจ เชจเชพเชฎเซ‹ เชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฎเซ‡เช•เซเชฐเซ‹เชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช›เซ‡ bpf_helpers.h.

เชœเซ‹ เชนเซเช‚ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชซเชพเช‡เชฒเชจเชพ เชตเชฟเชญเชพเช—เซ‹เชจเซ‡ เชกเชฎเซเชช เช•เชฐเซเช‚, เชคเซ‹ เชฎเชพเชฐเซ‡ เชœเซ‹เชตเซเช‚ เชœเซ‹เชˆเช เช•เซ‡ เช† เชจเชตเชพ เชตเชฟเชญเชพเช—เซ‹ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช›เซ‡:

$ objdump -h tracex4_kern.o

tracex4_kern.o: file format elf64-little

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 kprobe/kmem_cache_free 00000048 0000000000000000 0000000000000000 00000040 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
2 kretprobe/kmem_cache_alloc_node 000000c0 0000000000000000 0000000000000000 00000088 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
3 maps 0000001c 0000000000000000 0000000000000000 00000148 2**2
CONTENTS, ALLOC, LOAD, DATA
4 license 00000004 0000000000000000 0000000000000000 00000164 2**0
CONTENTS, ALLOC, LOAD, DATA
5 version 00000004 0000000000000000 0000000000000000 00000168 2**2
CONTENTS, ALLOC, LOAD, DATA
6 .eh_frame 00000050 0000000000000000 0000000000000000 00000170 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

เชคเซเชฏเชพเช‚ เชชเชฃ เช›เซ‡ tracex4_user.c, เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎ. เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เช† เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช‡เชตเซ‡เชจเซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชธเชพเช‚เชญเชณเซ‡ เช›เซ‡ kmem_cache_alloc_node. เชœเซเชฏเชพเชฐเซ‡ เช†เชตเซ€ เช˜เชŸเชจเชพ เชฌเชจเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค eBPF เช•เซ‹เชก เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เชฅเชพเชฏ เช›เซ‡. เช•เซ‹เชก เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเชพ IP เชเชŸเซเชฐเชฟเชฌเซเชฏเซเชŸเชจเซ‡ เชจเช•เชถเชพเชฎเชพเช‚ เชธเชพเชšเชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชชเช›เซ€ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเซ‡ เชฎเซเช–เซเชฏ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชฒเซ‚เชช เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ:

$ sudo ./tracex4
obj 0xffff8d6430f60a00 is 2sec old was allocated at ip ffffffff9891ad90
obj 0xffff8d6062ca5e00 is 23sec old was allocated at ip ffffffff98090e8f
obj 0xffff8d5f80161780 is 6sec old was allocated at ip ffffffff98090e8f

เชฏเซเชเชฐ เชธเซเชชเซ‡เชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช…เชจเซ‡ eBPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เช›เซ‡? เช†เชฐเช‚เชญ เชธเชฎเชฏเซ‡ tracex4_user.c เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชซเชพเช‡เชฒ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡ tracex4_kern.o เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ load_bpf_file.

int main(int ac, char **argv)
{
    struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
    char filename[256];
    int i;

    snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);

    if (setrlimit(RLIMIT_MEMLOCK, &r)) {
        perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)");
        return 1;
    }

    if (load_bpf_file(filename)) {
        printf("%s", bpf_log_buf);
        return 1;
    }

    for (i = 0; ; i++) {
        print_old_objects(map_fd[1]);
        sleep(1);
    }

    return 0;
}

เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ load_bpf_file eBPF เชซเชพเช‡เชฒเชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฅเชฏเซ‡เชฒ เชšเช•เชพเชธเชฃเซ€เช“ เช‰เชฎเซ‡เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ /sys/kernel/debug/tracing/kprobe_events. เชนเชตเซ‡ เช…เชฎเซ‡ เช† เช˜เชŸเชจเชพเช“ เชธเชพเช‚เชญเชณเซ€เช เช›เซ€เช เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชฅเชพเชฏ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เช‚เชˆเช• เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

$ sudo cat /sys/kernel/debug/tracing/kprobe_events
p:kprobes/kmem_cache_free kmem_cache_free
r:kprobes/kmem_cache_alloc_node kmem_cache_alloc_node

เชจเชฎเซ‚เชจเชพ/bpf/ เชฎเชพเช‚ เช…เชจเซเชฏ เชคเชฎเชพเชฎ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹ เชธเชฎเชพเชจ เชฐเซ€เชคเซ‡ เชฐเชšเชพเชฏเซ‡เชฒ เช›เซ‡. เชคเซ‡เช“ เชนเช‚เชฎเซ‡เชถเชพ เชฌเซ‡ เชซเชพเช‡เชฒเซ‹ เชงเชฐเชพเชตเซ‡ เช›เซ‡:

  • XXX_kern.c: eBPF เช•เชพเชฐเซเชฏเช•เซเชฐเชฎ.
  • XXX_user.c: เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎ.

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

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

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

เชนเซเช‚ เชตเชพเช‚เชšเชตเชพเชจเซ€ เชญเชฒเชพเชฎเชฃ เช•เชฐเซเช‚ เช›เซเช‚:

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

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