I den utvecklade kÀrnan Linux 5.12 ingÄr en implementation av KFence (Kernel Electric Fence), som kontrollerar minnesanvÀndning genom att fÄnga övertrÀdelser av buffertgrÀnser, försök att fÄ Ätkomst till minne efter att det har frigjorts och andra liknande fel.
Liknande funktionalitet har redan funnits i kĂ€rnan som en KASAN (kernel address sanitizer) byggalternativ (anvĂ€nder Address Sanitizer i moderna gcc och clang) â men positionerades huvudsakligen för felsökningsĂ€ndamĂ„l. KFence-subsystemet skiljer sig frĂ„n KASAN genom hög hastighet, vilket möjliggör anvĂ€ndning av denna funktion Ă€ven pĂ„ kĂ€rnor i produktionssystem.
AnvÀndning i produktionssystem ger möjlighet att fÄnga minnesfel som inte upptrÀder under testkörningar och som bara dyker upp vid verkliga belastningar eller vid lÄngvarig drift (vid hög uptime). Dessutom kommer implementeringen av KFence i produktionssystem att möjliggöra en betydande ökning av antalet maskiner som deltar i kontrollen av kÀrnans minneshantering.
Minimala overheadkostnader, oberoende av belastning, uppnÄs i KFence genom att införa skyddssidor (guard pages) i heapen med fasta intervaller. Efter att det aktuella skyddsintervallet har förflutit, lÀgger KFence till en ny skyddssida frÄn KFence-objektpoolen genom det ordinarie minnesallokeringssystemet (SLAB eller SLUB-allocator) och börjar en ny tidsrÀkning. Varje KFence-objekt placeras pÄ en separat minnessida, och minnessidorna vid den vÀnstra och högra grÀnsen bildar skyddssidor (guard pages) vars storlek vÀljs slumpmÀssigt.
SĂ„ledes separeras sidor med objekt frĂ„n varandra av skyddssidor som Ă€r instĂ€llda att generera "page fault" vid varje Ă„tkomst. För att identifiera skrivoperationer utanför buffertgrĂ€nserna inom sidor med objekt anvĂ€nds dessutom "röda zoner" baserade pĂ„ mönster, som upptar minne som inte anvĂ€nds av objekten, och som finns kvar vid justering av minnes sidstorlek. â+ââââ+ââââ+ââââ+ââââ+ââââ+â | 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 | â+ââââ+ââââ+ââââ+ââââ+ââââ+â
Vid ett försök att fÄ Ätkomst till ett omrÄde utanför buffertgrÀnserna pÄverkas skyddssidan, vilket leder till generering av en "page fault", som fÄngas av KFence och loggar information om det identifierade problemet. Som standard blockerar inte KFence felet utan loggar endast en varning, men det finns en instÀllning "panic_on_warn" som gör att kÀrnan kan sÀttas i ett kraschtillstÄnd (panic) vid identifiering av ett fel.
KĂ€lla: opennet.ru
