BPF เจ…เจคเฉ‡ eBPF เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช เจœเจพเจฃ-เจชเจ›เจพเจฃ

เจนเฉˆเจฒเฉ‹, เจนเฉˆเจฌเจฐ! เจ…เจธเฉ€เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจฐเจฟเจฒเฉ€เจœเจผ เจฒเจˆ เจ‡เฉฑเจ• เจ•เจฟเจคเจพเจฌ เจคเจฟเจ†เจฐ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚เฅค"BPF เจจเจพเจฒ เจฒเฉ€เจจเจ•เจธ เจจเจฟเจฐเฉ€เจ–เจฃเจฏเฉ‹เจ—เจคเจพ".

BPF เจ…เจคเฉ‡ eBPF เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช เจœเจพเจฃ-เจชเจ›เจพเจฃ
เจ•เจฟเจ‰เจ‚เจ•เจฟ BPF เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฆเจพ เจตเจฟเจ•เจพเจธ เจ•เจฐเจจเจพ เจœเจพเจฐเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš เจธเจฐเจ—เจฐเจฎเฉ€ เจจเจพเจฒ เจตเจฐเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจ…เจธเฉ€เจ‚ เจคเฉเจนเจพเจกเฉ‡ เจฒเจˆ เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจฎเฉเฉฑเจ– เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเจฅเจฟเจคเฉ€ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจ‡เฉฑเจ• เจฒเฉ‡เจ– เจฆเจพ เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเจพ เจนเฉˆเฅค

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

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

เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจจเฉˆเจŸเจตเจฐเจ• เจ‡เฉฐเจŸเจฐเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉฐเจ—เจ เจฟเจค เจ•เจฐเจจ เจฆเฉ‡ เจ•เจˆ เจจเฉเจ•เจธเจพเจจ เจนเจจ:

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

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

BPF เจ…เจคเฉ‡ eBPF

เจญเฉฐเจฌเจฒเจญเฉ‚เจธเฉ‡ เจตเจพเจฒเฉ‡ เจจเจพเจฎ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ, 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)) เจตเจพเจชเจธ เจ•เจฐเจจ เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ เจธเจตเฉ€เจ•เจพเจฐ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค

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

เจ•เจฟเจ‰เจ‚เจ•เจฟ BPF เจ‡เฉฑเจ• เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจนเฉˆ, เจ‡เจน เจตเจพเจคเจพเจตเจฐเจฃ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจฆเฉ€ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจšเฉฑเจฒเจฆเฉ‡ เจนเจจเฅค เจฌเจพเจˆเจŸเจ•เฉ‹เจก เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‡เจน เจฌเฉˆเจš เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจฎเจพเจกเจฒ เจจเฉ‚เฉฐ เจตเฉ€ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ (เจฒเฉ‹เจก เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจจเฉ‚เฉฐ เจฌเฉˆเจš 'เจคเฉ‡ เจธเจชเฉฑเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ), เจฐเจœเจฟเจธเจŸเจฐ (เจ เจ…เจคเฉ‡ เจเจ•เจธ; เจเจ•เจฏเฉ‚เจฎเฉ‚เจฒเฉ‡เจŸเจฐ เจ…เจคเฉ‡ เจ‡เฉฐเจกเฉˆเจ•เจธ เจฐเจœเจฟเจธเจŸเจฐ), เจธเจ•เฉเจฐเฉˆเจš เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจธเจŸเฉ‹เจฐเฉ‡เจœ, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เจพเจŠเจ‚เจŸเจฐเฅค เจฆเจฟเจฒเจšเจธเจช เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ, BPF เจฌเจพเจˆเจŸเจ•เฉ‹เจก เจจเฉ‚เฉฐ Motorola 6502 ISA เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฎเจพเจกเจฒ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจธเฉ€เฅค เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจธเจŸเฉ€เจต เจฎเฉˆเจ•เจ•เฉˆเจจ เจจเฉ‡ เจ†เจชเจฃเฉ‡ เจตเจฟเฉฑเจš เจฏเจพเจฆ เจ•เฉ€เจคเจพ เจชเฉ‚เจฐเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ เจธเจผเจพเจฐเจ•เจซเฉˆเจธเจŸ '11 'เจคเฉ‡, เจ‰เจน Apple II 'เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจนเจพเจˆ เจธเจ•เฉ‚เจฒ เจฆเฉ‡ เจฆเจฟเจจเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจคเฉ‹เจ‚ เจฌเจฟเจฒเจก 6502 เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจธเฉ€, เจ…เจคเฉ‡ เจ‡เจธ เจ—เจฟเจ†เจจ เจจเฉ‡ BPF เจฌเจพเจˆเจŸเจ•เฉ‹เจก เจจเฉ‚เฉฐ เจกเจฟเจœเจผเจพเจˆเจจ เจ•เจฐเจจ เจฆเฉ‡ เจ‰เจธเจฆเฉ‡ เจ•เฉฐเจฎ เจจเฉ‚เฉฐ เจชเฉเจฐเจญเจพเจตเจฟเจค เจ•เฉ€เจคเจพเฅค

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

เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš, 2014 เจตเจฟเฉฑเจš, เจ…เจฒเฉˆเจ•เจธเฉ€ เจธเจŸเจพเจฐเฉ‹เจตเฉ‹เจ‡เจŸเฉ‹เจต เจจเฉ‡ เจฌเฉ€เจชเฉ€เจเจซ เจฒเจˆ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจœเฉ‡เจ†เจˆเจŸเฉ€ เจตเจฟเจงเฉ€ เจฆเจพ เจชเฉเจฐเจธเจคเจพเจต เจ•เฉ€เจคเจพเฅค เจตเจพเจธเจคเจต เจตเจฟเฉฑเจš, เจ‡เจน เจจเจตเฉ€เจ‚ JIT เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ BPF- เจ…เจงเจพเจฐเจค เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฌเจฃ เจ—เจˆ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ eBPF เจ•เจฟเจนเจพ เจ—เจฟเจ†เฅค เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจฆเฉ‹เจตเฉ‡เจ‚ VM เจ•เฉเจ เจธเจฎเฉ‡เจ‚ เจฒเจˆ เจ‡เจ•เฉฑเจ เฉ‡ เจธเจจ, เจชเจฐ เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐเจฟเฉฐเจ— eBPF เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆเฅค เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจ†เจงเฉเจจเจฟเจ• เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš, เจฌเฉ€เจชเฉ€เจเจซ เจจเฉ‚เฉฐ เจˆเจฌเฉ€เจชเฉ€เจเจซ เจธเจฎเจเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ•เจฒเจพเจธเฉ€เจ•เจฒ เจฌเฉ€เจชเฉ€เจเจซ เจจเฉ‚เฉฐ เจ…เฉฑเจœ เจธเฉ€เจฌเฉ€เจชเฉ€เจเจซ เจตเจœเฉ‹เจ‚ เจœเจพเจฃเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

eBPF เจ•เจฒเจพเจธเจฟเจ• BPF เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจจเฉ‚เฉฐ เจ•เจˆ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเจพเจฒ เจตเจงเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ:

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

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

เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจธเจฐเฉ‹เจคเจพเจ‚ เจตเจฟเฉฑเจš 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 เจฌเจพเจฐเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจ…เจคเฉ‡ เจธเจฐเฉ‹เจค เจฎเฉŒเจœเฉ‚เจฆ เจนเจจ, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจ…เจ—เจฒเฉ‡ เจ…เจงเจฟเจเจจ เจฒเจˆ เจ•เฉเจ เจนเฉ‹เจฐ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจธเจฟเจซเจผเจพเจฐเจธเจผ เจ•เจฐเจพเจ‚เจ—เจพ

เจฎเฉˆเจ‚ เจชเฉœเฉเจนเจจ เจฆเฉ€ เจธเจฟเจซเจพเจฐเจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚:

  • BPF: เจฏเฉ‚เจจเฉ€เจตเจฐเจธเจฒ เจ‡เจจ-เจ•เจฐเจจเจฒ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจœเฉ‹เจจเจพเจฅเจจ เจ•เจพเจฐเจฌเฉ‡เจŸ. BPF เจจเจพเจฒ เจœเจพเจฃ-เจชเจ›เจพเจฃ เจ…เจคเฉ‡ เจ‡เจน eBPF เจตเจฟเฉฑเจš เจ•เจฟเจตเฉ‡เจ‚ เจตเจฟเจ•เจธเจฟเจค เจนเฉ‹เจ‡เจ†เฅค
  • eBPF เจฆเฉ€ เจชเฉ‚เจฐเฉ€ เจœเจพเจฃ-เจชเจ›เจพเจฃ เจฌเฉเจฐเฉˆเจ‚เจกเจจ เจ—เฉเจฐเฉ‡เจ—. LWN.net เจคเฉ‹เจ‚ เจฒเฉ‡เจ–เฅค เจฌเฉเจฐเฉˆเจ‚เจกเจจ เจ…เจ•เจธเจฐ eBPF เจฌเจพเจฐเฉ‡ เจŸเจตเฉ€เจŸ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ†เจชเจฃเฉ‡ เจตเจฟเจธเจผเฉ‡ 'เจคเฉ‡ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆเฅค เจฌเจฒเจพเฉฑเจ— เจชเฉ‹เจธเจŸ.
  • BPF เจ…เจคเฉ‡ eBPF 'เจคเฉ‡ เจจเฉ‹เจŸเจธ เจœเฉ‚เจฒเฉ€เจ† เจ‡เจตเจพเจจเจธ. เจธเฉเจšเจ•เจฐ เจธเจผเจฐเจฎเจพ เจฆเฉเจ†เจฐเจพ เจชเฉ‡เจธเจผเจ•เจพเจฐเฉ€ 'เจคเฉ‡ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ "เจฆเจฟ BSD เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐ: เจ‰เจชเจญเฉ‹เจ—เจคเจพ-เจชเฉฑเจงเจฐ เจฆเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจ•เฉˆเจชเจšเจฐ เจฒเจˆ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ"เฅค เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจšเฉฐเจ—เฉ€เจ†เจ‚ เจนเจจ เจ…เจคเฉ‡ เจธเจฒเจพเจˆเจกเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฎเจเจฃ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ€ เจฎเจฆเจฆ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค
  • eBPF, เจญเจพเจ— 1: เจ…เจคเฉ€เจค, เจตเจฐเจคเจฎเจพเจจ เจ…เจคเฉ‡ เจญเจตเจฟเฉฑเจ– เจซเฉ‡เจฐเจฟเจธ เจเจฒเจฟเจธ. เจจเจพเจฒ เจฒเฉฐเจฌเฉ‡ เจธเจฎเฉ‡เจ‚ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเฉ‹ เจจเจฟเจฐเฉฐเจคเจฐเจคเจพ, เจชเจฐ เจ‡เจน เจชเฉœเฉเจนเจจ เจฏเฉ‹เจ— เจนเฉˆเฅค เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจœเฉ‹ เจฎเฉˆเจ‚ eBPF 'เจคเฉ‡ เจ†เจ‡เจ† เจนเจพเจ‚เฅค

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

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