ΠΡΠΈΠ²Π΅Ρ, Π₯Π°Π±Ρ! Π‘ΠΎΠΎΠ±ΡΠ°Π΅ΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π³ΠΎΡΠΎΠ²ΠΈΡΡΡ ΠΊ Π²ΡΡ
ΠΎΠ΄Ρ ΠΊΠ½ΠΈΠ³Π° "
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° BPF ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ ΡΠ²ΠΎΠ»ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅, ΠΌΡ ΠΏΠ΅ΡΠ΅Π²Π΅Π»ΠΈ Π΄Π»Ρ Π²Π°Ρ ΡΡΠ°ΡΡΡ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π΅Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ.
Π ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π³ΠΎΠ΄Ρ ΡΡΠ°Π»ΠΈ Π½Π°Π±ΠΈΡΠ°ΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠ΅ΠΌΡ, ΠΏΡΠΈΠ·Π²Π°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠ΄ΡΠ° Linux Π² ΡΠ»ΡΡΠ°ΡΡ
, ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². ΠΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ
ΠΏΡΠΈΠ΅ΠΌΠΎΠ² ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΎΠ±Ρ
ΠΎΠ΄ ΡΠ΄ΡΠ° (kernel bypass) ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ, ΠΏΡΠΎΠΏΡΡΠΊΠ°Ρ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠ΄ΡΠ°, Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π²ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΠΈΠ· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°. ΠΠ±Ρ
ΠΎΠ΄ ΡΠ΄ΡΠ° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΊΠ°ΡΡΠΎΠΉ ΠΈΠ· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΊΠ°ΡΡΠΎΠΉ ΠΌΡ ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΡΡ Π½Π° Π΄ΡΠ°ΠΉΠ²Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°.
ΠΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΊΠ°ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈΠ· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°, ΠΌΡ ΡΠΎΠΊΡΠ°ΡΠ°Π΅ΠΌ ΠΈΠ·Π΄Π΅ΡΠΆΠΊΠΈ, ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ ΡΠ°Π±ΠΎΡΠΎΠΉ ΡΠ΄ΡΠ° (ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ, ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ, Ρ.Π΄.), ΡΡΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Π½Π° ΡΠΊΠΎΡΠΎΡΡΡΡ
10ΠΠ±/Ρ ΠΈΠ»ΠΈ Π²ΡΡΠ΅. ΠΠ±Ρ
ΠΎΠ΄ ΡΠ΄ΡΠ° ΠΏΠ»ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ Π΄ΡΡΠ³ΠΈΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ (ΠΏΠ°ΠΊΠ΅ΡΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°) ΠΈ Π°ΠΊΠΊΡΡΠ°ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ (ΡΡΠ΅Ρ NUMA, ΠΈΠ·ΠΎΠ»ΡΡΠΈΡ CPU, Ρ.Π΄.) ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π°ΠΌ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ±ΡΠ°Π·ΡΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π° ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² β ΡΡΠΎ
Π£ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π²ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ Π΅ΡΡΡ ΡΡΠ΄ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΎΠ²:
- Π―Π΄ΡΠΎ ΠΠ‘ β ΡΡΠΎ ΡΡΠΎΠ²Π΅Π½Ρ Π°Π±ΡΡΡΠ°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ². ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ Π½Π°ΠΏΡΡΠΌΡΡ, ΠΈΠΌ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠ°ΡΠ°ΡΡΡΡ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ².
- ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌΡΡ ΠΎΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΡΠ΄ΡΠ°, ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌΡΡ ΠΈ ΠΎΡ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ΄ΡΠΎΠΌ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π·Π°Π½ΠΎΠ²ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ ΡΠ΄ΡΠΎΠΌ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ.
- ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΏΠ΅ΡΠΎΡΠ½ΠΈΡΡ, ΡΡΠΎ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈ ΠΌΠ΅ΡΠ°Π΅Ρ ΠΈΠΌ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ°ΡΡΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ.
Π ΡΡΡΠ½ΠΎΡΡΠΈ, ΠΏΡΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π²ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΠΈΠ· ΡΠ΄ΡΠ° Π² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ. XDP Π΄Π΅Π»Π°Π΅Ρ ΡΠΎΠ²Π½ΠΎ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ: ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° (ΡΠΈΠ»ΡΡΡΡ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ, ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ, Ρ.Π΄.) Π² ΠΎΠ±Π»Π°ΡΡΡ ΡΠ΄ΡΠ°. XDP ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ΅ΡΠ΅Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π½Π° ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²Π²Π΅ΡΡ Π² ΡΠ΅ΡΠ΅Π²ΡΡ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ΄ΡΠ°. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ ΡΠ΄ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ²ΠΎΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΡΠ΄ΡΠ°? ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ BPF.
BPF ΠΈ eBPF
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ BPF (Π€ΠΈΠ»ΡΡΡΠ°ΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΠ΅ΡΠΊΠ»ΠΈ) β ΡΡΠΎ, ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΌΠΎΠ΄Π΅Π»Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ. ΠΠ°Π½Π½Π°Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° ΠΈΡΡ ΠΎΠ΄Π½ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π»Π°ΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΎΡΡΡΠ΄Π° ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ
ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ
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 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ethertype ΠΏΠ°ΠΊΠ΅ΡΠ°.
- ΠΠ½ΡΡΡΡΠΊΡΠΈΡ (001): ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ΅ Ρ 0x86dd, ΡΠΎ Π΅ΡΡΡ, Ρ ethertype-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ IPv6. ΠΡΠ»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π²Π΅Π½ true, ΡΠΎ ΡΡΠ΅ΡΡΠΈΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΊ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ (002), Π° Π΅ΡΠ»ΠΈ Π½Π΅Ρ β ΡΠΎ ΠΊ (006).
- ΠΠ½ΡΡΡΡΠΊΡΠΈΡ (006): ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ 0x800 (ethertype-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ IPv4). ΠΡΠ»ΠΈ ΠΎΡΠ²Π΅Ρ true, ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΊ (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. ΠΡΠΌΠ°Ρ, Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±Π΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Ρ ΡΠΎΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»ΠΈ, Π½ΠΎ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ 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.
- ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΠ°ΡΡΡ. ΠΠ°ΡΡΡ β ΡΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° ΡΠΈΠΏΠ° Β«ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅Β», ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠ΅ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΠΌ ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΠΌ ΡΠ΄ΡΠ°. Π eBPF ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ ΠΊΠ°ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΈΠΏΠΎΠ².
- ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°, Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ ΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ°. ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π²Π½ΡΡΡΠΈ ΡΠ΄ΡΠ° ΠΈ Π½Π΅ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ eBPF ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ.
- ΠΠΎΠ½ΡΠ΅Π²ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ. Π Π°Π·ΠΌΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² eBPF ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ 4096 Π±Π°ΠΉΡ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΊΠΎΠ½ΡΠ΅Π²ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ eBPF ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ eBPF-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ±ΠΎΠΉΡΠΈ Π΄Π°Π½Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ (ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°ΡΡ Π΄ΠΎ 32 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ).
eBPF: ΠΏΡΠΈΠΌΠ΅Ρ
Π ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠ°Ρ ΡΠ΄ΡΠ° Linux Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Π΄Π»Ρ eBPF. ΠΠ½ΠΈ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ samples/bpf/. Π§ΡΠΎΠ±Ρ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΏΡΠΎΡΡΠΎ Π²Π²Π΅Π΄ΠΈΡΠ΅:
$ sudo make samples/bpf/
Π― Π½Π΅ Π±ΡΠ΄Ρ ΡΠ°ΠΌ ΠΏΠΈΡΠ°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ eBPF, Π° Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΎΠ±ΡΠ°Π·ΡΠΎΠ², Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
Π² samples/bpf/. Π Π°ΡΡΠΌΠΎΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ°ΡΡΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΈ ΠΎΠ±ΡΡΡΠ½Ρ, ΠΊΠ°ΠΊ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ Π²ΡΠ±ΡΠ°Π» ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ tracex4
.
ΠΠΎΠΎΠ±ΡΠ΅, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Π² samples/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
ΠΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² sample/bpf/ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Ρ ΡΡ ΠΎΠ΄ΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. Π Π½ΠΈΡ Π²ΡΠ΅Π³Π΄Π° ΠΏΠΎ Π΄Π²Π° ΡΠ°ΠΉΠ»Π°:
XXX_kern.c
: ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° eBPF.XXX_user.c
: ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° eBPF ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΊΠ°ΡΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΊ ΡΠ΅ΠΊΡΠΈΠΈ. ΠΠΎΠ³Π΄Π° ΡΠ΄ΡΠΎ Π²ΡΠ΄Π°Π΅Ρ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, tracepoint
), ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ. ΠΠ°ΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ ΡΠ΄ΡΠ° ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Π² ΠΎΠ±ΡΠΈΡ ΡΠ΅ΡΡΠ°Ρ Π±ΡΠ»ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ BPF ΠΈ eBPF. Π― Π·Π½Π°Ρ, ΡΡΠΎ ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΎΠ± eBPF, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ² Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΏΠΎΡΠΈΡΠ°ΡΡ:
BPF: the universal in-kernel virtual machine ΠΠΆΠΎΠ½Π°ΡΠ°Π½Π° ΠΠΎΡΠ±Π΅ΡΡΠ°. ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² BPF ΠΈ ΡΠ°ΡΡΠΊΠ°Π· ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½Π° ΡΠ²ΠΎΠ»ΡΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π»Π° Π² eBPF.A thorough introduction to eBPF ΠΡΠ΅Π½Π΄Π°Π½Π° ΠΡΠ΅Π³Π³Π°. Π‘ΡΠ°ΡΡΡ Ρ ΡΠ°ΠΉΡΠ° LWN.net. ΠΡΠ΅Π½Π΄Π°Π½ ΡΠ°ΡΡΠΎ ΠΏΠΈΡΠ΅Ρ ΡΠ²ΠΈΡΡ ΠΎΠ± eBPF ΠΈ Π²Π΅Π΄Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅ΡΡΡΡΠΎΠ² Π½Π° ΡΡΡ ΡΠ΅ΠΌΡ Ρ ΡΠ΅Π±Ρ Π²Π±Π»ΠΎΠ³Π΅ .Notes on BPF & eBPF ΠΠΆΡΠ»ΠΈΠΈ ΠΠ²Π°Π½Ρ. ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΊ ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠΈ Π‘ΡΡΠ°ΠΊΡΡ Π¨Π°ΡΠΌΡ βThe BSD Packet Filter: A New Architecture for User-level Packet Captureβ. ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Ρ ΠΎΡΠΎΡΠΈΠ΅ ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΡΠ»Π°ΠΉΠ΄Π°Ρ .eBPF, part1: Past, Present and Future Π€Π΅ΡΡΠΈΡΠ° ΠΠ»Π»ΠΈΡΠ°. ΠΠΎΠ½Π³ΡΠΈΠ΄ ΡΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ , Π½ΠΎ ΡΠΈΡΠ°ΡΡ ΡΡΠΎΠΈΡ. ΠΠ΄Π½Π° ΠΈΠ· Π»ΡΡΡΠΈΡ ΡΡΠ°ΡΠ΅ΠΉ ΠΎΠ± eBPF, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π»ΠΈΡΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com