Linux 5.12-kärnan har antagit KFence-undersystemet för att upptäcka fel när man arbetar med minne

Linux-kärnan 5.12, som är under utveckling, inkluderar en implementering av KFence-mekanismen (Kernel Electric Fence), som kontrollerar minneshantering, fångar buffertöverskridanden, minnesåtkomster efter frigöring och andra fel av liknande klass.

Liknande funktionalitet fanns redan i kärnan i form av KASAN-byggalternativet (kärnadresssanering, använder Address Sanitizer i modern gcc och clang) - den var dock placerad främst för felsökningsanvändning. KFence-delsystemet skiljer sig från KASAN i sin höga driftshastighet, vilket gör det möjligt att använda denna funktion även på kärnor i arbetssystem.

Applikation på produktionssystem kommer att göra det möjligt att fånga minnesfel som inte dyker upp i testkörningar och endast dyker upp under arbetsbelastningar eller under långvarig drift (med stor drifttid). Dessutom kommer användningen av KFence på produktionssystem att göra det möjligt att avsevärt öka antalet maskiner som är involverade i att kontrollera driften av kärnan med minne.

KFence uppnår minimal belastningsoberoende overhead genom att infoga skyddssidor i högen med fasta intervall. Efter att nästa skyddsintervall har löpt ut lägger KFence, genom standardminnestilldelningssystemet (SLAB eller SLUB-allokator), till nästa skyddssida från KFence-objektpoolen och startar en ny tidsräknarerapport. Varje KFence-objekt finns på en separat minnessida, och minnessidorna längs den vänstra och högra gränsen bildar skyddssidor, vars storlek väljs slumpmässigt.

Således separeras sidor med objekt från varandra av skyddssidor, som är konfigurerade att generera ett "sidfel" vid varje åtkomst. För att upptäcka skriv utanför gränsen inuti objektsidor, används dessutom mönsterbaserade "röda zoner", som upptar minne som inte används av objekt, som återstår när storleken på minnessidorna är justerad. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x VAKT x | J : RÖD- | x VAKT x | RÖD- : J | x VAKT x | | xxxxxxxxx | E: ZON | xxxxxxxxx | ZON: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Om ett försök görs att komma åt ett område utanför buffertgränserna, påverkar operationen skyddssidan, vilket leder till generering av ett "sidfel", som fångar upp KFence och loggar information om det identifierade problemet. Som standard blockerar inte KFence ett fel och visar bara en varning i loggen, men det finns en "panic_on_warn"-inställning som låter dig försätta kärnan i ett panikläge om ett fel upptäcks.

Källa: opennet.ru

Lägg en kommentar