Součástí vyvíjeného jádra Linux 5.12 je implementace mechanismu KFence (Kernel Electric Fence), který kontroluje práci s pamětí, odhaluje přetečení bufferů, přístupy k paměti po uvolnění a další podobné chyby.
Podobná funkcionalita již byla v jádře přítomná jako možnost sestavení KASAN (kernel address sanitizer, využívá Address Sanitizer v moderních gcc a clang) — avšak byla primárně zaměřena na ladění. Podsystem KFence se od KASAN liší vysokou rychlostí, což umožňuje tuto funkci používat i na jádrech v produkčních systémech.
Použití v produkčních systémech umožní odhalování chyb v paměti, které se neprojevují v testovacích bězích a objevují se pouze při pracovních zátěžích nebo po delší době provozu (při velkém uptime). Navíc použití KFence v produkčních systémech výrazně zvýší počet strojů zapojených do kontroly práce jádra s pamětí.
Minimální režijní náklady, které nezávisí na zátěži, jsou v KFence dosaženy díky zavedení stránek ochrany (guard pages) do haldy v pevných intervalech. Po uplynutí doby chránícího intervalu KFence přes standardní systém přidělování paměti (SLAB nebo SLUB allocator) přidává další stránku ochrany z objektového fondu KFence a začíná nový odpočet časovače. Každý objekt KFence je umístěn na samostatné stránce paměti a stránky paměti na levé a pravé hranici tvoří stránky ochrany (guard pages), jejichž velikost se vybírá náhodně.
Takto jsou stránky s objekty odděleny stránkami ochrany, které jsou nastaveny tak, aby generovaly ‚page fault‘ při jakémkoli přístupu. Pro odhalení zápisových operací mimo hranice bufferu uvnitř stránek s objekty se navíc používají ‚červené zóny‘ na základě vzorů, které zabírají paměť nevyužívanou objekty, vyplývající z zarovnání velikosti stránek paměti. —+————+————+————+————+————+— | 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 | —+————+————+————+————+————+—
Pokud dojde k pokusu o přístup do oblasti mimo hranice vyrovnávací paměti, operace zasáhne ochrannou stránku, což vyvolá „page fault“, který zachytí KFence a zapíše data o zjištěném problému do logu. Ve výchozím nastavení KFence chybu nezabíjí a pouze ji zaznamenává do logu, ale je k dispozici možnost nastavení „panic_on_warn“, která umožňuje přenést jádro do stavu havárie (panic) při zjištění chyby.
Zdroj: opennet.ru
