Linux 5.12 kodols ir izmantojis KFence apakšsistēmu, lai atklātu kļūdas, strādājot ar atmiņu

Linux kodols 5.12, kas tiek izstrādāts, ietver KFence (Kernel Electric Fence) mehānisma ieviešanu, kas pārbauda atmiņas apstrādi, bufera pārtēriņu uztveršanu, atmiņas piekļuvi pēc atbrīvošanas un citas līdzīgas klases kļūdas.

Līdzīga funkcionalitāte jau bija kodolā KASAN veidošanas opcijas veidā (kodola adrešu tīrīšanas līdzeklis, mūsdienu gcc un clang izmanto Address Sanitizer) - tomēr tas tika novietots galvenokārt atkļūdošanas lietošanai. KFence apakšsistēma no KASAN atšķiras ar savu lielo darbības ātrumu, kas ļauj izmantot šo funkciju pat uz kodoliem strādājošās sistēmās.

Lietojumprogramma ražošanas sistēmās ļaus noķert atmiņas kļūdas, kas neparādās testa braucienos un parādās tikai darba slodzes vai ilgstošas ​​darbības laikā (ar lielu darbības laiku). Turklāt KFence izmantošana ražošanas sistēmās ļaus ievērojami palielināt to mašīnu skaitu, kas iesaistītas kodola darbības pārbaudē ar atmiņu.

KFence nodrošina minimālu no slodzes neatkarīgu pieskaitāmo izdevumu, ievietojot aizsarglapas kaudzē ar noteiktiem intervāliem. Kad nākamais aizsardzības intervāls ir beidzies, KFence, izmantojot standarta atmiņas piešķiršanas sistēmu (SLAB vai SLUB sadalītāju), pievieno nākamo aizsardzības lapu no KFence objektu kopas un sāk jaunu laika skaitītāja atskaiti. Katrs KFence objekts atrodas atsevišķā atmiņas lapā, un atmiņas lapas gar kreiso un labo malu veido aizsarglapas, kuru lielums tiek izvēlēts nejauši.

Tādējādi lapas ar objektiem tiek atdalītas viena no otras ar aizsardzības lapām, kas ir konfigurētas tā, lai jebkuras piekļuves gadījumā ģenerētu “lapas kļūdu”. Lai noteiktu ārpusrobežu rakstīšanas darbības objektu lapās, papildus tiek izmantotas uz rakstiem balstītas “sarkanās zonas”, kas aizņem objektu neizmantoto atmiņu, kas paliek, kad atmiņas lapu izmērs ir izlīdzināts. —+————+————+————+————+————+— | xxxxxxxxxx | O: | xxxxxxxxxx | :O | xxxxxxxxxx | | xxxxxxxxxx | B: | xxxxxxxxxx | :B | xxxxxxxxxx | | x SARGS x | J : RED- | x SARGS x | RED- : J | x SARGS x | | xxxxxxxxxx | E: ZONA | xxxxxxxxxx | ZONA: E | xxxxxxxxxx | | xxxxxxxxxx | C: | xxxxxxxxxx | :C | xxxxxxxxxx | | xxxxxxxxxx | T: | xxxxxxxxxx | : T | xxxxxxxxxx | —+————+————+————+————+————+—

Ja tiek mēģināts piekļūt apgabalam ārpus bufera robežām, darbība ietekmē aizsardzības lapu, kas noved pie “lapas kļūdas” ģenerēšanas, kas pārtver KFence un reģistrē informāciju par identificēto problēmu. Pēc noklusējuma KFence nebloķē kļūdu un žurnālā parāda tikai brīdinājumu, taču ir iestatījums “panic_on_warn”, kas ļauj iestatīt kodolu panikas stāvoklī, ja tiek atklāta kļūda.

Avots: opennet.ru

Pievieno komentāru