Linux 5.12 միջուկը ընդունել է KFence ենթահամակարգը՝ հիշողության հետ աշխատելիս սխալները հայտնաբերելու համար

Linux միջուկը 5.12-ը, որը մշակման փուլում է, ներառում է KFence (Kernel Electric Fence) մեխանիզմի ներդրումը, որը ստուգում է հիշողության կառավարումը, բռնելով բուֆերի գերազանցումները, հիշողության հասանելիությունը ազատելուց հետո և նմանատիպ դասի այլ սխալներ:

Նմանատիպ ֆունկցիոնալությունն արդեն առկա էր միջուկում՝ KASAN-ի կառուցման տարբերակի տեսքով (միջուկի հասցեի ախտահանիչ, օգտագործում է Address Sanitizer-ը ժամանակակից gcc-ում և clang-ում), սակայն այն հիմնականում տեղադրվել էր վրիպազերծման օգտագործման համար: KFence ենթահամակարգը տարբերվում է KASAN-ից իր բարձր գործառնական արագությամբ, ինչը հնարավորություն է տալիս օգտագործել այս հնարավորությունը նույնիսկ աշխատանքային համակարգերի միջուկների վրա:

Արտադրական համակարգերում կիրառումը հնարավորություն կտա հայտնաբերել հիշողության սխալները, որոնք չեն երևում թեստային գործարկումներում և ի հայտ են գալիս միայն աշխատանքային ծանրաբեռնվածության կամ երկարաժամկետ շահագործման ժամանակ (մեծ գործարկման ժամանակ): Բացի այդ, KFence-ի օգտագործումը արտադրական համակարգերում հնարավորություն կտա էապես ավելացնել մեքենաների քանակը, որոնք ներգրավված են միջուկի աշխատանքը հիշողությամբ ստուգելու մեջ:

KFence-ը հասնում է նվազագույն ծանրաբեռնվածությունից անկախ վերին ծախսերին՝ ֆիքսված ընդմիջումներով պահակային էջերը կույտի մեջ տեղադրելով: Հաջորդ պաշտպանության միջակայքի ժամկետը լրանալուց հետո KFence-ը ստանդարտ հիշողության բաշխման համակարգի միջոցով (SLAB կամ SLUB հատկացուցիչ) ավելացնում է հաջորդ պաշտպանական էջը KFence օբյեկտների լողավազանից և սկսում ժամանակի հաշվիչի նոր հաշվետվություն: KFence-ի յուրաքանչյուր օբյեկտ գտնվում է առանձին հիշողության էջում, իսկ ձախ և աջ եզրագծերի երկայնքով հիշողության էջերը կազմում են պահակային էջեր, որոնց չափերը ընտրվում են պատահականորեն:

Այսպիսով, օբյեկտներով էջերը միմյանցից բաժանվում են պաշտպանական էջերով, որոնք կազմաձևված են ցանկացած մուտքի դեպքում «էջի սխալ» առաջացնելու համար: Օբյեկտների էջերի ներսում սահմանից դուրս գրությունները հայտնաբերելու համար լրացուցիչ օգտագործվում են օրինաչափության վրա հիմնված «կարմիր գոտիներ», որոնք զբաղեցնում են հիշողությունը, որը չի օգտագործվում օբյեկտների կողմից և մնում է, երբ հիշողության էջերի չափերը հավասարեցվում են: —+————+————+————+————+————+— | xxxxxxxxxx | O: | xxxxxxxxxx | :O | xxxxxxxxxx | | xxxxxxxxxx | Բ: | xxxxxxxxxx | :B | xxxxxxxxxx | | x ՊԱՀԱԿԱՆ x | J՝ ԿԱՐՄԻՐ- | x ՊԱՀԱԿԱՆ x | ԿԱՐՄԻՐ-՝ J | x ՊԱՀԱԿԱՆ x | | xxxxxxxxxx | E. ԳՈՏԻ | xxxxxxxxxx | ԳՈՏԻ՝ E | xxxxxxxxxx | | xxxxxxxxxx | C: | xxxxxxxxxx | :C | xxxxxxxxxx | | xxxxxxxxx | Տ՝ | xxxxxxxxx | ՝ T | xxxxxxxxx | —+————+————+————+———+————+—

Եթե ​​փորձ է արվում մուտք գործել բուֆերային սահմաններից դուրս գտնվող տարածք, գործողությունը ազդում է պաշտպանության էջի վրա, ինչը հանգեցնում է «էջի սխալի» առաջացմանը, որը ընդհատում է KFence-ը և գրանցում հայտնաբերված խնդրի մասին տեղեկատվությունը: Լռելյայնորեն, KFence-ը չի արգելափակում սխալը և միայն նախազգուշացում է ցուցադրում գրանցամատյանում, բայց կա «panic_on_warn» պարամետր, որը թույլ է տալիս միջուկը խուճապի մեջ դնել, եթե սխալ հայտնաբերվի:

Source: opennet.ru

Добавить комментарий