Linux 5.12-kernen har adopteret KFence-undersystemet for at opdage fejl, når der arbejdes med hukommelse

Linux-kernen 5.12, som er under udvikling, inkluderer en implementering af KFence (Kernel Electric Fence) mekanismen, som kontrollerer hukommelseshåndtering, fanger bufferoverskridelser, hukommelsesadgang efter frigørelse og andre fejl af en lignende klasse.

Lignende funktionalitet var allerede til stede i kernen i form af KASAN-byggemuligheden (kerneadressesanering, bruger Address Sanitizer i moderne gcc og clang) - den var dog primært placeret til brug ved fejlfinding. KFence-undersystemet adskiller sig fra KASAN ved dets høje driftshastighed, hvilket gør det muligt at bruge denne funktion selv på kerner i arbejdssystemer.

Applikation på produktionssystemer vil gøre det muligt at fange hukommelsesfejl, der ikke optræder i testkørsler og kun vises under arbejdsbelastninger eller under langvarig drift (med stor oppetid). Derudover vil brugen af ​​KFence på produktionssystemer gøre det muligt markant at øge antallet af maskiner, der er involveret i at kontrollere driften af ​​kernen med hukommelse.

KFence opnår minimal belastningsuafhængig overhead ved at indsætte beskyttelsessider i bunken med faste intervaller. Efter det næste beskyttelsesinterval er udløbet, tilføjer KFence gennem standardhukommelsesallokeringssystemet (SLAB eller SLUB-allokator) den næste beskyttelsesside fra KFence-objektpuljen og starter en ny tidstællerrapport. Hvert KFence-objekt er placeret på en separat hukommelsesside, og hukommelsessiderne langs venstre og højre grænser danner beskyttelsessider, hvis størrelse er valgt tilfældigt.

Således er sider med objekter adskilt fra hinanden af ​​beskyttelsessider, som er konfigureret til at generere en "sidefejl" ved enhver adgang. For at detektere skriveoperationer uden for grænsen inde i objektsider, bruges der desuden mønsterbaserede "røde zoner", som optager hukommelse, der ikke bruges af objekter, og som er tilbage, når størrelsen af ​​hukommelsessider er justeret. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x VÆGT x | J : RØD- | x VÆGT x | RØD- : J | x VÆGT x | | xxxxxxxxx | E: ZONE | xxxxxxxxx | ZONE: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Hvis der gøres et forsøg på at få adgang til et område uden for buffergrænserne, påvirker operationen beskyttelsessiden, hvilket fører til generering af en "sidefejl", som opsnapper KFence og logger information om det identificerede problem. Som standard blokerer KFence ikke en fejl og viser kun en advarsel i loggen, men der er en "panic_on_warn"-indstilling, der tillader dig at sætte kernen i en paniktilstand, hvis der opdages en fejl.

Kilde: opennet.ru

Tilføj en kommentar