Linux 5.12 yadrosi xotira bilan ishlashda xatolarni aniqlash uchun KFence quyi tizimini qabul qildi.

Ishlab chiqilayotgan Linux yadrosi 5.12 KFence (Kernel Electric Fence) mexanizmini amalga oshirishni o'z ichiga oladi, u xotirani qayta ishlashni, buferning ortiqcha yuklanishini, bo'shatilgandan keyin xotiraga kirishni va shunga o'xshash sinfdagi boshqa xatolarni tekshiradi.

Shunga o'xshash funksionallik yadroda KASAN qurish opsiyasi ko'rinishida allaqachon mavjud edi (yadro manzilini tozalash vositasi, zamonaviy gcc va clang-da Address Sanitizer-dan foydalanadi) - ammo u asosan disk raskadrovka foydalanish uchun joylashtirilgan. KFence quyi tizimi KASAN dan yuqori ish tezligi bilan ajralib turadi, bu esa ushbu xususiyatdan hatto ishchi tizimlardagi yadrolarda ham foydalanish imkonini beradi.

Ishlab chiqarish tizimlarida qo'llanilishi test sinovlarida ko'rinmaydigan va faqat ish yuklari paytida yoki uzoq muddatli ish paytida (katta ish vaqti bilan) paydo bo'ladigan xotira xatolarini ushlash imkonini beradi. Bundan tashqari, ishlab chiqarish tizimlarida KFence dan foydalanish yadroning xotira bilan ishlashini tekshirishda ishtirok etadigan mashinalar sonini sezilarli darajada oshirish imkonini beradi.

KFence belgilangan vaqt oralig'ida to'pga himoya sahifalarini kiritish orqali minimal yukdan mustaqil qo'shimcha xarajatlarga erishadi. Keyingi himoya oralig'i tugagandan so'ng, KFence standart xotira ajratish tizimi (SLAB yoki SLUB ajratuvchisi) orqali KFence ob'ektlari hovuzidan keyingi himoya sahifasini qo'shadi va yangi vaqt hisoblagichi hisobotini boshlaydi. Har bir KFence ob'ekti alohida xotira sahifasida joylashgan bo'lib, chap va o'ng chegaralar bo'ylab xotira sahifalari o'lchami tasodifiy tanlangan himoya sahifalarini tashkil qiladi.

Shunday qilib, ob'ektlarga ega sahifalar bir-biridan himoya sahifalari bilan ajratiladi, ular har qanday kirishda "sahifa xatosi" ni yaratish uchun tuzilgan. Ob'ekt sahifalari ichidagi chegaradan tashqari yozuvlarni aniqlash uchun qo'shimcha ravishda naqshga asoslangan "qizil zonalar" qo'llaniladi, ular ob'ektlar tomonidan foydalanilmaydigan xotirani egallaydi, xotira sahifalarining o'lchami tekislanganda qoladi. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GUARD x | J : QIZIL- | x GUARD x | QIZIL- : J | x GUARD x | | xxxxxxxxx | E: ZONE | xxxxxxxxx | ZONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Agar bufer chegaralaridan tashqaridagi hududga kirishga urinish bo'lsa, operatsiya himoya sahifasiga ta'sir qiladi, bu "sahifa xatosi" ning paydo bo'lishiga olib keladi, bu KFence-ni to'xtatadi va aniqlangan muammo haqida ma'lumotni qayd qiladi. Odatiy bo'lib, KFence xatoni bloklamaydi va faqat jurnalda ogohlantirishni ko'rsatadi, ammo xato aniqlansa, yadroni vahima holatiga qo'yish imkonini beruvchi "panic_on_warn" sozlamasi mavjud.

Manba: opennet.ru

a Izoh qo'shish