Jezgra u razvoju Linux 5.12 включена реализация механизма KFence (Kernel Electric Fence), который проверяет работу с памятью, отлавливая выход за границы буферов, обращения к памяти после освобождения и другие ошибки подобного класса.
Slična funkcionalnost već je bila prisutna u kernelu u obliku opcije izgradnje KASAN (kernel address sanitizer, koristi Address Sanitizer u modernim gcc i clang) - međutim, bila je postavljena uglavnom za ispravljanje pogrešaka. Podsustav KFence razlikuje se od KASAN-a velikom brzinom rada, što omogućuje korištenje ove značajke čak i na jezgrama u radnim sustavima.
Primjena na proizvodnim sustavima omogućit će hvatanje memorijskih grešaka koje se ne pojavljuju u testnim izvođenjima i pojavljuju se samo tijekom radnih opterećenja ili tijekom dugotrajnog rada (s velikim uptimeom). Osim toga, korištenje KFencea na proizvodnim sustavima omogućit će značajno povećanje broja strojeva uključenih u provjeru rada kernela s memorijom.
KFence postiže minimalno opterećenje neovisno o učitavanju umetanjem zaštitnih stranica u hrpu u fiksnim intervalima. Nakon isteka sljedećeg zaštitnog intervala, KFence, putem standardnog sustava dodjele memorije (SLAB ili SLUB alokator), dodaje sljedeću zaštitnu stranicu iz KFence skupa objekata i pokreće novo izvješće o brojaču vremena. Svaki KFence objekt nalazi se na zasebnoj memorijskoj stranici, a memorijske stranice duž lijevog i desnog ruba tvore zaštitne stranice, čija se veličina odabire nasumično.
Stoga su stranice s objektima odvojene jedna od druge zaštitnim stranicama, koje su konfigurirane da generiraju "pogrešku stranice" nakon bilo kakvog pristupa. Za otkrivanje pisanja izvan granica unutar stranica objekta, dodatno se koriste "crvene zone" temeljene na uzorku, koje zauzimaju memoriju koju objekti ne koriste, a ostaju kada se veličina memorijskih stranica poravna. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x STRAŽAR x | J : CRVENA- | x STRAŽAR x | CRVENA- : J | x STRAŽAR x | | xxxxxxxxx | E: ZONA | xxxxxxxxx | ZONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—
Ako se pokuša pristupiti području izvan granica međuspremnika, operacija utječe na zaštitnu stranicu, što dovodi do stvaranja "pogreške stranice", koja presreće KFence i bilježi informacije o identificiranom problemu. Prema zadanim postavkama, KFence ne blokira pogrešku i samo prikazuje upozorenje u zapisniku, ali postoji postavka “panic_on_warn” koja vam omogućuje da kernel stavite u stanje panike ako se otkrije pogreška.
Izvor: opennet.ru
