Linux 5.12 -ydin on ottanut käyttöön KFence-alijärjestelmän, joka havaitsee virheet muistia käytettäessä

Kehitettävissä oleva Linux-ydin 5.12 sisältää KFence-mekanismin (Kernel Electric Fence) -toteutuksen, joka tarkistaa muistin käsittelyn, puskurin ylitysten sieppaamisen, muistin käytön vapauttamisen jälkeen ja muut vastaavan luokan virheet.

Samanlainen toiminnallisuus oli jo ytimessä KASAN-koontioption muodossa (ytimen osoitteen sanitizer, käyttää Address Sanitizeria nykyaikaisessa gcc:ssä ja clangissa) - se oli kuitenkin sijoitettu pääasiassa virheenkorjauskäyttöön. KFence-alijärjestelmä eroaa KASANista suurella toimintanopeudellaan, mikä mahdollistaa tämän ominaisuuden käytön myös toimivien järjestelmien ytimillä.

Sovellus tuotantojärjestelmissä mahdollistaa sellaisten muistivirheiden havaitsemisen, jotka eivät näy testiajoissa ja näkyvät vain työkuormituksen aikana tai pitkäaikaisen käytön aikana (suurella käytettävyydellä). Lisäksi KFencen käyttö tuotantojärjestelmissä mahdollistaa ytimen toiminnan muistilla tarkastamiseen osallistuvien koneiden määrän lisäämisen merkittävästi.

KFence saavuttaa minimaaliset kuormituksesta riippumattomat ylimääräiset kustannukset lisäämällä suojasivuja kasaan määrätyin väliajoin. Kun seuraava suojausväli on umpeutunut, KFence lisää tavallisen muistinvarausjärjestelmän (SLAB- tai SLUB-allokaattorin) kautta seuraavan suojaussivun KFence-objektivarannosta ja aloittaa uuden aikalaskuriraportin. Jokainen KFence-objekti sijaitsee erillisellä muistisivulla, ja vasemman ja oikean reunan muistisivut muodostavat suojasivuja, joiden koko valitaan satunnaisesti.

Siten sivut, joissa on objekteja, erotetaan toisistaan ​​suojasivuilla, jotka on määritetty luomaan "sivuvirhe" milloin tahansa pääsyn yhteydessä. Objektisivujen sisäisten rajojen ulkopuolisten kirjoitustoimintojen havaitsemiseksi käytetään lisäksi kuviopohjaisia ​​"punaisia ​​vyöhykkeitä", jotka vievät muistia, jota objektit eivät käytä ja jää jäljelle, kun muistisivujen koko on kohdistettu. —+————+————+————+————+————+— | xxxxxxxxxx | O: | xxxxxxxxxx | :O | xxxxxxxxxx | | xxxxxxxxxx | B: | xxxxxxxxxx | :B | xxxxxxxxxx | | x SUOJA x | J : PUNAINEN- | x SUOJA x | PUNAINEN- : J | x SUOJA x | | xxxxxxxxxx | E: ZONE | xxxxxxxxxx | VYÖHYKE: E | xxxxxxxxxx | | xxxxxxxxxx | C: | xxxxxxxxxx | :C | xxxxxxxxxx | | xxxxxxxxxx | T: | xxxxxxxxxx | : T | xxxxxxxxxx | —+————+————+————+————+————+—

Jos puskurin rajojen ulkopuolella olevalle alueelle yritetään päästä, toiminto vaikuttaa suojaussivuun, mikä johtaa "sivuvirheen" syntymiseen, joka sieppaa KFencen ja kirjaa tietoja havaitusta ongelmasta. Oletuksena KFence ei estä virhettä ja näyttää vain varoituksen lokissa, mutta olemassa on "panic_on_warn"-asetus, jonka avulla voit asettaa ytimen paniikkitilaan, jos virhe havaitaan.

Lähde: opennet.ru

Lisää kommentti