ื ืงื•ืจืฅ ื”ืงื“ืžื” ืฆื• BPF ืื•ืŸ eBPF

ื”ืขืœื, ื”ืื‘ืจ! ืžื™ืจ ื•ื•ื™ืœืŸ ืื™ื™ืš ืžื™ื˜ื˜ื™ื™ืœืŸ ืื– ืžื™ืจ ื’ืจื™ื™ื˜ืŸ ื–ื™ืš ื ื‘ื•ืš ืคืืจ ืืจื•ื™ืกื’ืขื‘ืŸืด.ืœื™ื ื•ืงืก ืึธื‘ืกืขืจื•ื•ืึทื‘ื™ืœื™ื˜ื™ ืžื™ื˜ BPF".

ื ืงื•ืจืฅ ื”ืงื“ืžื” ืฆื• BPF ืื•ืŸ eBPF
ื–ื™ื ื˜ ื“ื™ BPF ื•ื•ื™ืจื˜ื•ืขืœ ืžืึทืฉื™ืŸ ื”ืืœื˜ ืฆื• ื™ื•ื•ืึทืœื•ื• ืื•ืŸ ืื™ื– ืึทืงื˜ื™ื•ื•ืœื™ ื’ืขื ื™ืฆื˜ ืื™ืŸ ืคื™ืจ, ืžื™ืจ ื”ืึธื‘ืŸ ืื™ื‘ืขืจื’ืขื–ืขืฆื˜ ืคึฟืึทืจ ืื™ืจ ืึทืŸ ืึทืจื˜ื™ืงืœ ื•ื•ืึธืก ื“ื™ืกืงืจื™ื™ื‘ื“ ื–ื™ื™ึทืŸ ื”ื•ื™ืคึผื˜ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืื•ืŸ ืงืจืึทื ื˜ ืฉื˜ืึทื˜.

ืื™ืŸ ื“ื™ ืœืขืฆื˜ืข ื™ืึธืจืŸ, ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืžื›ืฉื™ืจื™ื ืื•ืŸ ื˜ืขืงื ื™ืงืก ื”ืึธื‘ืŸ ื•ื•ืขืจืŸ ื™ื ืงืจื™ืกื™ื ื’ืœื™ ืคืึธืœืงืก ืฆื• ืคืึทืจื’ื™ื˜ื™ืงืŸ ื“ื™ ืœื™ืžื™ื˜ื™ื™ืฉืึทื ื– ืคื•ืŸ ื“ื™ ืœื™ื ื•ืงืก ืงืขืจืŸ ืื™ืŸ ืงืึทืกืขืก ื•ื•ื• ื”ื•ื™ืš-ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคึผืึทืงืึทื˜ ืคึผืจืึทืกืขืกื™ื ื’ ืื™ื– ืคืืจืœืื ื’ื˜. ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืžืขืจืกื˜ ืคืึธืœืงืก ื˜ืขืงื ื™ืงืก ืคื•ืŸ ื“ืขื ืžื™ืŸ ืื™ื– ื’ืขืจื•ืคืŸ ืงืขืจืŸ ื‘ื™ื™ืคึผืึทืก (ืงืขืจื ืขืœ ื‘ื™ื™ืคึผืึทืก) ืื•ืŸ ืึทืœืึทื•ื–, ื‘ื™ื™ืคึผืึทืกื™ื ื’ ื“ื™ ืงืขืจืŸ ื ืขืฅ ืฉื™ื›ื˜ืข, ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ืึทืœืข ืคึผืึทืงืึทื˜ ืคึผืจืึทืกืขืกื™ื ื’ ืคึฟื•ืŸ ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ. ื‘ื™ื™ืคึผืึทืกื™ื ื’ ื“ื™ ืงืขืจืŸ ืื•ื™ืš ื™ื ื•ื•ืึทืœื•ื•ื– ืงืึทื ื˜ืจืึธื•ืœื™ื ื’ ื“ื™ ื ืขืฅ ืงืึธืจื˜ ืคึฟื•ืŸ ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ. ืื™ืŸ ืื ื“ืขืจืข ื•ื•ืขืจื˜ืขืจ, ื•ื•ืขืŸ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ืึท ื ืขืฅ ืงืึธืจื˜, ืžื™ืจ ืคืึทืจืœืึธื–ื  ื–ื™ืš ื“ื™ ืฉืึธืคืขืจ ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ.

ื“ื•ืจืš ื˜ืจืึทื ืกืคืขืจื™ื ื’ ืคื•ืœ ืงืึธื ื˜ืจืึธืœ ืคื•ืŸ ื“ื™ ื ืขืฅ ืงืึธืจื˜ ืฆื• ืึท ื‘ืึทื ื™ืฆืขืจ-ืคึผืœืึทืฅ ืคึผืจืึธื’ืจืึทื, ืžื™ืจ ืจืขื“ื•ืฆื™ืจืŸ ืงืขืจื ืขืœ ืึธื•ื•ื•ืขืจื›ืขื“ (ืงืึธื ื˜ืขืงืกื˜ ืกื•ื•ื™ื˜ืฉื™ื ื’, ื ืขืฅ ืฉื™ื›ื˜ืข ืคึผืจืึทืกืขืกื™ื ื’, ื™ื ื˜ืขืจืึทืคึผืฅ, ืืื–"ื• ื•), ื•ื•ืึธืก ืื™ื– ื’ืึทื ืฅ ื•ื•ื™ื›ื˜ื™ืง ื•ื•ืขืŸ ืคืœื™ืกื ื“ื™ืง ืื™ืŸ ืกืคึผื™ื“ื– ืคื•ืŸ 10 ื’ื‘ / s ืึธื“ืขืจ ื”ืขื›ืขืจ. ืงืขืจื ืขืœ ื‘ื™ื™ืคึผืึทืก ืคึผืœื•ืก ืึท ืงืึธืžื‘ื™ื ืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ืื ื“ืขืจืข ืคึฟืขื™ึดืงื™ื™ื˜ืŸ (ืคึผืขืงืœ ืคึผืจืึทืกืขืกื™ื ื’) ืื•ืŸ ืึธืคึผื’ืขื”ื™ื˜ ืคืึธืจืฉื˜ืขืœื•ื ื’ ื˜ื•ื ื™ื ื’ (NUMA ืึทืงืึทื•ื ื˜ื™ื ื’, ืงืคึผื• ืืคื’ืขื–ื•ื ื“ืขืจื˜ืงื™ื™ื˜, ืืื–"ื• ื•) ืฉื˜ื™ืžืขืŸ ืฆื• ื“ื™ ืคืึทื ื“ืึทืžืขื ื˜ืึทืœื– ืคื•ืŸ ื”ื•ื™ืš-ืคืึธืจืฉื˜ืขืœื•ื ื’ ื ืขืฅ ืคึผืจืึทืกืขืกื™ื ื’ ืื™ืŸ ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ. ื˜ืึธืžืขืจ ืึท ื™ื’ื–ืขืžืคึผืœืขืจื™ ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ื“ืขื ื ื™ื™ึทืข ืฆื•ื’ืึทื ื’ ืฆื• ืคึผืึทืงืึทื˜ ืคึผืจืึทืกืขืกื™ื ื’ ืื™ื– DPDK ืคึฟื•ืŸ ื™ื ื˜ืขืœ (ื“ืึทื˜ืึท ืคึผืœื™ื™ืŸ ืื ื˜ื•ื•ื™ืงืœื•ื ื’ ืงื™ื˜), ื›ืึธื˜ืฉ ืขืก ื–ืขื ืขืŸ ืื ื“ืขืจืข ื‘ืึทื•ื•ื•ืกื˜ ืžื›ืฉื™ืจื™ื ืื•ืŸ ื˜ืขืงื ื™ืงืก, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ Cisco's VPP (Vector Packet Processing), Netmap ืื•ืŸ, ืคื•ืŸ ืงื•ืจืก, snab.

ืึธืจื’ืึทื ื™ื™ื–ื™ื ื’ ื ืขืฅ ื™ื ื˜ืขืจืึทืงืฉืึทื ื– ืื™ืŸ ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ ื”ืื˜ ืึท ื ื•ืžืขืจ ืคื•ืŸ ื“ื™ืกืึทื“ื•ื•ืึทื ื˜ื™ื“ื–ืฉื™ื–:

  • ื“ื™ ืึทืก ืงืขืจืŸ ืื™ื– ืึท ืึทื‘ืกื˜ืจืึทืงืฆื™ืข ืฉื™ื›ื˜ืข ืคึฟืึทืจ ื™ื™ึทื–ื ื•ื•ืึทืจื’ ืจืขืกื•ืจืกืŸ. ื•ื•ื™ื™ึทืœ ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ ืžื’ื™ืœื” ื”ืึธื‘ืŸ ืฆื• ืคื™ืจืŸ ื–ื™ื™ืขืจ ืจืขืกื•ืจืกืŸ ื’ืœื™ื™ึทืš, ื–ื™ื™ ืื•ื™ืš ื”ืึธื‘ืŸ ืฆื• ืคื™ืจืŸ ื–ื™ื™ืขืจ ืื™ื™ื’ืŸ ื™ื™ึทื–ื ื•ื•ืึทืจื’. ื“ืขื ืึธืคื˜ ืžื™ื˜ืœ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืคึผืจืึธื’ืจืึทื ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข ื“ืจื™ื•ื•ืขืจืก.
  • ื•ื•ื™ื™ึทืœ ืžื™ืจ ื’ืขื‘ืŸ ืึทืจื•ื™ืฃ ืงืขืจืŸ ืคึผืœืึทืฅ ื’ืึธืจ, ืžื™ืจ ืื•ื™ืš ื’ืขื‘ืŸ ืึทืจื•ื™ืฃ ืึทืœืข ื“ื™ ื ืขื˜ื•ื•ืึธืจืงื™ื ื’ ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™ ืฆื•ื’ืขืฉื˜ืขืœื˜ ื“ื•ืจืš ื“ื™ ืงืขืจืŸ. ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ ืžื’ื™ืœื” ืžื•ื–ืŸ ืจื™ื™ืžืคึผืœืขืžืขื ื˜ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ื•ื•ืึธืก ืงืขืŸ ืฉื•ื™ืŸ ื–ื™ื™ืŸ ืฆื•ื’ืขืฉื˜ืขืœื˜ ื“ื•ืจืš ื“ื™ ืงืขืจืŸ ืึธื“ืขืจ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขื.
  • ืžื’ื™ืœื” ืึทืจื‘ืขื˜ืŸ ืื™ืŸ ื–ืึทืžื“ืงืึทืกื˜ืŸ ืžืึธื“ืข, ื•ื•ืึธืก ืึทืค ืึทื  ืขืžืขืก ืœื™ืžืึทืฅ ื–ื™ื™ืขืจ ื™ื ื˜ืขืจืึทืงืฉืึทืŸ ืื•ืŸ ืคึผืจื™ื•ื•ืขื ืฅ ื–ื™ื™ ืคื•ืŸ ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ืžื™ื˜ ืื ื“ืขืจืข ืคึผืึทืจืฅ ืคื•ืŸ ื“ื™ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขื.

ืื™ืŸ ืขืกืึทื ืก, ื•ื•ืขืŸ ื ืขื˜ื•ื•ืึธืจืงื™ื ื’ ืื™ืŸ ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ, ืคืึธืจืฉื˜ืขืœื•ื ื’ ื’ื™ื™ื ื– ื–ืขื ืขืŸ ืึทื˜ืฉื™ื•ื•ื“ ื“ื•ืจืš ืžืึธื•ื•ื™ื ื’ ืคึผืึทืงืึทื˜ ืคึผืจืึทืกืขืกื™ื ื’ ืคื•ืŸ ื“ื™ ืงืขืจืŸ ืฆื• ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ. XDP ื˜ื•ื˜ ืคึผื•ื ืงื˜ ื“ื™ ืคืึทืจืงืขืจื˜: ืขืก ื‘ืื•ื•ืขื’ื˜ ื ืขื˜ื•ื•ืึธืจืงื™ื ื’ ืžื’ื™ืœื” ืคื•ืŸ ื‘ืึทื ื™ืฆืขืจ ืคึผืœืึทืฅ (ืคื™ืœื˜ืขืจืก, ืจืขืกืึธืœื•ื•ืขืจืก, ืจื•ื˜ื™ื ื’, ืืื–"ื• ื•) ืื™ืŸ ืงืขืจืŸ ืคึผืœืึทืฅ. XDP ืึทืœืึทื•ื– ืื•ื ื“ื– ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ืึท ื ืขืฅ ืคื•ื ืงืฆื™ืึธื ื™ืจืŸ ื•ื•ื™ ื‘ืึทืœื“ ื•ื•ื™ ืึท ืคึผืึทืงืึทื˜ ืฉืœืึธื’ืŸ ืึท ื ืขืฅ ืฆื•ื‘ื™ื ื“ ืื•ืŸ ืื™ื™ื“ืขืจ ืขืก ืกื˜ืึทืจืฅ ืฆื• ืžืึทืš ืึทืจื•ื™ืฃ ืื™ืŸ ื“ื™ ืงืขืจืŸ ื ืขืฅ ืกืึทื‘ืกื™ืกื˜ืึทื. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ื“ื™ ืคึผืึทืงืึทื˜ ืคึผืจืึทืกืขืกื™ื ื’ ื’ื™ื›ืงื™ื™ึทื˜ ื™ื ืงืจื™ืกื™ื– ื‘ืื˜ื™ื™ื˜ื™ืง. ืึธื‘ืขืจ, ื•ื•ื™ ืงืขืŸ ื“ืขืจ ืงืขืจืŸ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืฆื• ื•ื™ืกืคื™ืจืŸ ื–ื™ื™ืขืจ ืžื’ื™ืœื” ืื™ืŸ ืงืขืจืŸ ืคึผืœืึทืฅ? ืื™ื™ื“ืขืจ ืื™ืจ ืขื ื˜ืคึฟืขืจืŸ ื“ืขื ืงืฉื™ื, ืœืึธื–ืŸ ืื•ื ื“ื– ืงื•ืง ืื™ืŸ ื•ื•ืึธืก BPF ืื™ื–.

BPF ืื•ืŸ eBPF

ื˜ืจืึธืฅ ื“ืขื ืงืึทื ืคื™ื•ื–ื™ื ื’ ื ืึธืžืขืŸ, BPF (Berkeley Packet Filtering) ืื™ื–, ืื™ืŸ ืคืึทืงื˜, ืึท ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ืžืึธื“ืขืœ. ื“ืขืจ ื•ื•ื™ืจื˜ื•ืขืœ ืžืึทืฉื™ืŸ ืื™ื– ืขืจื™ื“ื–ืฉื ืึทืœื™ ื“ื™ื–ื™ื™ื ื“ ืฆื• ืฉืขืคึผืŸ ืคึผืึทืงืึทื˜ ืคึฟื™ืœื˜ืจื™ืจื•ื ื’, ื“ืขืจืคืืจ ื“ืขืจ ื ืึธืžืขืŸ.

ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืžืขืจืกื˜ ื‘ืึทืจื™ืžื˜ ืžื›ืฉื™ืจื™ื ืžื™ื˜ BPF ืื™ื– tcpdump. ื•ื•ืขืŸ ืงืึทืคึผื˜ืฉืขืจื™ื ื’ ืคึผืึทืงื™ืฅ ื ื™ืฆืŸ tcpdump ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืงืขื ืขืŸ ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ืึทืŸ ืื•ื™ืกื“ืจื•ืง ืฆื• ืคื™ืœื˜ืขืจ ืคึผืึทืงื™ืฅ. ื‘ืœื•ื™ื– ืคึผืึทืงื™ืฅ ื•ื•ืึธืก ืจื™ื›ื˜ืŸ ื–ื™ืš ืฆื• ื“ืขื ืื•ื™ืกื“ืจื•ืง ื•ื•ืขื˜ ื–ื™ื™ืŸ ืงืึทืคึผื˜ืฉืขืจื“. ืœืžืฉืœ, ื“ืขืจ ืื•ื™ืกื“ืจื•ืง "tcp dst port 80" ืจืขืคืขืจืก ืฆื• ืึทืœืข ื˜ืงืคึผ ืคึผืึทืงื™ืฅ ืขืจื™ื™ื•ื•ื™ื ื’ ืื•ื™ืฃ ืคึผืึธืจื˜ 80. ื“ืขืจ ืงืึทืžืคึผื™ื™ืœืขืจ ืงืขื ืขืŸ ืคืึทืจืงื™ืจืฆืŸ ื“ืขื ืื•ื™ืกื“ืจื•ืง ื“ื•ืจืš ืงืึทื ื•ื•ืขืจื˜ื™ื ื’ ืขืก ืฆื• 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 ื•ื•ื™ืจื˜ื•ืขืœ ืžืึทืฉื™ืŸ ืื•ืŸ ื–ื™ื™ึทืŸ ื‘ื™ื™ื˜ืขืงืึธื“ ื–ืขื ืขืŸ ืคืืจื’ืขืœื™ื™ื’ื˜ ื“ื•ืจืš Steve McCann ืื•ืŸ Van Jacobson ืื™ืŸ ืฉืคึผืขื˜ 1992 ื•ื•ืขืŸ ื–ื™ื™ืขืจ ืฆื™ื™ื˜ื•ื ื’ ืื™ื– ืืจื•ื™ืก. BSD ืคึผืึทืงืึทื˜ ืคึฟื™ืœื˜ืจื™ืจ: ื ื™ื• ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืคึฟืึทืจ ื‘ืึทื ื™ืฆืขืจ-ืžื“ืจื’ื” ืคึผืึทืงืึทื˜ ืงืึทืคึผื˜ื•ืจืข, ื“ื™ ื˜ืขื›ื ืึธืœืึธื’ื™ืข ืื™ื– ื’ืขื•ื•ืขืŸ ืขืจืฉื˜ืขืจ ื“ืขืจืœืื ื’ื˜ ืื™ืŸ ื“ื™ ื•ืกืขื ื™ืงืก ื–ื™ืฆื•ื ื’ ืื™ืŸ ื“ื™ ื•ื•ื™ื ื˜ืขืจ ืคื•ืŸ 1993.

ื•ื•ื™ื™ึทืœ BPF ืื™ื– ืึท ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ, ืขืก ื“ื™ืคื™ื™ื ื– ื“ื™ ืกื•ื•ื™ื•ื•ืข ืื™ืŸ ื•ื•ืึธืก ืžื’ื™ืœื” ืœื•ื™ืคืŸ. ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื“ื™ ื‘ื™ื˜ืขืงืึธื“ืข, ืขืก ืื•ื™ืš ื“ื™ืคื™ื™ื ื– ื“ื™ ืคึผืขืงืœ ื–ื™ืงืึธืจืŸ ืžืึธื“ืขืœ (ืžืึทืกืข ืื™ื ืกื˜ืจื•ืงืฆื™ืขืก ื–ืขื ืขืŸ ื™ืžืคึผืœื™ืกืึทื˜ืœื™ ื’ืขื•ื•ืขื ื“ื˜ ืฆื• ื“ืขืจ ืคึผืขืงืœ), ืจืขื“ื–ืฉื™ืกื˜ืขืจื– (ื ืื•ืŸ X; ืึทืงื™ื•ืžื™ืึทืœืึทื˜ืึธืจ ืื•ืŸ ืื™ื ื“ืขืงืก ืจืขื“ื–ืฉื™ืกื˜ืขืจืก), ืงืจืึทืฆืŸ ื–ื›ึผืจื•ืŸ ืกื˜ืึธืจื™ื“ื–ืฉ ืื•ืŸ ืึท ื™ืžืคึผืœื™ืกืึทื˜ ืคึผืจืึธื’ืจืึทื ื˜ืึธืžื‘ืึทื ืง. ื™ื ื˜ืขืจืขืกื˜ื™ื ื’ืœื™, ื“ื™ BPF ื‘ื™ื˜ืขืงืึธื“ืข ืื™ื– ืžืึธื“ืขืœืขื“ ื ืึธืš ื“ื™ Motorola 6502 ISA. ื•ื•ื™ ืกื˜ื™ื•ื• ืžืึทืงืึทืŸ ืจื™ืงืึธืœื“ ืื™ืŸ ื–ื™ื™ืŸ ืคึผืœืขื ืขืจ ื‘ืึทืจื™ื›ื˜ ืื™ืŸ Sharkfest '11, ืขืจ ืื™ื– ื’ืขื•ื•ืขืŸ ื‘ืึทืงืึทื ื˜ ืžื™ื˜ ื‘ื•ื™ืขืŸ 6502 ืคึฟื•ืŸ ื–ื™ื™ืŸ ื”ื•ื™ืš ืฉื•ืœืข ื˜ืขื’ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืื•ื™ืฃ ื“ื™ ืขืคึผืœ ื•ื•, ืื•ืŸ ื“ื™ ื•ื•ื™ืกืŸ ื™ื ืคืœื•ืึทื ืกื˜ ื–ื™ื™ืŸ ืึทืจื‘ืขื˜ ื“ื™ื–ื™ื™ื ื™ื ื’ ื“ื™ BPF ื‘ื™ื˜ืขืงืึธื“ืข.

BPF ืฉื˜ื™ืฆืŸ ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื™ืŸ ื“ื™ ืœื™ื ื•ืงืก ืงืขืจืŸ ืื™ืŸ ื•ื•ืขืจืกื™ืขืก ื•ื•2.5 ืื•ืŸ ื”ืขื›ืขืจ, ื“ืขืจ ื”ื•ื™ืคึผื˜ ืฆื•ื’ืขื’ืขื‘ืŸ ื“ื•ืจืš ื“ื™ ื”ืฉืชื“ืœื•ืช ืคื•ืŸ Jay Schullist. ื“ื™ BPF ืงืึธื“ ืื™ื– ื’ืขื‘ืœื™ื‘ืŸ ืึทื ื˜ืฉื™ื™ื ื“ื–ืฉื“ ื‘ื™ื– 2011, ื•ื•ืขืŸ Eric Dumaset ืจื™ื“ื™ื–ื™ื™ื ื“ ื“ื™ BPF ื™ื‘ืขืจื–ืขืฆืขืจ ืฆื• ืœื•ื™ืคืŸ ืื™ืŸ JIT ืžืึธื“ืข (ืžืงื•ืจ: JIT ืคึฟืึทืจ ืคึผืึทืงืึทื˜ ืคื™ืœื˜ืขืจืก). ื ืึธืš ื“ืขื, ื“ืขืจ ืงืขืจืŸ, ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ื™ื ื˜ืขืจืคึผืจืขื˜ื™ื ื’ BPF ื‘ื™ื˜ืขืงืึธื“ืข, ืงืขืŸ ื’ืœื™ื™ืš ื’ืขืจ BPF ืžื’ื™ืœื” ืฆื• ื“ื™ ืฆื™ืœ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ: x86, ARM, MIPS, ืขื˜ืง.

ืฉืคึผืขื˜ืขืจ, ืื™ืŸ 2014, ืึทืœืขืงืกื™ื™ ืกื˜ืึทืจืึธื•ื•ืึธื™ื˜ืึธื•ื• ืคืืจื’ืขืœื™ื™ื’ื˜ ืึท ื ื™ื™ึทืข ื“ื–ืฉื™ื˜ ืžืขืงืึทื ื™ื–ืึทื ืคึฟืึทืจ BPF. ืื™ืŸ ืคืึทืงื˜, ื“ื™ ื ื™ื™ึทืข JIT ืื™ื– ื’ืขื•ื•ืืจืŸ ืึท ื ื™ื™ึทืข BPF-ื‘ืื–ื™ืจื˜ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจ ืื•ืŸ ืื™ื– ื’ืขืจื•ืคืŸ eBPF. ืื™ืš ื˜ืจืึทื›ื˜ืŸ ื‘ื™ื™ื“ืข VMs ืงืึธื•ื™ื’ื–ื™ืกื˜ื™ืจื˜ ืคึฟืึทืจ ืขื˜ืœืขื›ืข ืžืึธืœ, ืึธื‘ืขืจ ื“ืขืจื•ื•ื™ื™ึทืœ ืคึผืึทืงืึทื˜ ืคึฟื™ืœื˜ืจื™ืจื•ื ื’ ืื™ื– ื™ืžืคึผืœืึทืžืขื ืึทื“ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ eBPF. ืื™ืŸ ืคื™ืœืข ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ืžืึธื“ืขืจืŸ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ, BPF ืื™ื– ืคืืจืฉื˜ืื ืขืŸ ืฆื• ื–ื™ื™ืŸ eBPF, ืื•ืŸ ืงืœืึทืกื™ืฉ BPF ืื™ื– ื”ื™ื™ึทื ื˜ ื‘ืืงืื ื˜ ื•ื•ื™ cBPF.

eBPF ื™ืงืกื˜ืขื ื“ื– ื“ื™ ืงืœืึทืกื™ืฉ BPF ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ืื™ืŸ ืขื˜ืœืขื›ืข ื•ื•ืขื’ืŸ:

  • ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืžืึธื“ืขืจืŸ 64-ื‘ื™ืกืœ ืึทืจืงืึทื˜ืขืงื˜ืฉืขืจื–. eBPF ื ื™ืฆื˜ 64-ื‘ื™ืกืœ ืจืขื“ื–ืฉื™ืกื˜ืขืจื– ืื•ืŸ ื™ื ืงืจื™ืกื™ื– ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื‘ื ื™ืžืฆื ืจืขื“ื–ืฉื™ืกื˜ืขืจื– ืคื•ืŸ 2 (ืึทืงื™ื•ืžื™ืึทืœืึทื˜ืึธืจ ืื•ืŸ X) ืฆื• 10. eBPF ืื•ื™ืš ื’ื™ื˜ ื ืึธืš ืึธืคึผืงืึธื“ืขืก (BPF_MOV, BPF_JNE, BPF_CALL...).
  • ื“ื™ื˜ืึทื˜ืฉื˜ ืคื•ืŸ ื“ื™ ื ืขืฅ ืฉื™ื›ื˜ืข ืกืึทื‘ืกื™ืกื˜ืึทื. BPF ืื™ื– ื’ืขื•ื•ืขืŸ ื˜ื™ื™ื“ ืฆื• ื“ื™ ืคึผืขืงืœ ื“ืึทื˜ืŸ ืžืึธื“ืขืœ. ื–ื™ื ื˜ ืขืก ืื™ื– ื’ืขื ื™ืฆื˜ ืคึฟืึทืจ ืคึผืึทืงืึทื˜ ืคึฟื™ืœื˜ืจื™ืจื•ื ื’, ื–ื™ื™ึทืŸ ืงืึธื“ ืื™ื– ื’ืขื•ื•ืขืŸ ืœื™ื’ืŸ ืื™ืŸ ื“ื™ ืกืึทื‘ืกื™ืกื˜ืขื ื•ื•ืึธืก ื’ื™ื˜ ื ืขืฅ ืงืึธืžื•ื ื™ืงืึทืฆื™ืข. ืึธื‘ืขืจ, ื“ื™ eBPF ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ืื™ื– ื ื™ื˜ ืžืขืจ ื˜ื™ื™ื“ ืฆื• ื“ื™ ื“ืึทื˜ืŸ ืžืึธื“ืขืœ ืื•ืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืคึฟืึทืจ ืงื™ื™ืŸ ืฆื™ืœ. ืื™ืฆื˜, ื“ื™ eBPF ืคึผืจืึธื’ืจืึทื ืงืขื ืขืŸ ื–ื™ื™ืŸ ืงืึธื ื ืขืงื˜ืขื“ ืฆื• ื˜ืจืึทืกืขืคึผืึธื™ื ื˜ ืึธื“ืขืจ kprobe. ื“ืึธืก ืึธืคึผืขื ืก ื“ืขื ื•ื•ืขื’ ืฆื• eBPF ื™ื ืกื˜ืจืึทืžืขื ื˜ื™ื™ืฉืึทืŸ, ืคืึธืจืฉื˜ืขืœื•ื ื’ ืึทื ืึทืœื™ืกื™ืก ืื•ืŸ ืคื™ืœืข ืื ื“ืขืจืข ื ื•ืฆืŸ ืงืึทืกืขืก ืื™ืŸ ื“ืขื ืงืึธื ื˜ืขืงืกื˜ ืคื•ืŸ ืื ื“ืขืจืข ืงืขืจืŸ ืกืึทื‘ืกื™ืกื˜ืึทืžื–. ืื™ืฆื˜ ื“ื™ eBPF ืงืึธื“ ืื™ื– ืœื™ื’ืŸ ืื™ืŸ ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข ื“ืจืš: ืงืขืจืŸ / 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 ื”ื™ื™ึทื ื˜, ืึทื–ื•ื™ ืื™ืš ื•ื•ืขื˜ ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืึท ื‘ื™ืกืœ ืžืขืจ ืจืขืกื•ืจืกืŸ ืคึฟืึทืจ ื•ื•ื™ื™ึทื˜ืขืจ ืœืขืจื ืขืŸ

ืื™ืš ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืœื™ื™ืขื ืขืŸ:

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’