Ядрото на Linux 5.12 е приело подсистемата KFence за откриване на грешки при работа с памет

Ядрото на Linux 5.12, което е в процес на разработка, включва имплементация на механизма KFence (Kernel Electric Fence), който проверява обработката на паметта, улавя препълване на буфера, достъп до паметта след освобождаване и други грешки от подобен клас.

Подобна функционалност вече присъстваше в ядрото под формата на опцията за изграждане на KASAN (дезинфектант на адреса на ядрото, използва дезинфектант на адреси в съвременните gcc и clang) - но беше позициониран главно за използване при отстраняване на грешки. Подсистемата KFence се различава от KASAN с високата си скорост на работа, което прави възможно използването на тази функция дори на ядра в работещи системи.

Приложението върху производствените системи ще направи възможно улавянето на грешки в паметта, които не се появяват при тестови изпълнения и се появяват само по време на натоварвания или по време на дългосрочна работа (с голямо време за работа). В допълнение, използването на KFence в производствени системи ще направи възможно значително увеличаване на броя на машините, участващи в проверката на работата на ядрото с памет.

KFence постига минимално натоварване, независимо от натоварването, чрез вмъкване на предпазни страници в купчината на фиксирани интервали. След изтичане на следващия защитен интервал, KFence, чрез стандартната система за разпределение на паметта (SLAB или SLUB разпределител), добавя следващата защитна страница от обектния пул на KFence и стартира нов отчет за брояч на време. Всеки KFence обект се намира в отделна страница с памет, а страниците с памет по протежение на лявата и дясната граница образуват предпазни страници, чийто размер се избира произволно.

По този начин страниците с обекти са разделени една от друга чрез защитни страници, които са конфигурирани да генерират „неизправност на страницата“ при всеки достъп. За откриване на записи извън границите вътре в страниците на обекти допълнително се използват базирани на шаблони „червени зони“, които заемат памет, която не се използва от обекти, оставайки, когато размерът на страниците с памет е подравнен. —+————+————+————+————+————+— | xxxxxxxxx | О: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | Б: | xxxxxxxxx | :B | xxxxxxxxx | | x ПАЗАЧ x | J : ЧЕРВЕНО- | x ПАЗАЧ x | ЧЕРВЕНО- : J | x ПАЗАЧ x | | xxxxxxxxx | E: ЗОНА | xxxxxxxxx | ЗОНА: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | Т: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Ако се направи опит за достъп до област извън границите на буфера, операцията засяга защитната страница, което води до генериране на „страница грешка“, която прихваща KFence и регистрира информация за открития проблем. По подразбиране KFence не блокира грешка и само показва предупреждение в журнала, но има настройка „panic_on_warn“, която ви позволява да поставите ядрото в състояние на паника, ако бъде открита грешка.

Източник: opennet.ru

Добавяне на нов коментар