La Linukso 5.12-kerno adoptis la KFence-subsistemon por detekti erarojn dum laboro kun memoro

La Linukso-kerno 5.12, kiu estas en evoluo, inkluzivas efektivigon de la mekanismo de KFence (Kernel Electric Fence), kiu kontrolas memortraktadon, kaptante bufrotranspasojn, memoralirojn post liberigo, kaj aliajn erarojn de simila klaso.

Simila funkcieco jam ĉeestis en la kerno en la formo de la KASAN-konstrua opcio (kernel-adres-malpurigilo, uzas Address Sanitizer en moderna gcc kaj clang) - tamen, ĝi estis poziciigita ĉefe por sencimiga uzo. La subsistemo KFence diferencas de KASAN per sia alta operacia rapideco, kiu ebligas uzi ĉi tiun funkcion eĉ sur kernoj en laborsistemoj.

Apliko sur produktadsistemoj ebligos kapti memorajn erarojn, kiuj ne aperas en provaj kuroj kaj aperas nur dum laborŝarĝoj aŭ dum longdaŭra funkciado (kun granda funkciado). Krome, la uzo de KFence sur produktadsistemoj ebligos signife pliigi la nombron da maŝinoj implikitaj en kontrolado de la funkciado de la kerno kun memoro.

KFence atingas minimuman ŝarĝon-sendependan superkoston enmetante gardajn paĝojn en la amason je fiksaj intervaloj. Post kiam la sekva protekto-intervalo eksvalidiĝis, KFence, per la norma memor-atribua sistemo (SLAB aŭ SLUB-asignilo), aldonas la sekvan protektan paĝon de la KFence-objekta naĝejo, kaj komencas novan tempkalkulraporton. Ĉiu KFence-objekto situas en aparta memorpaĝo, kaj la memorpaĝoj laŭ la maldekstra kaj dekstra randoj formas gardajn paĝojn, kies grandeco estas elektita hazarde.

Tiel, paĝoj kun objektoj estas apartigitaj unu de la alia per protektaj paĝoj, kiuj estas agorditaj por generi "paĝan misfunkciadon" ĉe iu ajn aliro. Por detekti eksterlimajn skribaĵojn ene de objektopaĝoj, padron-bazitaj "ruĝaj zonoj" estas aldone uzataj, kiuj okupas memoron ne uzatan de objektoj, restante kiam la grandeco de memorpaĝoj estas vicigita. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GARDISTO x | J : RUĜA- | x GARDISTO x | RED- : J | x GARDISTO x | | xxxxxxxxx | E: ZONO | xxxxxxxxx | ZONO: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Se oni provos aliri areon ekster la bufrolimoj, la operacio influas la protektan paĝon, kio kondukas al la generacio de "paĝa faŭlto", kiu kaptas KFence kaj registras informojn pri la detektita problemo. Defaŭlte, KFence ne blokas eraron kaj nur montras averton en la protokolo, sed ekzistas agordo "panic_on_warn", kiu permesas vin meti la kernon en panikan staton se eraro estas detektita.

fonto: opennet.ru

Aldoni komenton