Linux 5.12-kjernen har tatt i bruk KFence-undersystemet for å oppdage feil ved arbeid med minne

Linux-kjernen 5.12, som er under utvikling, inkluderer en implementering av KFence (Kernel Electric Fence)-mekanismen, som sjekker minnehåndtering, fanger bufferoverskridelser, minnetilganger etter frigjøring og andre feil av en lignende klasse.

Lignende funksjonalitet var allerede til stede i kjernen i form av KASAN byggealternativet (kjerneadresserenser, bruker Address Sanitizer i moderne gcc og clang) - men den var hovedsakelig posisjonert for feilsøkingsbruk. KFence-delsystemet skiller seg fra KASAN i sin høye driftshastighet, noe som gjør det mulig å bruke denne funksjonen selv på kjerner i arbeidssystemer.

Applikasjon på produksjonssystemer vil gjøre det mulig å fange opp minnefeil som ikke vises i testkjøringer og kun vises under arbeidsbelastninger eller under langvarig drift (med stor oppetid). I tillegg vil bruken av KFence på produksjonssystemer gjøre det mulig å betydelig øke antall maskiner som er involvert i å sjekke driften av kjernen med minne.

KFence oppnår minimal belastningsuavhengig overhead ved å sette inn beskyttelsessider i haugen med faste intervaller. Etter at neste beskyttelsesintervall er utløpt, legger KFence, gjennom standard minneallokeringssystemet (SLAB eller SLUB-allokator), til neste beskyttelsesside fra KFence-objektpoolen, og starter en ny tidtellerrapport. Hvert KFence-objekt er plassert på en egen minneside, og minnesidene langs venstre og høyre kant danner beskyttelsessider, hvis størrelse velges tilfeldig.

Dermed er sider med objekter atskilt fra hverandre av beskyttelsessider, som er konfigurert til å generere en "sidefeil" ved enhver tilgang. For å oppdage skriv utenfor grensen på objektsider, brukes i tillegg mønsterbaserte "røde soner", som opptar minne som ikke brukes av objekter, og som gjenstår når størrelsen på minnesidene er justert. —+————+————+————+————+————+— | 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: SONE | xxxxxxxxx | SONE: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Hvis det gjøres et forsøk på å få tilgang til et område utenfor buffergrensene, påvirker operasjonen beskyttelsessiden, noe som fører til generering av en "sidefeil", som fanger opp KFence og logger informasjon om det identifiserte problemet. Som standard blokkerer ikke KFence en feil og viser bare en advarsel i loggen, men det er en "panic_on_warn"-innstilling som lar deg sette kjernen i panikktilstand hvis en feil oppdages.

Kilde: opennet.ru

Legg til en kommentar