เบชเบฐเบเบฒเบเบเบต, Habr! เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเปเบเปเบเปเบซเปเบเปเบฒเบเบฎเบนเปเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเบเบฐเบเบฝเบกเบซเบเบฑเบเบชเบทเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบญเบ."
เบเบฑเบเบเบฑเปเบเปเบเปเปเบเบทเปเบญเบ virtual BPF เบชเบทเบเบเปเปเบเบฑเบเบเบฐเบเบฒเปเบฅเบฐเบเบทเบเบเปเบฒเปเบเปเบขเปเบฒเบเบเบดเบเบเบฑเบเปเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบเบเบปเบเบเบงเบฒเบกเบเบตเปเบญเบฐเบเบดเบเบฒเบเปเบเบดเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบปเปเบเบเปเปเบฅเบฐเบชเบฐเบเบฒเบเบฐเปเบเบเบฐเบเบธเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเปเบฒเบ.
เปเบเบเบธเบกเบเบตเบกเปเปเปเบกเบฒเบเบตเป, เปเบเบทเปเบญเบเบกเบทเปเบฅเบฐเปเบเบฑเบเบเบดเบเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเปเบเปเบเบฒเบเปเบเบฑเบเบเบตเปเบเบดเบเบปเบกเบซเบฅเบฒเบเบเบถเปเบเปเบเบทเปเบญเบเบปเบเปเบเบตเบเบเปเปเบเปเบฒเบเบฑเบเบเบญเบ Linux kernel เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเปเบญเบเบเบฒเบเบเบฒเบเบเบธเบเปเบเปเบเปเบเบฑเบเปเบเบฑเบเบเบตเปเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเบชเบนเบ. เบซเบเบถเปเบเปเบเปเบเบฑเบเบเบดเบเบเบตเปเบเบดเบเบปเบกเบเบตเปเบชเบธเบเบเบญเบเบเบฐเปเบเบเบเบตเปเปเบกเปเบเปเบญเบตเปเบเบงเปเบฒ เบเปเบฒเบก kernel (kernel bypass) เปเบฅเบฐเบญเบฐเบเบธเบเบฒเบเปเบซเป, bypassing เบเบฑเปเบเปเบเบทเบญเบเปเบฒเบ kernel, เปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบฐเบกเบงเบเบเบปเบ packet เบเบฑเบเบซเบกเบปเบเบเบฒเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป. Bypassing kernel เบเบฑเบเบเปเบฝเบงเบเปเบญเบเบเบฑเบเบเบฒเบเบเบงเบเบเบธเบกเบเบฑเบเปเบเบทเบญเบเปเบฒเบเบเบฒเบ เบเบทเปเบเบเบตเปเบเบนเปเปเบเป. เปเบเบเปเบฒเบชเบฑเบเบเปเบฒเบเปเบญเบทเปเบเป, เปเบกเบทเปเบญเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบเบฑเบเปเบเบทเบญเบเปเบฒเบ, เบเบงเบเปเบฎเบปเบฒเบญเบตเบเปเบชเปเบเบปเบเบเบฑเบ เบเบทเปเบเบเบตเปเบเบนเปเปเบเป.
เปเบเบเบเบฒเบเปเบญเบเบเบฒเบเบเบงเบเบเบธเบกเบญเบฑเบเปเบเบฑเบกเบเบตเปเบเบญเบเบเบฑเบเปเบเบทเบญเบเปเบฒเบเปเบเบซเบฒเปเบเบเบเบฒเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป, เบเบงเบเปเบฎเบปเบฒเบซเบผเบธเบเบเปเบญเบ kernel overhead (เบเบฒเบเบเปเบฝเบเบชเบฐเบเบฒเบเบเบฒเบ, เบเบฒเบเบเบธเบเปเบเปเบเบเบฑเปเบเปเบเบทเบญเบเปเบฒเบ, เบเบฒเบเบเบฑเบเบเบงเบฒเบ, เปเบฅเบฐเบญเบทเปเบเป), เปเบเบดเปเบเบกเบตเบเบงเบฒเบกเบชเปเบฒเบเบฑเบเบซเบผเบฒเบเปเบกเบทเปเบญเปเบฅเปเบเบเปเบงเบเบเบงเบฒเบกเปเบง 10Gb / s เบซเบผเบทเบชเบนเบเบเบงเปเบฒ. Kernel bypass เบเบงเบเบเบฑเบเบเบฒเบเบเบฐเบชเบปเบกเบเบฐเบชเบฒเบเบเบญเบเบฅเบฑเบเบชเบฐเบเบฐเบญเบทเปเบเป (เบเบฒเบโเบเบธเบโเปเบเปเบ batchโ) เปเบฅเบฐโเบเบฒเบโเบเบฑเบโเบเบฐโเบเบดโเบเบฑเบโเบขเปเบฒเบโเบฅเบฐโเบกเบฑเบโเบฅเบฐโเบงเบฑเบ (เบเบฑเบเบเบต NUMA, เบเบฒเบเปเบเบ CPU, เปเบฅเบฐเบญเบทเปเบเป) เบชเบญเบเบเปเบญเบเบเบฑเบเบเบทเปเบเบเบฒเบเบเบญเบเบเบฒเบเบเบฐเบกเบงเบเบเบปเบเปเบเบทเบญเบเปเบฒเบเบเบตเปเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเบชเบนเบเปเบเบเบทเปเบเบเบตเปเบเบญเบเบเบนเปเปเบเป. เบเบฒเบเบเบตเบเบปเบงเบขเปเบฒเบเบเบตเปเปเบเบฑเบเบเบปเบงเบขเปเบฒเบเบเบญเบเบงเบดเบเบตเบเบฒเบเปเบซเบกเปเปเบเบเบฒเบเบเบธเบเปเบเปเบเปเบเบฑเบเปเบเบฑเบเปเบกเปเบ
เบเบฒเบโเบเบฑเบโเบเบฑเปเบโเบเบฒเบโเบเบปเบงโเบเบฑเบโเปเบเบทเบญโเบเปเบฒเบโเปเบโเบเบทเปเบโเบเบตเปโเบเบนเปโเปเบเปโเบกเบตโเบเปเปโเปเบชเบโเบเปเบฒโเบเบงเบโเบซเบเบถเปเบโ:
- OS kernel เปเบกเปเบเบเบฑเปเบ abstraction เบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบฎเบฒเบเปเบง. เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเปเบเบเบเบฒเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเปเบเปเบญเบเบเบฑเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบเบเบเบปเบ, เบเบงเบเปเบเบปเบฒเบเบฑเบเบเปเบญเบเบเบฑเบเบเบฒเบเบฎเบฒเบเปเบงเบเบญเบเบเบปเบเปเบญเบ. เบเบตเปเบกเบฑเบเบเบฐเบซเบกเบฒเบเปเบเบดเบเบเบฒเบเบเปเบฒเปเบเบตเบเปเบเบเบเบฒเบเปเบเปเบงเบตเบเบญเบเบเปเบฒเบเปเบญเบ.
- เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเบเบฐเบเบดเปเบกเบเบทเปเบเบเบตเป kernel เบเบฑเบเบซเบกเบปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเบปเบเปเบฅเบตเบเบเบฒเบเบเปเบฒเบเบฒเบเบเบญเบเปเบเบทเบญเบเปเบฒเบเบเบฑเบเบซเบกเบปเบเบเบตเปเบชเบฐเบซเบเบญเบเปเบซเปเปเบเบ kernel. เปเบเบฅเปเบเบฅเบกเบเบทเปเบเบเบตเปเบเบนเปเปเบเปเบเปเบญเบเบเบฐเบเบดเบเบฑเบเบเบธเบเบชเบปเบกเบเบฑเบเปเบซเบกเปเบเบตเปเบญเบฒเบเบเบฐเบชเบฐเบซเบเบญเบเปเบซเปเปเบเบ kernel เบซเบผเบทเบฅเบฐเบเบปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบ.
- เบเบฑเบเบเบฒเปเบเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบขเบนเปเปเบเปเบซเบกเบ sandbox, เปเบเบดเปเบเบเปเบฒเบเบฑเบเบเบฒเบเปเบเปเบเบญเบเบเบญเบเบเบงเบเปเบเบปเบฒเบขเปเบฒเบเบเบดเบเบเบฑเบเปเบฅเบฐเบเปเบญเบเบเบฑเบเบเปเปเปเบซเปเบเบงเบเปเบเบปเบฒเบเบฐเบชเบปเบกเบเบฐเบชเบฒเบเบเบฑเบเบเบฒเบเบชเปเบงเบเบญเบทเปเบเปเบเบญเบเบฅเบฐเบเบปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบ.
เปเบเบเปเบเบทเปเบญเปเบเปเปเบฅเปเบง, เปเบเปเบงเบฅเบฒเบเบตเปเปเบเบทเบญเบเปเบฒเบเปเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป, เบเบปเบเบเบฐเปเบซเบเบเบเปเบฒเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเปเบกเปเบเบเบฑเบเบฅเบธเปเบเปเปเบเบเบเบฒเบเบเปเบฒเบเบเบฒเบเบเบธเบเปเบเปเบเปเบเบฑเบเปเบเบฑเบเบเบฒเบเปเบเปเบเปเบเบซเบฒเบเบทเปเบเบเบตเปเบเบนเปเปเบเป. XDP เปเบฎเบฑเบเบเบปเบเบเบฑเบเบเปเบฒเบกเบขเปเบฒเบเปเบเปเบเบดเบ: เบกเบฑเบเบเปเบฒเบเปเบเบเบเบฒเบเปเบเบทเบญเบเปเบฒเบเบเบฒเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป (เบเบปเบงเบเบญเบ, เบเบปเบงเปเบเปเปเบ, เปเบชเบฑเปเบเบเบฒเบ, เปเบฅเบฐเบญเบทเปเบเป) เปเบเบปเปเบฒเปเบเปเบเบเบทเปเบเบเบตเปเปเบเปเบ. XDP เบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบเบดเบเบฑเบเบซเบเปเบฒเบเบตเปเปเบเบทเบญเบเปเบฒเบเบเบฑเบเบเบตเบเบตเปเปเบเบฑเบเปเบเบฑเบเบเบตเบเบฑเบเบเบฒเบเปเบเปเบเบญเบเปเบเบทเบญเบเปเบฒเบเปเบฅเบฐเบเปเบญเบเบเบตเปเบกเบฑเบเบเบฐเปเบฅเบตเปเบกเปเบเบทเปเบญเบเบเปเบฒเบเปเบเบชเบนเปเบฅเบฐเบเบปเบเบเปเบญเบเปเบเบทเบญเบเปเบฒเบ kernel. เบเบฑเปเบเบเบฑเปเบ, เบเบงเบฒเบกเปเบงเบเบฒเบเบเบธเบเปเบเปเบเปเบเบฑเบเปเบเบฑเบเปเบเบตเปเบกเบเบถเปเบเบขเปเบฒเบเบซเบผเบงเบเบซเบผเบฒเบ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, kernel เบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบนเปเปเบเปเบเบฐเบเบดเบเบฑเบเปเบเบเบเบฒเบเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒเบขเบนเปเปเบเบเบทเปเบเบเบตเป kernel เปเบเบงเปเบ? เบเปเบญเบเบเบตเปเบเบฐเบเบญเบเบเปเบฒเบเบฒเบกเบเบตเป, เปเบซเปเปเบเบดเปเบเบงเปเบฒ BPF เปเบกเปเบเบซเบเบฑเบ.
BPF เปเบฅเบฐ eBPF
เปเบเบดเบเบงเปเบฒเบเบฐเบกเบตเบเบทเปเบเบตเปเบชเบฑเบเบชเบปเบ, BPF (Berkeley Packet Filtering) เปเบกเปเบ, เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, เบฎเบนเบเปเบเบเปเบเบทเปเบญเบ virtual. เปเบเบทเปเบญเบ virtual เบเบตเปเปเบเปเบเบทเบเบญเบญเบเปเบเบเปเบเปเบเบทเปเบญเบเบเบปเปเบเปเบเบทเปเบญเบเบฑเบเบเบฒเบเบเบฑเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบ, เปเบเบฒเบฐเบชเบฐเบเบฑเปเบเบเบถเปเบเบกเบตเบเบทเป.
เบซเบเบถเปเบเปเบเปเบเบทเปเบญเบเบกเบทเบเบตเปเบกเบตเบเบทเปเบชเบฝเบเบเบตเปเบชเบธเบเบเบตเปเปเบเป BPF เปเบกเปเบ tcpdump
. เปเบกเบทเปเบญเบเบฑเบเปเบเบฑเบเปเบเบฑเบเปเบเบเปเบเป tcpdump
เบเบนเปเปเบเปเบชเบฒเบกเบฒเบเบฅเบฐเบเบธเบเบฒเบเบชเบฐเปเบเบเบญเบญเบเปเบเบทเปเบญเบเบฑเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบ. เบชเบฐเปเบเบฒเบฐเปเบเบฑเบเปเบเบฑเบเบเบตเปเบเบปเบเบเบฑเบเบเบฒเบเบชเบฐเปเบเบเบเบปเบเบเบตเปเบเบฐเบเบทเบเบเบฑเบเบเบถเบ. เบชเปเบฒเบฅเบฑเบเบเบปเบงเบขเปเบฒเบ, เบเปเบฒเบงเปเบฒ "tcp dst port 80
โ เปเบฒเบเปเบเบดเบเปเบเบฑเบเปเบเบฑเบ TCP เบเบฑเบเปเบปเบเบเบตเปเบกเบฒเบฎเบญเบเบเบญเบ 80. เบเบญเบกเบเบตเบงเปเบเบตเบชเบฒเบกเบฒเบเบซเบเปเปเบเบฒเบเบชเบฐเปเบเบเบญเบญเบเบเบตเปเปเบเบเบเบฒเบเบเปเบฝเบเปเบเบฑเบ BPF bytecode.
$ 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): เปเบซเบฅเบเปเบเบฑเบเปเบเบฑเบเบขเบนเปเบเบตเป offset 12, เปเบเบฑเบเบเปเบฒ 16-bit, เปเบเบปเปเบฒเปเบเปเบ accumulator. Offset 12 เปเบเบปเปเบฒเบเบฑเบ ethertype เบเบญเบเปเบเบฑเบเปเบเบฑเบ.
- เบเปเบฒเปเบเบฐเบเปเบฒ (001): เบเบฝเบเบเบฝเบเบเปเบฒเปเบ accumulator เบเบฑเบ 0x86dd, เบเบฑเปเบเปเบกเปเบ, เบเปเบงเบเบเปเบฒ ethertype เบชเปเบฒเบฅเบฑเบ IPv6. เบเปเบฒเบเบปเบเปเบเปเบฎเบฑเบเปเบกเปเบเบเบงเบฒเบกเบเบดเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เปเบเบฅเปเบเบฅเบก counter เปเบเบซเบฒเบเปเบฒเปเบเบฐเบเปเบฒ (002), เปเบฅเบฐเบเปเบฒเบเปเปเปเบกเปเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบเบซเบฒ (006).
- เบเปเบฒเปเบเบฐเบเปเบฒ (006): เบเบฝเบเบเบฝเบเบเปเบฒเบเบฑเบ 0x800 (เบเปเบฒ ethertype เบชเปเบฒเบฅเบฑเบ IPv4). เบเปเบฒเบเปเบฒเบเบญเบเปเบกเปเบเบเบงเบฒเบกเบเบดเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบเบเบเบฒเบเบเบฐเปเบเบซเบฒ (007), เบเปเบฒเบเปเปเปเบกเปเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบเบซเบฒ (015).
เปเบฅเบฐเบญเบทเปเบเปเบเบปเบเบเปเบงเบฒเปเบเบเบเบฒเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบเบเบฐเบชเบปเปเบเบเบทเบเบเบปเบเปเบเปเบฎเบฑเบ. เบเบปเบเบเบฐเบเบดเปเบฅเปเบงเบเบตเปเปเบกเปเบ Boolean. เบเบฒเบเบชเบปเปเบเบเบทเบเบเปเบฒเบเบตเปเบเปเปเปเบกเปเบเบชเบนเบ (เบเปเบฒเปเบเบฐเบเปเบฒ (014)) เบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเปเบเบฑเบเปเบเบฑเบเบเบทเบเบเบญเบกเบฎเบฑเบ, เปเบฅเบฐเบเบฒเบเบชเบปเปเบเบเบทเบเบเปเบฒเบชเบนเบ (เบเปเบฒเปเบเบฐเบเปเบฒ (015)) เบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเปเบเบฑเบเปเบเบฑเบเบเปเปเปเบเปเบฎเบฑเบเบเบฒเบเบเบญเบกเบฎเบฑเบ.
เปเบเบทเปเบญเบ virtual BPF เปเบฅเบฐ bytecode เปเบเปเบเบทเบเบชเบฐเปเบซเบเบตเปเบเบ Steve McCann เปเบฅเบฐ Van Jacobson เปเบเบเปเบฒเบเบเบต 1992 เปเบกเบทเปเบญเปเบญเบเบฐเบชเบฒเบเบเบญเบเบเบงเบเปเบเบปเบฒเบเบทเบเบเบตเบเบดเบก.
เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ BPF เปเบเบฑเบเปเบเบทเปเบญเบ virtual, เบกเบฑเบเบเปเบฒเบเบปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเบเบตเปเปเบเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบ. เบเบญเบเปเบซเบเบทเบญเปเบเบเบฒเบ bytecode, เบกเบฑเบเบเบฑเบเบเปเบฒเบเบปเบเบฎเบนเบเปเบเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒ batch (เบเปเบฒเปเบเบฐเบเปเบฒเบเบฒเบเปเบซเบผเบเปเบเปเบเบทเบเบเปเบฒเปเบเป implicitly เบเบฑเบ batch), เบฅเบปเบเบเบฐเบเบฝเบ (A เปเบฅเบฐ X; accumulator เปเบฅเบฐเบเบฑเบเบชเบฐเบเบต), เบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒ scratch, เปเบฅเบฐเบเบปเบงเบเปเบฒเบเปเบเบเบเบฒเบ implicit. เบซเบเปเบฒเบชเบปเบเปเบ, BPF bytecode เปเบเปเบเบทเบเบชเปเบฒเบเปเบเบเบเปเบฒเบฅเบญเบเบซเบผเบฑเบเบเบฒเบ Motorola 6502 ISA. เบเบฑเปเบเบเบตเป Steve McCann เบเบทเปเปเบงเปเปเบเบฅเบฒเบง
เบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบ BPF เปเบกเปเบเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบ Linux kernel เปเบเบฎเบธเปเบ v2.5 เปเบฅเบฐเบชเบนเบเบเบงเปเบฒ, เปเบเบตเปเบกเปเบเบเบชเปเบงเบเปเบซเบเปเปเบกเปเบเบเบงเบฒเบกเบเบฐเบเบฒเบเบฒเบกเบเบญเบ Jay Schullist. เบฅเบฐเบซเบฑเบ BPF เบเบฑเบเบเบปเบเบเปเปเบเปเบฝเบเปเบเบเบเบปเบเบเปเบงเบฒ 2011, เปเบกเบทเปเบญ Eric Dumaset เปเบเปเบญเบญเบเปเบเบเบเบปเบงเปเบเบเบฒเบชเบฒ BPF เบเบทเบเปเปเปเปเบเบทเปเบญเปเบฎเบฑเบเบงเบฝเบเปเบเบฎเบนเบเปเบเบ JIT (เปเบซเบผเปเบเบเปเปเบกเบนเบ:
เบเปเปเบกเบฒ, เปเบเบเบต 2014, Alexey Starovoitov เปเบเปเบชเบฐเปเบซเบเบตเบเบปเบเปเบ JIT เปเบซเบกเปเบชเปเบฒเบฅเบฑเบ BPF. เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, JIT เปเบซเบกเปเบเบตเปเปเบเปเบเบฒเบเปเบเบฑเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒ BPF เปเบซเบกเปเปเบฅเบฐเบเบทเบเปเบญเบตเปเบเบงเปเบฒ eBPF. เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบดเบเบงเปเบฒ VMs เบเบฑเบเบชเบญเบเบขเบนเปเบฎเปเบงเบกเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบงเบฅเบฒ, เปเบเปเบเบฐเบเบธเบเบฑเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบเบเบญเบตเบเปเบชเป eBPF. เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, เปเบเบซเบผเบฒเบเปเบเบปเบงเบขเปเบฒเบเบเบญเบเปเบญเบเบฐเบชเบฒเบเบเบตเปเบเบฑเบเบชเบฐเปเบซเบก, BPF เปเบกเปเบเปเบเบปเปเบฒเปเบเบงเปเบฒ eBPF, เปเบฅเบฐ BPF เบเบฅเบฒเบชเบชเบดเบเปเบกเปเบเปเบเบฑเบเบเบตเปเบฎเบนเปเบเบฑเบเปเบเบกเบทเปเบเบตเปเบงเปเบฒ cBPF.
eBPF เบเบฐเบซเบเบฒเบเปเบเบทเปเบญเบ virtual BPF เบเบฅเบฒเบชเบชเบดเบเปเบเบซเบผเบฒเบเบงเบดเบเบต:
- เบญเบตเบเปเบชเปเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒ 64-bit เบเบตเปเบเบฑเบเบชเบฐเปเบซเบก. eBPF เปเบเปเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบ 64-bit เปเบฅเบฐเปเบเบตเปเบกเบเปเบฒเบเบงเบเบเบฒเบเบฅเบปเบเบเบฐเบเบฝเบเบเบตเปเบกเบตเบขเบนเปเบเบฒเบ 2 (accumulator เปเบฅเบฐ X) เปเบเบฑเบ 10. eBPF เบเบฑเบเบชเบฐเบซเบเบญเบ opcodes เปเบเบตเปเบกเปเบเบตเบก (BPF_MOV, BPF_JNE, BPF_CALL ... ).
- เปเบเบเบญเบญเบเบเบฒเบเบฅเบฐเบเบปเบเบเปเบญเบเบเบฑเปเบเบเปเปเบกเบนเบเปเบเบทเบญเบเปเบฒเบ. BPF เปเบเปเบเบทเบเบเบนเบเบกเบฑเบเบเบฑเบเบเบปเบงเปเบเบเบเปเปเบกเบนเบ batch. เปเบเบทเปเบญเบเบเบฒเบเบกเบฑเบเบเบทเบเบเปเบฒเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบ, เบฅเบฐเบซเบฑเบเบเบญเบเบกเบฑเบเบขเบนเปเปเบเบฅเบฐเบเบปเบเบเปเบญเบเบเบตเปเบชเบฐเบซเบเบญเบเบเบฒเบเบชเบทเปเบชเบฒเบเปเบเบทเบญเบเปเบฒเบ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเบทเปเบญเบ virtual eBPF เบเปเปเปเบเปเบเบดเบเบเบฑเบเบเบปเบงเปเบเบเบเปเปเบกเบนเบเบญเบตเบเบเปเปเปเบเปเบฅเบฐเบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเปเบเปเปเบเบทเปเบญเบเบธเบเบเบฐเบชเบปเบเปเบเบเปเปเบเบฒเบก. เบเบฑเปเบเบเบฑเปเบ, เปเบเบเบฑเบเบเบธเบเบฑเบเปเบเบเบเบฒเบ eBPF เบชเบฒเบกเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฑเบ tracepoint เบซเบผเบท kprobe. เบเบตเปเปเบเบตเบเบเบฒเบเปเบเบชเบนเปเปเบเบทเปเบญเบเบกเบท eBPF, เบเบฒเบเบงเบดเปเบเบฒเบฐเบเบฐเบชเบดเบเบเบดเบเบฒเบ, เปเบฅเบฐเบซเบผเบฒเบเปเบเปเบฅเบฐเบเบตเบเบฒเบเบเปเบฒเปเบเปเปเบเบชเบฐเบเบฒเบเบเบฒเบเบเบญเบเบฅเบฐเบเบปเบเบเปเบญเบ kernel เบญเบทเปเบเป. เปเบเบเบฑเบเบเบธเบเบฑเบเบฅเบฐเบซเบฑเบ eBPF เปเบกเปเบเบขเบนเปเปเบเปเบชเบฑเปเบเบเบฒเบเบเบญเบเบเบปเบเปเบญเบ: kernel / bpf.
- เบเปเบญเบเปเบเบฑเบเบเปเปเบกเบนเบเบเบปเปเบงเปเบฅเบเปเบญเบตเปเบเบงเปเบฒเปเบเบเบเบตเป. เปเบเบโเบเบตเปโเปเบเบฑเบโเบเปเบญเบโเปเบเบฑเบโเบเปเปโเบกเบนเบโเบเบตเปโเบกเบตโเบเบธเบโเบเปเบฒโเบเบตเปโเปเบฎเบฑเบโเปเบซเปโเบเบฒเบโเปเบฅเบโเบเปเบฝเบโเบเปเปโเบกเบนเบโเบฅเบฐโเบซเบงเปเบฒเบโเบเบทเปเบโเบเบตเปโเบเบนเปโเปเบเปโเปเบฅเบฐโเบเปเบญเบ kernelโ. eBPF เบชเบฐเปเบญเบเปเบเบเบเบตเปเบซเบผเบฒเบเบเบฐเปเบเบ.
- เบซเบเปเบฒเบเบตเปเบฎเบญเบ. เปเบเบเบชเบฐเปเบเบฒเบฐ, เปเบเบทเปเบญเบเบฝเบเบเบธเบเปเบซเบกเป, เบเบดเบเปเบฅเป checksum, เบซเบผเบท clone เบเบธเบ. เบเบฑเบเบเบฑเบเปเบซเบผเบปเปเบฒเบเบตเปเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฒเบเปเบ kernel เปเบฅเบฐเบเปเปเปเบกเปเบเปเบเบเบเบฒเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป. เบเบญเบเบเบฑเปเบเบเปเบฒเบเบเบฑเบเบชเบฒเบกเบฒเบเปเบเบซเบฒเบฅเบฐเบเบปเบเบเบฒเบเปเบเบเบเบฒเบ eBPF.
- เบชเบดเปเบเบชเบธเบเบเบฒเบเปเบ. เบเบฐเบซเบเบฒเบเบเบญเบเปเบเบฅเปเบเบฅเบกเปเบ eBPF เบเบทเบเบเปเบฒเบเบฑเบเบขเบนเปเบเบตเป 4096 bytes. เบเบธเบเบเบฐเบชเบปเบกเบเบฑเบเบเบฒเบเปเบเบซเบฒเบเบญเบฐเบเบธเบเบฒเบเปเบซเปเปเบเบเบเบฒเบ eBPF เปเบญเบเบเบฒเบเบเบงเบเบเบธเบกเปเบเบเบฑเบเปเบเบเบเบฒเบ eBPF เปเบซเบกเปเปเบฅเบฐเบเบฑเปเบเบเบฑเปเบเบเบถเปเบ bypass เบเปเปเบเปเบฒเบเบฑเบเบเบตเป (เปเบเบดเบ 32 เปเบเบเบเบฒเบเบชเบฒเบกเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเปเบงเบเบงเบดเบเบตเบเบตเป).
eBPF: เบเบปเบงเบขเปเบฒเบ
เบกเบตเบเบปเบงเบขเปเบฒเบเบเปเบฒเบเบงเบเบซเบเบถเปเบเบชเปเบฒเบฅเบฑเบ eBPF เปเบเปเบซเบผเปเบ Linux kernel. เบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเบกเบตเบขเบนเปเปเบเบเบปเบงเบขเปเบฒเบ / bpf /. เปเบเบทเปเบญเบฅเบงเบเบฅเบงเบกเบเบปเบงเบขเปเบฒเบเปเบซเบผเบปเปเบฒเบเบตเป, เบเบฝเบเปเบเปเปเบชเป:
$ sudo make samples/bpf/
เบเปเบญเบเบเบฐเบเปเปเบเบฝเบเบเบปเบงเบขเปเบฒเบเปเบซเบกเปเบชเปเบฒเบฅเบฑเบ eBPF เบเบปเบงเปเบญเบ, เปเบเปเบเบฐเปเบเปเบซเบเบถเปเบเปเบเบเบปเบงเบขเปเบฒเบเบเบตเปเบกเบตเบขเบนเปเปเบเบเบปเบงเบขเปเบฒเบ / bpf /. เบเปเบญเบเบเบฐเปเบเบดเปเบเบเบฒเบเบชเปเบงเบเบเบญเบเบฅเบฐเบซเบฑเบเปเบฅเบฐเบญเบฐเบเบดเบเบฒเบเบงเปเบฒเบกเบฑเบเปเบฎเบฑเบเบงเบฝเบเปเบเบงเปเบ. เบเบปเบงเบขเปเบฒเบ, เบเปเบญเบเปเบฅเบทเบญเบเปเบเบเบเบฒเบ tracex4
.
เปเบเบเบเบปเปเบงเปเบ, เปเบเปเบฅเบฐเบเบปเบงเบขเปเบฒเบเปเบเบเบปเบงเบขเปเบฒเบ / bpf / เบเบฐเบเบญเบเบเปเบงเบเบชเบญเบเปเบเบฅเป. เปเบโเบเปโเบฅเบฐโเบเบตโเบเบตเป:
tracex4_kern.c
, เบกเบตเบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบเบตเปเบเบฐเบเบทเบเบเบฐเบเบดเบเบฑเบเบขเบนเปเปเบ kernel เปเบเบฑเบ eBPF bytecode.tracex4_user.c
, เบกเบตเปเบเบเบเบฒเบเบเบฒเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป.
เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเบฅเบงเบเบฅเบงเบก tracex4_kern.c
เบเบฑเบ eBPF bytecode. เปเบเบเบฑเบเบเบธเบเบฑเบเบขเบนเปเปเบ gcc
เบเปเปเบกเบต backend เบชเปเบฒเบฅเบฑเบ eBPF. เปเบเบเบเบต, clang
เบชเบฒเบกเบฒเบเบญเบญเบ eBPF bytecode.
เบเบฒเบเบเปเบฒเปเบเป 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. เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบกเบฑเบเปเบเบฑเบเบเบฝเบเปเบเป hash. เบเปเบฒเบเบญเบฒเบเบเบฐเปเบเปเบชเบฑเบเปเบเบเปเบซเบฑเบเบเบฒเบเปเบเบชเบฐเบเบฒ 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
). เบเบทเปเบเบฑเบเบเบฑเบเบเบฑเบเปเบปเบเบเบตเปเบเบฝเบเบเปเบงเบเบเบปเบงเบเบดเบกเปเบซเบเปเปเบกเปเบเบเบปเบเบเบฑเบ macros เบเบตเปเปเบเปเบเบณเบเบปเบเปเบงเปเปเบ
.
เบเปเบฒเบเปเบญเบเบเบดเปเบกเบเบฒเบเบชเปเบงเบเบเบญเบเปเบเบฅเปเบงเบฑเบเบเบธ, เบเปเบญเบเบเบงเบเบเบฐเปเบซเบฑเบเบงเปเบฒเบเบฒเบเบชเปเบงเบเปเบซเบกเปเปเบซเบผเบปเปเบฒเบเบตเปเบเบทเบเบเปเบฒเบเบปเบเปเบงเปเปเบฅเปเบง:
$ 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 เบเบญเบเบงเบฑเบเบเบธเปเบเบปเปเบฒเปเบเปเบเปเบเบเบเบตเป, เปเบฅเบฐเบเบฒเบเบเบฑเปเบเบงเบฑเบเบเบธเบเบฐเบเบทเบ looped เบเปเบฒเบเปเบเบเบเบฒเบเบเบปเปเบเบเป. เบเบปเบงเบขเปเบฒเบ:
$ 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;
}
เปเบเบเบฐเบเบฐเบเบตเปเปเบฎเบฑเบ
probes เบเบตเปเบเปเบฒเบเบปเบเปเบงเปเปเบเปเบเบฅเป 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 เบเบณเบเบปเบเปเบเบเบเบตเป เปเบฅเบฐเปเปเบฒเบเบตเปเบเบตเปเบเปเบฝเบงเบเปเบญเบเบเบฑเบเบเบฒเบเบชเปเบงเบเปเบเปเบถเปเบ. เปเบกเบทเปเบญ kernel เบญเบญเบเปเบซเบเบเบฒเบเบเบญเบเบเบฐเปเบเบเบชเบฐเปเบเบฒเบฐเปเบเบซเบเบถเปเบ (เบเบปเบงเบขเปเบฒเบ, tracepoint
), เบซเบเปเบฒเบเบตเปเบเบนเบเบกเบฑเบเปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบ. เบเบฑเบเบชเบฐเบซเบเบญเบเบเบฒเบเบชเบทเปเบชเบฒเบเบฅเบฐเบซเบงเปเบฒเบเปเบเบเบเบฒเบ kernel เปเบฅเบฐเปเบเบเบเบฒเบเบเบทเปเบเบเบตเปเบเบนเปเปเบเป.
เบชเบฐเบซเบฅเบธเบ
เบเบปเบเบเบงเบฒเบกเบเบตเปเปเบเปเบเบถเบเบชเบฒเบซเบฒเบฅเบทเบเปเบฝเบงเบเบฑเบ BPF เปเบฅเบฐ eBPF เปเบเปเบเบทเปเบญเบเปเบเบเบปเปเบงเปเบ. เบเปเบญเบเบฎเบนเปเบงเปเบฒเบกเบตเบเปเปเบกเบนเบเปเบฅเบฐเบเบฑเบเบเบฐเบเบฒเบเบญเบเบซเบผเบฒเบเบขเปเบฒเบเบเปเบฝเบงเบเบฑเบ eBPF เปเบเบกเบทเปเบเบตเป, เบเบฑเปเบเบเบฑเปเบเบเปเบญเบเบเบฐเปเบเบฐเบเปเบฒเบเบฑเบเบเบฐเบเบฒเบเบญเบเปเบเบตเปเบกเปเบเบตเบกเบเปเบฒเบเบงเบเบซเบเปเบญเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเบถเบเบชเบฒเบเบทเปเบกเบญเบตเบ.
เบเปเบญเบเบเปเปเบเบฐเบเปเบฒเปเบซเปเบญเปเบฒเบ:
BPF: เปเบเบทเปเบญเบ virtual เปเบ kernel เบเบปเปเบงเปเบ Jonathan Corbett. เบเบฒเบเปเบเบฐเบเปเบฒเบเปเบฝเบงเบเบฑเบ BPF เปเบฅเบฐเบงเบดเบเบตเบเบฒเบเบเบฑเบเบเบฐเบเบฒเปเบเบชเบนเป eBPF.เบเบฒเบเปเบเบฐเบเปเบฒเบขเปเบฒเบเบฅเบฐเบญเบฝเบเบเปเบฝเบงเบเบฑเบ eBPF Brendan Gregg. เบเบปเบเบเบงเบฒเบกเบเบฒเบ LWN.net. Brendan เบกเบฑเบเบเบฐ tweets เบเปเบฝเบงเบเบฑเบ eBPF เปเบฅเบฐเบฎเบฑเบเบชเบฒเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเปเบฝเบงเบเบฑเบเบซเบปเบงเบเปเปเบเปเบฝเบงเบเบฑเบเบฅเบฒเบงblog post .เบเบฑเบเบเบถเบเบเปเบฝเบงเบเบฑเบ BPF & eBPF Julia Evans. เบเปเบฒเปเบซเบฑเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเปเบฒเบชเบฐเปเบซเบเบตเปเบเบ Suchakra Sharma "เบเบฒเบเบเบฑเปเบเบเบญเบเบเบธเบ BSD: เบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเปเบซเบกเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเบเปเบเบฑเบเปเบเบฑเบเบฅเบฐเบเบฑเบเบเบนเปเปเบเป". เบเปเบฒเปเบซเบฑเบเปเบกเปเบเบเบตเปเบฅเบฐเบเปเบงเบเปเบซเปเบเปเบฒเบเปเบเบปเปเบฒเปเบเบชเบฐเปเบฅเปเปเบเปเป.eBPF, part1: เบญเบฐเบเบตเบ, เบเบฑเบเบเบธเบเบฑเบ เปเบฅเบฐเบญเบฐเบเบฒเบเบปเบ Ferris Ellis. เบญเปเบฒเบเบเบฒเบงเบเบฑเบเบชเบทเบเบเปเป , เปเบเปเบงเปเบฒเบกเบฑเบเปเบเบฑเบเบกเบนเบเบเปเบฒเบเบฒเบเบญเปเบฒเบ. เบซเบเบถเปเบเปเบเบเบปเบเบเบงเบฒเบกเบเบตเปเบเบตเบเบตเปเบชเบธเบเบเบตเปเบเปเบญเบเปเบเปเบเบปเบเปเบ eBPF.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com