Linux 5.12 branduolys priėmė KFence posistemį, kad aptiktų klaidas dirbant su atmintimi

Kuriamame „Linux“ branduolyje 5.12 yra įdiegtas mechanizmas KFence (Kernel Electric Fence), kuris tikrina atminties tvarkymą, buferio viršijimo gaudymą, atminties prieigą po atlaisvinimo ir kitas panašios klasės klaidas.

Panašios funkcijos jau buvo branduolyje kaip KASAN kūrimo parinktis (branduolio adresų dezinfekavimo priemonė, naudoja Address Sanitizer šiuolaikiniuose gcc ir clang), tačiau ji buvo skirta daugiausia derinimo naudojimui. KFence posistemis nuo KASAN skiriasi dideliu veikimo greičiu, todėl šią funkciją galima naudoti net veikiančių sistemų branduoliuose.

Taikymas gamybinėse sistemose leis užfiksuoti atminties klaidas, kurios nepasirodo bandomuosiuose paleidimuose ir atsiranda tik darbo krūvio metu arba ilgalaikio veikimo metu (su dideliu veikimo laiku). Be to, KFence naudojimas gamybos sistemose leis žymiai padidinti mašinų, dalyvaujančių tikrinant branduolio veikimą su atmintimi, skaičių.

KFence pasiekia minimalias nuo apkrovos nepriklausančias pridėtines išlaidas, įdėdama apsauginius lapus į krūvą fiksuotais intervalais. Pasibaigus kitam apsaugos intervalui, KFence per standartinę atminties paskirstymo sistemą (SLAB arba SLUB skirstytuvą) prideda kitą apsaugos puslapį iš KFence objektų telkinio ir pradeda naują laiko skaitiklio ataskaitą. Kiekvienas KFence objektas yra atskirame atminties puslapyje, o atminties puslapiai išilgai kairiojo ir dešiniojo krašto sudaro apsauginius puslapius, kurių dydis parenkamas atsitiktinai.

Taigi puslapiai su objektais yra atskirti vienas nuo kito apsaugos puslapiais, kurie sukonfigūruoti generuoti „puslapio gedimą“ bet kurios prieigos metu. Norint aptikti užribines rašymo operacijas objektų puslapiuose, papildomai naudojamos šablonais pagrįstos „raudonosios zonos“, kurios užima objektų nenaudojamą atmintį, likusią, kai sulygiuotas atminties puslapių dydis. —+————+————+————+————+————+— | xxxxxxxxxx | O: | xxxxxxxxxx | :O | xxxxxxxxxx | | xxxxxxxxxx | B: | xxxxxxxxxx | :B | xxxxxxxxxx | | x SAUGYS x | J : RAUDONA- | x SAUGYS x | RAUDONA- : J | x SAUGYS x | | xxxxxxxxxx | E: ZONA | xxxxxxxxxx | ZONA: E | xxxxxxxxxx | | xxxxxxxxxx | C: | xxxxxxxxxx | :C | xxxxxxxxxx | | xxxxxxxxxx | T: | xxxxxxxxxx | : T | xxxxxxxxxx | —+————+————+————+————+————+—

Jei bandoma pasiekti sritį, esančią už buferio ribų, operacija paveikia apsaugos puslapį, dėl kurio generuojamas „puslapio gedimas“, kuris perima KFence ir registruoja informaciją apie aptiktą problemą. Pagal numatytuosius nustatymus KFence neblokuoja klaidos ir žurnale rodo tik įspėjimą, tačiau yra „panic_on_warn“ nustatymas, leidžiantis nustatyti branduolio panikos būseną, jei aptinkama klaida.

Šaltinis: opennet.ru

Добавить комментарий