ΠšΡ€Π°Ρ‚ΠΎΠΊ Π²ΠΎΠ²Π΅Π΄ Π²ΠΎ BPF ΠΈ eBPF

Π—Π΄Ρ€Π°Π²ΠΎ, Π₯Π°Π±Ρ€! Π’Π΅ извСстувамС Π΄Π΅ΠΊΠ° ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΡƒΠ²Π°ΠΌΠ΅ ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ·Π΄Π°Π²Π°ΡšΠ΅β€œ.Набљудливост Π½Π° Linux со BPF".

ΠšΡ€Π°Ρ‚ΠΎΠΊ Π²ΠΎΠ²Π΅Π΄ Π²ΠΎ BPF ΠΈ eBPF
Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π°Ρ‚Π° машина BPF ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒΠ²Π° Π΄Π° сС Ρ€Π°Π·Π²ΠΈΠ²Π° ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ сС користи Π²ΠΎ пракса, Π½ΠΈΠ΅ Π²ΠΈ ΠΏΡ€Π΅Π²Π΅Π΄ΠΎΠ²ΠΌΠ΅ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π²ΠΎ која сС ΠΎΠΏΠΈΡˆΡƒΠ²Π°Π°Ρ‚ Π½Π΅Ρ˜Π·ΠΈΠ½ΠΈΡ‚Π΅ Π³Π»Π°Π²Π½ΠΈ способности ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»Π½Π°Ρ‚Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π°.

Π’ΠΎ послСднивС Π³ΠΎΠ΄ΠΈΠ½ΠΈ, програмскитС Π°Π»Π°Ρ‚ΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ станаа сè ΠΏΠΎΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½ΠΈ Π·Π° Π΄Π° сС ΠΊΠΎΠΌΠΏΠ΅Π½Π·ΠΈΡ€Π°Π°Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π°ΡšΠ°Ρ‚Π° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π½Π° Linux Π²ΠΎ случаи ΠΊΠΎΠ³Π° Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ со високи пСрформанси. Π•Π΄Π½Π° ΠΎΠ΄ Π½Π°Ρ˜ΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½ΠΈΡ‚Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΎΠ΄ овој Π²ΠΈΠ΄ сС Π½Π°Ρ€Π΅ΠΊΡƒΠ²Π° бајпас Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ (бајпас Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚) ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°, Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΎ ΠΌΡ€Π΅ΠΆΠ½ΠΈΠΎΡ‚ слој Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ, Π΄Π° сС ΠΈΠ·Π²Ρ€ΡˆΠΈ Ρ†Π΅Π»Π°Ρ‚Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΎΠ΄ корисничкиот простор. Π—Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π½Π° ΠΌΡ€Π΅ΠΆΠ½Π°Ρ‚Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠ° ΠΎΠ΄ кориснички простор. Π‘ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ, ΠΊΠΎΠ³Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌΠ΅ со ΠΌΡ€Π΅ΠΆΠ½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠ°, сС ΠΏΠΎΡ‚ΠΏΠΈΡ€Π°ΠΌΠ΅ Π½Π° Π²ΠΎΠ·Π°Ρ‡ΠΎΡ‚ кориснички простор.

ΠŸΡ€Π΅Π½Π΅ΡΡƒΠ²Π°Ρ˜ΡœΠΈ ја цСлосната ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π° Π½Π° ΠΌΡ€Π΅ΠΆΠ½Π°Ρ‚Π° ΠΊΠ°Ρ€Ρ‚ΠΈΡ‡ΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° кориснички простор, Π³ΠΈ Π½Π°ΠΌΠ°Π»ΡƒΠ²Π°ΠΌΠ΅ Ρ‚Ρ€ΠΎΡˆΠΎΡ†ΠΈΡ‚Π΅ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ (ΠΏΡ€Π΅Ρ„Ρ€Π»ΡƒΠ²Π°ΡšΠ΅ Π½Π° контСкст, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΡ€Π΅ΠΆΠ½ΠΈΠΎΡ‚ слој, ΠΏΡ€Π΅ΠΊΠΈΠ½ΠΈ ΠΈΡ‚Π½.), ΡˆΡ‚ΠΎ Π΅ доста Π²Π°ΠΆΠ½ΠΎ ΠΊΠΎΠ³Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ со Π±Ρ€Π·ΠΈΠ½ΠΈ ΠΎΠ΄ 10 Gb/s ΠΈΠ»ΠΈ повисоки. Π‘Π°Ρ˜ΠΏΠ°Ρ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ плус ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ˜Π° ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈ карактСристики (сСриска ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°) ΠΈ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΈΠ·Π²Π΅Π΄Π±Π°Ρ‚Π° (НУМА смСтководство, Π˜Π·ΠΎΠ»Π°Ρ†ΠΈΡ˜Π° Π½Π° процСсорот, ΠΈΡ‚Π½.) ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Π°Ρ‚ Π½Π° основитС Π½Π° ΠΌΡ€Π΅ΠΆΠ½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° со високи пСрформанси Π²ΠΎ корисничкиот простор. МоТСби ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° овој Π½ΠΎΠ² пристап Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π΅ Π”ΠŸΠ”Πš ΠΎΠ΄ Π˜Π½Ρ‚Π΅Π» (ΠšΠΎΠΌΠΏΠ»Π΅Ρ‚ Π·Π° Ρ€Π°Π·Π²ΠΎΡ˜ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π° Ρ€Π°ΠΌΠ½ΠΈΠ½Π°), ΠΈΠ°ΠΊΠΎ ΠΈΠΌΠ° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ Π°Π»Π°Ρ‚ΠΊΠΈ ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ, Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΎ Cisco's VPP (Vector Packet Processing), Netmap ΠΈ, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, шипка.

ΠžΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΌΡ€Π΅ΠΆΠ½ΠΈΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΠΈ Π²ΠΎ корисничкиот простор ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ Π½Π° нСдостатоци:

  • ΠˆΠ°Π΄Ρ€ΠΎΡ‚ΠΎ Π½Π° ОБ Π΅ слој Π·Π° Π°ΠΏΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡ˜Π° Π·Π° хардвСрски рСсурси. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ Π·Π° кориснички простор Ρ‚Ρ€Π΅Π±Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π΄Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Π°Ρ‚ со Π½ΠΈΠ²Π½ΠΈΡ‚Π΅ рСсурси, Ρ‚ΠΈΠ΅ исто Ρ‚Π°ΠΊΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Π°Ρ‚ со сопствСниот Ρ…Π°Ρ€Π΄Π²Π΅Ρ€. Ова чСсто Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Ρ‚Π΅ сопствСни Π΄Ρ€Π°Ρ˜Π²Π΅Ρ€ΠΈ.
  • Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ цСлосно сС ΠΎΡ‚ΠΊΠ°ΠΆΡƒΠ²Π°ΠΌΠ΅ ΠΎΠ΄ просторот Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚, сС ΠΎΡ‚ΠΊΠ°ΠΆΡƒΠ²Π°ΠΌΠ΅ ΠΈ ΠΎΠ΄ сСта ΠΌΡ€Π΅ΠΆΠ½Π° функционалност ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½Π° ΠΎΠ΄ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ Π·Π° кориснички простор ΠΌΠΎΡ€Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΄Π° Π³ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Π±ΠΈ вСќС сС ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ΠΈ ΠΎΠ΄ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ систСм.
  • ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π²ΠΎ Ρ€Π΅ΠΆΠΈΠΌ Π½Π° пСсок, ΡˆΡ‚ΠΎ сСриозно ја ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΡƒΠ²Π° Π½ΠΈΠ²Π½Π°Ρ‚Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π° ΠΈ Π³ΠΈ спрСчува Π΄Π° сС ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π°Ρ‚ со Π΄Ρ€ΡƒΠ³ΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ систСм.

Π’ΠΎ ΡΡƒΡˆΡ‚ΠΈΠ½Π°, ΠΏΡ€ΠΈ Π²ΠΌΡ€Π΅ΠΆΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ кориснички простор, ΠΏΡ€ΠΈΠ΄ΠΎΠ±ΠΈΠ²ΠΊΠΈΡ‚Π΅ ΠΎΠ΄ пСрформанситС сС постигнуваат со ΠΏΡ€Π΅ΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΎΠ΄ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π΄ΠΎ корисничкиот простор. XDP Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠΊΠΌΡƒ спротивното: Π³ΠΈ прСмСстува ΠΌΡ€Π΅ΠΆΠ½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΎΠ΄ корисничкиот простор (Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ, Ρ€Π΅Π·ΠΎΠ»ΡƒΡ‚ΠΎΡ€ΠΈ, Ρ€ΡƒΡ‚ΠΈΡ€Π°ΡšΠ΅, ΠΈΡ‚Π½.) Π²ΠΎ просторот Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ. XDP Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠ΅ ΠΌΡ€Π΅ΠΆΠ½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° вСднаш ΡˆΡ‚ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ Π³ΠΎ ΠΏΠΎΠ³ΠΎΠ΄ΠΈ ΠΌΡ€Π΅ΠΆΠ½ΠΈΠΎΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ ΠΈ ΠΏΡ€Π΅Π΄ Π΄Π° ΠΏΠΎΡ‡Π½Π΅ Π΄Π° сС Π΄Π²ΠΈΠΆΠΈ Π½Π°Π³ΠΎΡ€Π΅ Π²ΠΎ потсистСмот Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ. Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π° Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ сС Π·Π³ΠΎΠ»Π΅ΠΌΡƒΠ²Π°. ΠœΠ΅Ρ“ΡƒΡ‚ΠΎΠ°, ΠΊΠ°ΠΊΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΌΡƒ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π° Π½Π° корисникот Π΄Π° Π³ΠΈ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° своитС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π²ΠΎ просторот Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ? ΠŸΡ€Π΅Π΄ Π΄Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌΠ΅ Π½Π° ΠΎΠ²Π° ΠΏΡ€Π°ΡˆΠ°ΡšΠ΅, Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΡˆΡ‚ΠΎ Π΅ BPF.

BPF ΠΈ eBPF

И ΠΏΠΎΠΊΡ€Π°Ρ˜ Π·Π±ΡƒΠ½ΡƒΠ²Π°Ρ‡ΠΊΠΎΡ‚ΠΎ ΠΈΠΌΠ΅, BPF (Berkeley Packet Filtering) Π΅ Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚ ΠΌΠΎΠ΄Π΅Π» Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина. Оваа Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина ΠΏΡ€Π²ΠΈΡ‡Π½ΠΎ бСшС Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°Π½Π° Π΄Π° сС справува со Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, ΠΏΠ° ΠΎΡ‚Ρ‚ΡƒΠΊΠ° ΠΈ ΠΈΠΌΠ΅Ρ‚ΠΎ.

Π•Π΄Π½Π° ΠΎΠ΄ Π½Π°Ρ˜ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈΡ‚Π΅ Π°Π»Π°Ρ‚ΠΊΠΈ ΠΊΠΎΠΈ користат 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 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΊΠΎΠ³Π° Π½ΠΈΠ²Π½ΠΈΠΎΡ‚ Ρ‚Ρ€ΡƒΠ΄ бСшС објавСн Π€ΠΈΠ»Ρ‚Π΅Ρ€ Π·Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ BSD: Нова Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π·Π° Ρ„Π°ΡœΠ°ΡšΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° корисник, ΠΎΠ²Π°Π° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΡ˜Π° Π·Π° ΠΏΡ€Π² ΠΏΠ°Ρ‚ бСшС прСтставСна Π½Π° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ˜Π°Ρ‚Π° Usenix Π²ΠΎ Π·ΠΈΠΌΠ°Ρ‚Π° 1993 Π³ΠΎΠ΄ΠΈΠ½Π°.

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ BPF Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½Π° машина, ја Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°Ρ‚Π° Π²ΠΎ која Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅. ΠŸΠΎΠΊΡ€Π°Ρ˜ Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ΠΎΡ‚, Ρ‚ΠΎΡ˜ Π³ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ‚ Π½Π° сСриска ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° (инструкциитС Π·Π° Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΡšΠ΅ сС ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΡ‚Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Ρ‚ΠΈ Π½Π° ΡΠ΅Ρ€ΠΈΡ˜Π°Ρ‚Π°), рСгистритС (A ΠΈ X; Π°ΠΊΡƒΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€ΠΈ ΠΈ индСксни рСгистри), ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° Π·Π° Π³Ρ€Π΅Π±Π΅ΡšΠ΅ ΠΈ ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΡ‚Π΅Π½ Π±Ρ€ΠΎΡ˜Π°Ρ‡ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Π΅ ΡˆΡ‚ΠΎ BPF Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ΠΎΡ‚ бСшС ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€Π°Π½ ΠΏΠΎ Motorola 6502 ISA. Како ΡˆΡ‚ΠΎ сС присСти Π‘Ρ‚ΠΈΠ² МСкКСн Π²ΠΎ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° ΠΏΠ»Π΅Π½Π°Ρ€Π΅Π½ ΠΈΠ·Π²Π΅ΡˆΡ‚Π°Ρ˜ Π½Π° Sharkfest '11, Ρ‚ΠΎΡ˜ бСшС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Π½ со ΠΈΠ·Π³Ρ€Π°Π΄Π±Π°Ρ‚Π° 6502 ΠΎΠ΄ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΡΡ€Π΅Π΄Π½ΠΎΡˆΠΊΠΎΠ»ΡΠΊΠΈ Π΄Π΅Π½ΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°ΡšΠ΅ Π½Π° Apple II, ΠΈ ΠΎΠ²Π° знаСњС влијаСшС Π½Π° Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° Π·Π° Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°ΡšΠ΅ Π½Π° BPF Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ΠΎΡ‚.

ΠŸΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ°Ρ‚Π° Π·Π° BPF Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π° Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Линукс Π²ΠΎ Π²Π΅Ρ€Π·ΠΈΠΈ v2.5 ΠΈ повисоки, Π΄ΠΎΠ΄Π°Π΄Π΅Π½ΠΈ Π³Π»Π°Π²Π½ΠΎ со Π½Π°ΠΏΠΎΡ€ΠΈΡ‚Π΅ Π½Π° ЏСј Шулист. ΠšΠΎΠ΄ΠΎΡ‚ BPF остана Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Ρ‚ Π΄ΠΎ 2011 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΊΠΎΠ³Π° Π•Ρ€ΠΈΠΊ ДумасСт Π³ΠΎ Ρ€Π΅Π΄ΠΈΠ·Π°Ρ˜Π½ΠΈΡ€Π°ΡˆΠ΅ ΠΏΡ€Π΅Π²Π΅Π΄ΡƒΠ²Π°Ρ‡ΠΎΡ‚ BPF Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π²ΠΎ JIT Ρ€Π΅ΠΆΠΈΠΌ (Π˜Π·Π²ΠΎΡ€: JIT Π·Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈ Π·Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ). ПослС ΠΎΠ²Π°, ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚, намСсто Π΄Π° Π³ΠΎ Ρ‚ΠΎΠ»ΠΊΡƒΠ²Π° BPF Π±Π°Ρ˜Ρ‚Π΅ΠΊΠΎΠ΄ΠΎΡ‚, ΠΌΠΎΠΆΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π° BPF ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ Π²ΠΎ Ρ†Π΅Π»Π½Π°Ρ‚Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°: x86, ARM, MIPS ΠΈΡ‚Π½.

ΠŸΠΎΠ΄ΠΎΡ†Π½Π°, Π²ΠΎ 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 ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π΅ со Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° слСдСњС ΠΈΠ»ΠΈ 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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€