Π’ состав GCC принят бэкСнд для компиляции Π² eBPF

Π’ состав Π½Π°Π±ΠΎΡ€Π° компиляторов GCC принят ΠΊΠΎΠ΄ для компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для встроСнного Π² ядро Linux ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° eBPF. Благодаря ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ JIT-компиляции, Π² ядрС Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Π½Π° Π»Π΅Ρ‚Ρƒ транслируСтся Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Π΅ инструкции ΠΈ выполняСтся с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠŸΠ°Ρ‚Ρ‡ΠΈ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ eBPF приняты Π² Π²Π΅Ρ‚ΠΊΡƒ, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ развиваСтся выпуск GCC 10.

Помимо бэкСнда для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄Π° Π² GCC Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½ ΠΏΠΎΡ€Ρ‚ libgcc для eBPF ΠΈ срСдства для формирования ELF-Ρ„Π°ΠΉΠ»ΠΎΠ², Π΄Π°ΡŽΡ‰ΠΈΡ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС eBPF с использованиСм прСдоставляСмых ядром Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠ². ΠŸΠ°Ρ‚Ρ‡ΠΈ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈ eBPF Π² GCC ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Ρ‹ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°ΠΌΠΈ ΠΈΠ· ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Oracle, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎ этого ΡƒΠΆΠ΅ обСспСчили ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ eBPF Π² GNU binutils. Π’ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ находится симулятор ΠΈ ΠΏΠ°Ρ‚Ρ‡ΠΈ для GDB, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволят ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ eBPF-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±Π΅Π· Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² ядро.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для eBPF ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Π½Π° подмноТСствС языка C, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π² ядро. ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ eBPF провСряСт Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ примСнСния Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Ρ… инструкций ΠΈ Π½Π°Π»Π°Π³Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π° ΠΊΠΎΠ΄ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, отсутствиС Ρ†ΠΈΠΊΠ»ΠΎΠ²).
Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ для компиляции eBPF Π² Linux примСнялся инструмСнтарий Π½Π° Π±Π°Π·Π΅ LLVM. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° eBPF Π² GCC прСдставляСт интСрСс Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ инструмСнтарий для сборки ядра Linux ΠΈ eBPF-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π±Π΅Π· установки Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… зависимостСй.

Π’ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ eBPF ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сСтСвых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ, ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ пропускной ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ систСм, ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ, ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ частоту ΠΈ врСмя выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ трассировку с использованиСм kprobes/uprobes/tracepoints.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ