Π’ ядро Linux 5.12 принята подсистСма KFence для выявлСния ошибок ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ

Π’ состав находящСгося Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ядра Linux 5.12 Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° рСализация ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° KFence (Kernel Electric Fence), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, отлавливая Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², обращСния ΠΊ памяти послС освобоТдСния ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ошибки ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ класса.

Подобная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΆΠ΅ присутствовала Π² ядрС Π² Π²ΠΈΠ΄Π΅ ΠΎΠΏΡ†ΠΈΠΈ сборки KASAN (kernel address sanitizer, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Address Sanitizer Π² соврСмСнных gcc ΠΈ clang) — ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ Π² основном для ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠ³ΠΎ примСнСния. ΠŸΠΎΠ΄ΡΠΈΡΡ‚Π΅ΠΌΠ° KFence отличаСтся ΠΎΡ‚ KASAN высокой ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ Π½Π° ядрах Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… систСмах.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… систСмах даст Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ошибки Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² тСстовых запусках ΠΈ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°Ρ… ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ (ΠΏΡ€ΠΈ большом uptime). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ KFence Π½Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… систСмах даст Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сущСствСнно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ число машин, Π²ΠΎΠ²Π»Π΅Ρ‡Ρ‘Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ядра с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ.

ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы, Π½Π΅ зависящиС ΠΎΡ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Π΄ΠΎΡΡ‚ΠΈΠ³Π°ΡŽΡ‚ΡΡ Π² KFence благодаря подстановкС страниц Π·Π°Ρ‰ΠΈΡ‚Ρ‹ (guard pages) Π² ΠΊΡƒΡ‡Ρƒ Ρ‡Π΅Ρ€Π΅Π· фиксированныС ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹. ПослС истСчСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ KFence Ρ‡Π΅Ρ€Π΅Π· ΡˆΡ‚Π°Ρ‚Π½ΡƒΡŽ систСму распрСдСлСния памяти (SLAB ΠΈΠ»ΠΈ SLUB allocator) добавляСт ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΡƒΡŽ страницу Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΈΠ· ΠΏΡƒΠ»Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² KFence, ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΡ‚Ρ‡Ρ‘Ρ‚ счётчика Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ KFence размСщаСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ страницС памяти, Π° страницы памяти ΠΏΠΎ Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ страницы Π·Π°Ρ‰ΠΈΡ‚Ρ‹ (guard pages), Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выбираСтся случайно.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, страницы с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΎΡ‚Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° страницами Π·Π°Ρ‰ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ «page fault» ΠΏΡ€ΠΈ любом ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ. Для выявлСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ записи Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρƒ Π±ΡƒΡ„Π΅Ρ€Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ страниц с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ «ΠΊΡ€Π°ΡΠ½Ρ‹Π΅ Π·ΠΎΠ½Ρ‹» Π½Π° основС шаблонов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΎΡΡ‚Π°ΡŽΡ‰ΡƒΡŽΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° страниц памяти. —+————+————+————+————+————+— | xxxxxxxxx | O : | xxxxxxxxx | : O | xxxxxxxxx | | xxxxxxxxx | B : | xxxxxxxxx | : B | xxxxxxxxx | | x GUARD x | J : RED- | x GUARD x | RED- : J | x GUARD x | | xxxxxxxxx | E : ZONE | xxxxxxxxx | ZONE : E | xxxxxxxxx | | xxxxxxxxx | C : | xxxxxxxxx | : C | xxxxxxxxx | | xxxxxxxxx | T : | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Π’ случаС ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ обращСния ΠΊ области Π²Π½Π΅ Π³Ρ€Π°Π½ΠΈΡ† Π±ΡƒΡ„Π΅Ρ€Π° опСрация Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ страницу Π·Π°Ρ‰ΠΈΡ‚Ρ‹, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ «page fault», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ KFence ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π² Π»ΠΎΠ³ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ выявлСнной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ KFence Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ лишь Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Π»ΠΎΠ³, Π½ΠΎ прСдусмотрСна настройка «panic_on_warn», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Π² случаС выявлСния ошибки ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ядро Π² состояниС ΠΊΡ€Π°Ρ…Π° (panic).

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