Ang Linux 5.12 kernel ay nagpatibay ng KFence subsystem upang makita ang mga error kapag nagtatrabaho sa memorya

Ang Linux kernel 5.12, na nasa pagbuo, ay may kasamang pagpapatupad ng KFence (Kernel Electric Fence) na mekanismo, na sumusuri sa memory handling, catching buffer overruns, memory accesses pagkatapos ng freeing, at iba pang mga error ng katulad na klase.

Ang katulad na functionality ay mayroon na sa kernel sa anyo ng KASAN build option (kernel address sanitizer, gumagamit ng Address Sanitizer sa modernong gcc at clang) - gayunpaman, ito ay nakaposisyon pangunahin para sa paggamit ng pag-debug. Ang subsystem ng KFence ay naiiba sa KASAN sa mataas na bilis ng pagpapatakbo nito, na ginagawang posible na gamitin ang tampok na ito kahit na sa mga core sa mga gumaganang sistema.

Ang aplikasyon sa mga sistema ng produksyon ay magiging posible upang mahuli ang mga error sa memorya na hindi lumilitaw sa mga pagsubok na tumatakbo at lumilitaw lamang sa panahon ng mga workload o sa panahon ng pangmatagalang operasyon (na may malaking uptime). Bilang karagdagan, ang paggamit ng KFence sa mga sistema ng produksyon ay magiging posible upang makabuluhang taasan ang bilang ng mga makina na kasangkot sa pagsuri sa pagpapatakbo ng kernel na may memorya.

Nakakamit ng KFence ang kaunting load-independent na overhead sa pamamagitan ng pagpasok ng mga guard page sa heap sa mga nakapirming agwat. Matapos mag-expire ang susunod na agwat ng proteksyon, ang KFence, sa pamamagitan ng karaniwang sistema ng paglalaan ng memorya (SLAB o SLUB allocator), ay nagdaragdag ng susunod na pahina ng proteksyon mula sa KFence object pool, at magsisimula ng isang bagong ulat sa counter ng oras. Ang bawat bagay ng KFence ay matatagpuan sa isang hiwalay na pahina ng memorya, at ang mga pahina ng memorya sa kahabaan ng kaliwa at kanang mga hangganan ay bumubuo ng mga pahina ng bantay, ang laki nito ay pinili nang random.

Kaya, ang mga pahina na may mga bagay ay pinaghihiwalay mula sa isa't isa ng mga pahina ng proteksyon, na na-configure upang makabuo ng isang "fault sa pahina" sa anumang pag-access. Upang matukoy ang mga pagsusulat sa labas ng hangganan sa loob ng mga pahina ng bagay, ang nakabatay sa pattern na "mga pulang zone" ay ginagamit din, na sumasakop sa memorya na hindi ginagamit ng mga bagay, na natitira kapag ang laki ng mga pahina ng memorya ay nakahanay. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x GUARD x | J : PULANG- | x GUARD x | PULANG- : J | x GUARD x | | xxxxxxxxx | E: SONA | xxxxxxxxx | SONA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Kung ang isang pagtatangka ay ginawa upang ma-access ang isang lugar sa labas ng mga hangganan ng buffer, ang operasyon ay makakaapekto sa pahina ng proteksyon, na humahantong sa pagbuo ng isang "page fault", na humarang sa KFence at nag-log ng impormasyon tungkol sa natukoy na problema. Bilang default, hindi hinaharangan ng KFence ang isang error at nagpapakita lamang ng babala sa log, ngunit mayroong setting na "panic_on_warn" na nagbibigay-daan sa iyong ilagay ang kernel sa isang panic state kung may nakitang error.

Pinagmulan: opennet.ru

Magdagdag ng komento