แฐแแ แฐแแแ ! แแแชแแแแแแ, แ แแ แแแแแแแแแแ แฌแแแแแก แแแแแกแแชแแแแ"
แแแแแแแแ BPF แแแ แขแฃแแแฃแ แ แแแแฅแแแ แแแ แซแแแแแก แแแแแแแแ แแแแก แแ แแฅแขแแฃแ แแ แแแแแแงแแแแแ แแ แแฅแขแแแแจแ, แฉแแแ แแฅแแแแแแแก แแแแ แแแแแ แกแขแแขแแ, แกแแแแช แแฆแฌแแ แแแแ แแแกแ แซแแ แแแแแ แแแฎแแกแแแแแแแแแ แแ แแแแแแแแ แ แแแแแแแ แแแแ.
แแแแ แฌแแแแแก แแแแแแแแแแแจแ, แแ แแแ แแแแ แแแแก แแแกแขแ แฃแแแแขแแแแ แแ แขแแฅแแแแแ แแแแแแแ แแแแฃแแแ แแแ Linux-แแก แแแ แแแแก แจแแแฆแฃแแแแแแก แแแแแแแกแแชแแแกแแแแก แแ แจแแแแฎแแแแแแจแ, แ แแแแกแแช แกแแญแแ แแ แแแฆแแแ แฎแแ แแกแฎแแก แแแแแขแแก แแแแฃแจแแแแแ. แแ แขแแแแก แแ แ-แแ แ แงแแแแแแ แแแแฃแแแ แฃแ แแแแแแก แ.แฌ แซแแ แแแแแ แจแแแแแแแแ (แแแ แแแแ แจแแแแแแแแ) แแ แกแแจแฃแแแแแแก แแซแแแแ, แแแแแขแแแแ แแแ แแแแก แฅแกแแแฃแ แ แคแแแ, แจแแแกแ แฃแแแก แงแแแแ แแแแแขแแก แแแแฃแจแแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแแแ. แแแ แแแแก แแแแ แแแก แแแแแ แแกแแแ แฎแแแแ แฅแกแแแแก แแแ แแแแก แแแ แแแ แแแแฎแแแ แแแแแก แกแแแ แชแ. แกแฎแแ แกแแขแงแแแแแ แ แแ แแแฅแแแ, แฅแกแแแแก แแแ แแแแแ แแฃแจแแแแแกแแก แฉแแแ แแแแแแแแ แแ แแแแแ แก แแแแฎแแแ แแแแแก แกแแแ แชแ.
แฅแกแแแแก แแแ แแแแก แกแ แฃแแ แแแแขแ แแแแก แแแแฎแแแ แแแแแก แกแแแ แชแแก แแ แแแ แแแแแ แแแแแชแแแแ, แฉแแแ แแแแชแแ แแแ แแแ แแแแก แแแแแแแแแก (แแแแขแแฅแกแขแแก แแแแแแ แแแแแแแ, แฅแกแแแแก แคแแแแก แแแแฃแจแแแแแ, แจแแคแแ แฎแแแแแ แแ แ.แจ.), แ แแช แกแแแแแแ แแแแจแแแแแแแแแแ 10 แแ/แฌแ แกแแฉแฅแแ แแ แแฃแจแแแแแกแแก. แฃแคแ แ แแแฆแแแ. แแแ แแแแก แแแแ แแแก แแแแแ, แแแฃแก แกแฎแแ แคแฃแแฅแชแแแแแก แแแแแแแแชแแ (แแแ แขแแฃแแ แแแแฃแจแแแแแ) แแ แจแแกแ แฃแแแแแก แคแ แแฎแแแแ แ แแแฃแแแ แแแ (NUMA แแฃแฆแแแขแแ แแ, CPU แแแแแแชแแแแ แ.แจ.) แจแแแกแแแแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแก แแแฆแแแ แฎแแ แแกแฎแแก แฅแกแแแแก แกแแคแฃแซแแแแแก. แจแแกแแซแแแ แแแแแขแแแแก แแแแฃแจแแแแแแก แแ แแฎแแแ แแแแแแแแก แกแแแแแแแแแ แแแแแแแแแ
แแแแฎแแแ แแแแแก แกแแแ แชแแจแ แฅแกแแแฃแ แ แฃแ แแแแ แแฅแแแแแแแก แแ แแแแแแแแแก แแฅแแก แแแแแ แ แแแ แฃแแ แงแแคแแแ แแฎแแ แแแแ:
- OS แแแ แแแ แแ แแก แแแกแขแ แแฅแชแแแก แคแแแ แขแแฅแแแแแก แ แแกแฃแ แกแแแแกแแแแก. แแแแก แแแแ, แ แแ แแแแฎแแแ แแแแแก แกแแแ แชแแก แแ แแแ แแแแแแ แฃแจแฃแแแแ แฃแแแ แแแ แแแ แแแแแแแแ แ แแกแฃแ แกแแแ, แแแ แแกแแแ แฃแแแ แแแ แแแ แกแแแฃแแแ แ แแแแ แแขแฃแ แ. แแก แฎแจแแ แแ แแแจแแแแก แกแแแฃแแแ แ แแ แแแแแ แแแแก แแแแ แแแ แแแแแแก.
- แแแก แจแแแแแ, แ แแช แฉแแแ แแแแแแแแ แแฃแแแแแ แแแ แแแแก แกแแแ แชแแก, แฉแแแ แแกแแแ แฃแแ แก แแแแแแแ แแแ แแแแก แแแแ แแแฌแแแแแฃแ แฅแกแแแแก แงแแแแ แคแฃแแฅแชแแแแ. แแแแฎแแแ แแแแแแ แกแแแ แชแแก แแ แแแ แแแแแแ แฎแแแแฎแแ แฃแแแ แแแแแฎแแ แชแแแแแ แคแฃแแฅแชแแแแ, แ แแแแแแแช แจแแแซแแแแ แฃแแแ แฃแแ แฃแแแแแงแแคแแแ แแงแแก แแแ แแแแก แแ แแแแ แแชแแฃแแ แกแแกแขแแแแก แแแแ .
- แแ แแแ แแแแแ แแฃแจแแแแก sandbox แ แแแแแจแ, แ แแช แกแแ แแแแฃแแแ แแฆแฃแแแแก แแแ แฃแ แแแแ แแฅแแแแแแแก แแ แฎแแแก แฃแจแแแก แแแ แแแขแแแ แแ แแแแก แแแแ แแชแแฃแแ แกแแกแขแแแแก แกแฎแแ แแแฌแแแแแแแ.
แแ แกแแแแแแ, แแแแฎแแแ แแแแแก แกแแแ แชแแจแ แฅแกแแแจแ แฉแแ แแแแกแแก, แจแแกแ แฃแแแแแก แแแฃแแฏแแแแกแแแ แแแแฆแฌแแแ แแแแแขแแก แแแแฃแจแแแแแแก แแแ แแแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแจแ แแแแแแแแแแแแแ. XDP แแแแแแแก แแฃแกแขแแ แกแแแแ แแกแแแ แแก: แแก แแแแแแฅแแก แฅแกแแแแก แแ แแแ แแแแแก แแแแฎแแแ แแแแแก แกแแแ แชแแแแ (แคแแแขแ แแแ, แแแแแแงแแแแแแ, แแแ แจแ แฃแขแแแแชแแ แแ แ.แจ.) แแแ แแแแก แแแแแจแ. XDP แกแแจแฃแแแแแแก แแแแซแแแแก แจแแแแกแ แฃแแแ แฅแกแแแแก แคแฃแแฅแชแแ, แ แแแแ แช แแ แแแแแขแ แแแฎแแแแแ แฅแกแแแแก แแแขแแ แคแแแกแจแ แแ แกแแแแ แแแแฌแงแแแก แแแแแแฃแ แแแแก แแแ แแแแก แฅแกแแแแก แฅแแแกแแกแขแแแแแแ. แจแแแแแแ, แแแแแขแแก แแแแฃแจแแแแแแก แกแแฉแฅแแ แ แแแแจแแแแแแแแแ แแแแแแ แแ. แแฃแแชแ, แ แแแแ แแซแแแแก แแแ แแแ แแแแฎแแแ แแแแแก แกแแจแฃแแแแแแก แแแฃแจแแแก แแแแแกแ แแ แแแ แแแแแ แแแ แแแแก แกแแแ แชแแจแ? แแ แแแแฎแแแแ แแแกแฃแฎแแก แแแชแแแแแแ แแแแแ แจแแแฎแแแแ แ แ แแ แแก BPF.
BPF แแ eBPF
แแแแแ แแแแคแแ แกแแฎแแแแก แแแฃแฎแแแแแแ, BPF (Packet Filtering, Berkeley) แแ แแก, แคแแฅแขแแแ แแแแ, แแแ แขแฃแแแฃแ แ แแแแฅแแแแก แแแแแแ. แแก แแแ แขแฃแแแฃแ แ แแแแฅแแแ แแแแแแแแ แแแแแ แจแแฅแแแแแ แแงแ แแแแแขแแแแก แคแแแขแ แแชแแแกแแแแก, แแฅแแแแ แแแแแแแแ แแแแก แกแแฎแแแ.
BPF-แแก แแแแแงแแแแแแ แแ แ-แแ แแ แงแแแแแแ แชแแแแแแ แแแกแขแ แฃแแแแขแแ tcpdump
. แแแแแขแแแแก แแฆแแแแกแแก tcpdump
แแแแฎแแแ แแแแแก แจแแฃแซแแแ แแแฃแแแแแก แแแแแฎแแขแฃแแแแ แแแแแขแแก แคแแแขแ แแชแแแกแแแแก. แแฎแแแแ แแแแแขแแแ, แ แแแแแแแช แแแแฎแแแแ แแ แแแแแแแแฅแแแแก, แแฅแแแแ แแฆแแแญแแแแ. แแแแแแแแแ, แแแแแแฅแแ "tcp dst port 80
โ แแฎแแแ แงแแแแ TCP แแแแแขแก, แ แแแแแแช แฉแแแแแแก แแแ แขแจแ 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 แแแ แขแฃแแแฃแ แ แแแแฅแแแ แแ แแแกแ แแแแขแแแแแ แจแแแแแแแแแแแแก แกแขแแ แแแแแแแแ แแ แแแ แฏแแแแแแกแแแแ 1992 แฌแแแก แแแแแก, แ แแแแกแแช แแแแ แแแจแ แแแ แแแแแแแแ.
แแแแก แแแแ, แ แแ BPF แแ แแก แแแ แขแฃแแแฃแ แ แแแแฅแแแ, แแก แแแแกแแแฆแแ แแแก แแแ แแแแก, แ แแแแแจแแช แแ แแแ แแแแแ แแฃแจแแแแก. แแแ แแ แแแแขแแแแแแกแ, แแก แแกแแแ แแแแกแแแฆแแ แแแก แแแแแขแแก แแแฎแกแแแ แแแแก แแแแแแก (แฉแแขแแแ แแแแก แแแกแขแ แฃแฅแชแแแแ แแ แแแแ แแแแแแงแแแแแ แแแแแขแแ), แ แแแแกแขแ แแแก (A แแ X; แแแฃแแฃแแแขแแ แ แแ แแแแแฅแกแแก แ แแแแกแขแ แแแ), แแแแแฌแ แแก แแแฎแกแแแ แแแแก แกแแชแแแ แแ แแแแแแชแแขแฃแ แ แแ แแแ แแแแก แแ แแชแฎแแแแ. แกแแแแขแแ แแกแแ, แ แแ BPF แแแแขแแแแแ แแแแแแแ แแแฃแแแ Motorola 6502 ISA-แก แแแฎแแแแแ. แ แแแแ แช แกแขแแ แแแแแแแ แแฎแกแแแแแแ แแแแแก
BPF แแฎแแ แแแญแแ แ แแแแฎแแ แชแแแแแแฃแแแ Linux-แแก แแแ แแแจแ v2.5 แแ แฃแคแ แ แแแแแ แแแ แกแแแจแ, แ แแแแแแช แแแแแขแแแฃแแแ แซแแ แแแแแแ แฏแแ แจแฃแแแขแแก แแแแ . BPF แแแแ แฃแชแแแแแ แแแ แฉแ 2011 แฌแแแแแ, แ แแแแกแแช แแ แแ แแแฃแแแกแแขแแ แแแแแแคแแ แแ BPF แแแ แฏแแแแแ JIT แ แแแแแจแ แแฃแจแแแแแกแแแแก (แฌแงแแ แ:
แแแแแแแแแแแ, 2014 แฌแแแก, แแแแฅแกแแ แกแขแแ แแแแแขแแแแ แจแแกแแแแแแ แแฎแแแ JIT แแแฅแแแแแแ BPF-แกแแแแก. แกแแแแแแแแแแจแ, แแก แแฎแแแ JIT แแแฎแแ แแฎแแแ แแ แฅแแขแแฅแขแฃแ แ, แ แแแแแแช แแแคแฃแซแแแแฃแแแ BPF-แแ แแ แแฌแแแ eBPF. แแคแแฅแ แแ, แแ แแแ VM แแแแแแ แกแแแแแแ แแแ แแแแฃแแ แแ แแแก แแแแแแแแแแแจแ, แแแแ แแ แแแแแขแแก แคแแแขแ แแชแแ แแแแแแแ แแแแแ แแแแแ eBPF-แแก แแแแแ. แกแแแแแแแแแแจแ, แแแแ แแแแแแแแ แแแ แแแแฃแแแแขแแชแแแก แแแแแแแแจแ, BPF แแแแฎแกแแแแแแ แ แแแแ แช eBPF, แฎแแแ แแแแกแแแฃแ แ BPF แแฆแแก แชแแแแแแแ แ แแแแ แช cBPF.
eBPF แแคแแ แแแแแก แแแแกแแแฃแ BPF แแแ แขแฃแแแฃแ แแแแฅแแแแก แ แแแแแแแแ แแแแ:
- แแงแ แแแแแ แแแแแแแแ แแแ 64-แแแขแแแ แแ แฅแแขแแฅแขแฃแ แแแก. eBPF แแงแแแแแก 64-แแแขแแแ แ แแแแกแขแ แแแก แแ แแ แแแก แฎแแแแแกแแฌแแแแแ แ แแแแกแขแ แแแแก แ แแแแแแแแแก 2-แแแ (แแแฃแแฃแแแขแแ แ แแ X) 10-แแแ. eBPF แแกแแแ แฃแแ แฃแแแแแงแแคแก แแแแแขแแแแ แแแแแแแแก (BPF_MOV, BPF_JNE, BPF_CALLโฆ).
- แแแฌแงแแแขแแแแ แฅแกแแแแก แคแแแแก แฅแแแกแแกแขแแแแแแ. BPF แแงแ แแแแแฃแแ แกแฃแ แแแแแแก แแแแแชแแแแ แแแแแแแแ. แแแแแแแแ แแแ แแแแแแงแแแแแแแ แแแแแขแแแแก แแแกแแคแแแขแ แแ, แแแกแ แแแแ แแงแ แฅแแแกแแกแขแแแแจแ, แ แแแแแแช แฃแแ แฃแแแแแงแแคแแ แฅแกแแแฃแ แฃแ แแแแ แแฅแแแแแแแแก. แแฃแแชแ, eBPF แแแ แขแฃแแแฃแ แ แแแแฅแแแ แแฆแแ แแ แแก แแแแแแจแแ แแแฃแแ แแแแแชแแแแ แแแแแแแแ แแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แแแแแกแแแแ แ แแแแแแกแแแแก. แแกแ แ แแ, แแฎแแ eBPF แแ แแแ แแแ แจแแแซแแแแ แแแฃแแแแจแแ แแแก tracepoint-แก แแ kprobe-แก. แแก แฎแกแแแก แแแ แก eBPF แแแกแขแ แฃแแแแขแแชแแแกแแแแก, แจแแกแ แฃแแแแแก แแแแแแแแกแ แแ แแ แแแแแ แกแฎแแ แแแแแงแแแแแแก แจแแแแฎแแแแแกแแแแก แกแฎแแ แแแ แแแแก แฅแแแกแแกแขแแแแแแก แแแแขแแฅแกแขแจแ. แแฎแแ eBPF แแแแ แแแแแแ แแแแก แกแแแฃแแแ แแแแแ: kernel/bpf.
- แแแแแชแแแแ แแแแแแแฃแ แ แแแฆแแแแแแ แกแแฎแแแฌแแแแแแ Maps. แ แฃแแแแ แแ แแก แกแแแแแแซแ แแแแจแแแแแแแแก แแแฆแแแแแแ, แ แแแแแแแช แฃแแ แฃแแแแแงแแคแแ แแแแแชแแแแ แแแชแแแแก แแแแฎแแแ แแแแแก แกแแแ แชแแกแ แแ แแแ แแแแก แกแแแ แชแแก แจแแ แแก. eBPF แแแแแแแแแ แ แแแแแแแแ แกแแฎแแก แแแ แแแก.
- แแแแ แแแ แคแฃแแฅแชแแแแ. แแแ แซแแ, แแแแแขแแก แแแแแกแแฌแแ แแ, แกแแแแแขแ แแแ แฏแแแแก แแแแแแแแ แแ แแแแแขแแก แแแแแแ แแแ. แแก แคแฃแแฅแชแแแแ แแฃแจแแแแก แแแ แแแแก แจแแแแแ แแ แแ แแแแแฃแแแแแแ แแแแฎแแแ แแแแแก แกแแแ แชแแก แแ แแแ แแแแแก. แแแ แแ แแแแกแ, แกแแกแขแแแฃแ แ แแแ แแแ แจแแแซแแแแ แแแแฎแแ แชแแแแแแก eBPF แแ แแแ แแแแแแแแ.
- แแแแกแ แฃแแแ แแแ แแแ. แแ แแแ แแแแก แแแแ eBPF-แจแ แจแแแฆแฃแแฃแแแ 4096 แแแแขแแ. แแแกแแกแ แฃแแแก แแแ แแก แคแฃแแฅแชแแ แกแแจแฃแแแแแแก แแซแแแแก eBPF แแ แแแ แแแแก แแแแแกแชแแก แแแแขแ แแแ แแฎแแ eBPF แแ แแแ แแแแก แแ แแแแ แแแแแแแฎแแก แแก แจแแแฆแฃแแแ (แแ แแแแ แจแแแซแแแแ 32-แแแ แแ แแแ แแแ แแงแแก แแแแแฃแแ).
eBPF แแแแแแแแ
Linux-แแก แแแ แแแแก แฌแงแแ แแแแจแ eBPF-แแก แ แแแแแแแแ แแแแแแแแแ. แแกแแแ แฎแแแแแกแแฌแแแแแแ แแแแฃแจแแแแ/bpf/. แแ แแแแแแแแแแแก แจแแกแแแแแแแ, แฃแแ แแแแ แฉแแฌแแ แแ:
$ sudo make samples/bpf/
แแ แแ แแแแฌแแ แแฎแแ แแแแแแแแก eBPF-แกแแแแก, แแแแ แแ แแแแแแแงแแแแ แแ แ-แแ แ แแแแฃแจแก, แ แแแแแแช แฎแแแแแกแแฌแแแแแแ samples/bpf/-แจแ. แแ แแแแแแฎแแแแ แแแแแก แแแแแแ แ แแแฌแแแก แแ แแแฎแกแแ แ แแแแ แแฃแจแแแแก. แแแแแแแแแ, แแ แแแแ แฉแแ แแ แแแ แแแ tracex4
.
แแแแแแแ, แแแแฃแจแแแจแ/bpf/ แแแแแแฃแแ แแแแแแแแ แจแแแแแแ แแ แ แคแแแแแกแแแ. แฒแ แจแแแแฎแแแแแจแ:
tracex4_kern.c
, แจแแแชแแแก แฌแงแแ แแก แแแแก, แ แแแแแแช แฃแแแ แจแแกแ แฃแแแแก แแแ แแแจแ, แ แแแแ แช eBPF แแแแขแแแแแ.tracex4_user.c
, แจแแแชแแแก แแ แแแ แแแแก แแแแฎแแแ แแแแแก แกแแแ แชแแแแ.
แแ แจแแแแฎแแแแแจแ, แฉแแแ แแแญแแ แแแแ แแแแแแแแชแแ tracex4_kern.c
eBPF แแแแขแแแแแแแแ. แแ แแแแแแขแจแ, gcc
แแ แแ แกแแแแแก แกแแ แแแ แแก แแแฌแแแ eBPF-แกแแแแก. แกแแแแแแแแ แแ, clang
แจแแฃแซแแแ แแฌแแ แแแแก eBPF แแแแขแแแแแ.
แแงแแแแแก 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
). แแแแแ แฃแแ แแกแแแแแ แแแฌแแ แแแ แงแแแแ แคแฃแแฅแชแแแก แกแแฎแแแ แจแแแกแแแแแแแ แแแแกแแแฆแแ แฃแ แแแแ แแก
.
แแฃ แแแแแฅแขแแก แคแแแแแก แกแแฅแชแแแแก แแแแแแงแ แ, แฃแแแ แแแแแแแฎแ, แ แแ แแก แแฎแแแ แกแแฅแชแแแแ แฃแแแ แแแแกแแแฆแแ แฃแแแ:
$ 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
แฒแ แกแแแแแก แแกแแแ
, แแแแแแ แ แแ แแแ แแแ. แซแแ แแแแแแ, แแก แแ แแแ แแแ แฃแกแแแแก แแแแแแแแแก 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;
}
แแแแแแแก แแ แแก
แแแแขแแแ 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-แแก แจแแกแแฎแแ แฏแฃแแแ แแแแแกแ. แแแแแแขแแ แแแ Suchakra Sharma-แก แแ แแแแแขแแชแแแแ โBSD Packet Filter: A New Architecture for User-level Packet Captureโ. แแแแแแขแแ แแแ แแแ แแแ แแ แแแแแแแแแ แแแแฎแแแ แแแ แกแแแแแแแแก แแแแแแแจแ.eBPF, แแแฌแแแ 1: แฌแแ แกแฃแแ, แแฌแแงแ แแ แแแแแแแแ แคแแ แแก แแแแกแ. แแแแ แฎแแแก แแแแแแแแแแแจแแแแแ แซแแแแแ แแแแ แแ แฆแแ แก แฌแแแแแฎแแ. แแ แ-แแ แแ แกแแฃแแแแแกแ eBPF แกแขแแขแแ, แ แแแแแแช แแ แจแแแฎแแแแ แแ.
แฌแงแแ แ: www.habr.com