ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈ KernelScript β ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ eBPF-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠΎΠ² ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ ΡΠ΄ΡΠ° Linux ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ. ΠΡΠΎΠ΅ΠΊΡ ΡΠ°Π·Π²ΠΈΠ²Π°Π΅Ρ Multikernel Technologies, ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°ΡΡΠ°Ρ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ split-kernel / multikernel Π΄Π»Ρ Linux. Π KernelScript ΡΠ°ΡΡΠΊΠ°Π·Π°Π» ΠΎΡΠ½ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Cong Wang Π½Π° Linux Foundation Open Source Summit; ΠΊΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π½Π° GitHub ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΠ΅ΠΉ ΠΠΏΠ°ΡΠΈ 2.0.
eBPF (Extended Berkeley Packet Filter) β ΡΡΠΎ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΡΠΌΠΎ Π² ΡΠ΄ΡΠ΅ Linux, Π½Π΅ ΡΡΠΎΠ³Π°Ρ Π΅Π³ΠΎ ΠΊΠΎΠ΄ ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π²Π΅ΡΠ³Π°Ρ ΡΠΈΡΠΊΡ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ. eBPF ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ΅ΡΠ°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°Ρ, ΠΎΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΄ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ eBPF ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ, ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΡΡΠ°ΡΠΈΠΊ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΡΠ·ΠΊΠΈΠ΅ ΠΌΠ΅ΡΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ (Ρ Π΅Π±ΡΠ΅ΡΡΠΊΠΈ).
ΠΠ΄Π΅Ρ KernelScript β ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ eBPF ΠΌΠ΅Π½Π΅Π΅ Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎΠΉ, ΡΠ΅ΠΌ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ²ΡΠ·ΠΊΠΈ C + libbpf, ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ bpftrace. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠ·ΡΠΊ ΠΊΠ°ΠΊ ΡΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ DSL, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ eGMP, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈ kernelspace-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ: ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π΄Π»Ρ eBPF-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, userspace-ΡΠ°ΡΡΠΈ ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ kernel modules ΡΠ΅ΡΠ΅Π· kfunc.
ΠΠ°ΡΠ²Π»Π΅Π½Π½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ KernelScript:
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΠΏΠΎΠ΄ ΡΠ°Π·Π½ΡΠ΅ ΡΠ΅Π»ΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° β ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ Π²ΡΠΎΠ΄Π΅ @xdp, @tc, @helper ΠΈ @kfunc Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ Π½ΡΠΆΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ: XDP/TC-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, helper-ΡΡΠ½ΠΊΡΠΈΠΈ, kernel-ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠΌΡ userspace-ΠΊΠΎΠ΄Ρ.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ tail calls β Π²ΠΌΠ΅ΡΡΠΎ ΡΡΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ program array ΠΈ Π²ΡΠ·ΠΎΠ²ΠΎΠ² bpf_tail_call() ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ ΠΏΠΈΡΠ°ΡΡ ΠΎΠ±ΡΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ eBPF-ΠΊΠΎΠ΄Π° ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ.
Π£ΠΏΡΠΎΡΡΠ½Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ dynptr ΠΈ eBPF maps β ΡΠ·ΡΠΊ ΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°ΡΡΡ ΡΡΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Ρ bpf_ringbuf_reserve_dynptr, bpf_dynptr_write ΠΈ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌΠΈ API. ΠΠ°ΡΡΡ eBPF ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΠ°Π·Π½ΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ.
ΠΠΎΠ½ΡΡΠΎΠ»Ρ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ β eBPF-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ ΠΊΠ°ΠΊ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ, ΠΏΠΎ Π·Π°Π΄ΡΠΌΠΊΠ΅ Π°Π²ΡΠΎΡΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π²ΡΠΎΠ΄Π΅ ΠΏΠΎΠΏΡΡΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ attach() Π΄ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ load().
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° kfunc β KernelScript ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ @kfunc, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΡΠ΄ΡΠ° ΠΈ ΠΌΠΎΠ³ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΈΠ· eBPF-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ; Π΄Π»Ρ Π½ΠΈΡ ΠΎΠ±Π΅ΡΠ°Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ kernel module ΠΈ BTF-ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΉ.
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΠΈΠΏΠΎΠ² eBPF-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ β Π² README ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ ΠΏΡΠΈΠΌΠ΅ΡΡ Π΄Π»Ρ XDP, TC, probe-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΈ perf_event, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΌΠΈ ΡΡΡΡΡΠΈΠΊΠ°ΠΌΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΠ²ΡΠΎΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΡΠΊΠΈΠ²Π°ΡΡ, ΡΡΠΎ KernelScript Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ ΡΠ΄ΡΡ Linux ΠΈΠ»ΠΈ Π½ΠΎΠ²ΡΠΌ eBPF runtime. ΠΡΠΎ ΡΠΊΠΎΡΠ΅Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΈ ΡΠ·ΡΠΊ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ²ΡΡΠ½ΡΠ΅ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ: eBPF-ΠΊΠΎΠ΄, userspace-Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠΈ, Makefile ΠΈ, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, kernel module.
ΠΠΎΠΊΠ° ΠΏΡΠΎΠ΅ΠΊΡ ΡΡΠΎΠΈΡ Π²ΠΎΡΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΊΠ°ΠΊ ΡΠ°Π½Π½ΠΈΠΉ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½Ρ. Π ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΏΡΡΠΌΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ KernelScript Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΡΠ°Π΄ΠΈΠΈ Π±Π΅ΡΠ°, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΈ API ΠΌΠΎΠ³ΡΡ ΠΌΠ΅Π½ΡΡΡΡΡ Π±Π΅Π· ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ, Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π² production ΠΏΠΎΠΊΠ° Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ.
ΠΠ·Π²ΠΎΡ: linux.org.ru
