MPU in STM32 MCUs - Arduino Myanmar

Breaking

Open Arduino for Myanmar

Saturday, June 9, 2018

MPU in STM32 MCUs


MPU in STM32 MCUs
MPU လို႕ေခၚတဲ့ Memory Protection Unit ကိုစတင္ေဆြေႏြးသြားမွာျဖစ္ပါတယ္။ အပိုင္းဆက္ေလး ေတြနဲ႕ေပါ့။ ကၽြန္ေတာ္တို႕တစ္ေတြ Memory Protection ကိုသံုးရတဲ့အဓိကရည္ရြယ္ခ်က္ကေတာ့ Memory ေပၚမွာမရွိတဲ့ Process တစ္ခုက Memory ကိုလွမ္းသံုးတာကိုကာကြယ္ဖို႕ရန္အတြက္ျဖစ္ပါ တယ္။ အဲဒီ process က malware လည္းျဖစ္ႏိုင္တယ္။ bug လည္းျဖစ္ႏိုင္တယ္။ ဒီလို process မ်ိဳး ကိုကာကြယ္ေပးလိုက္ျခင္းအားျဖင့္ Memory ေပၚမွာအလုပ္လုပ္ေနတဲ့ အျခားေသာ အလုပ္ေတြကို ထိခိုက္မႈမရွိေစမွာျဖစ္ပါတယ္။ Memory Protection ကိုလုပ္ေဆာင္ဖို႕ရန္အတြက္ နည္းလမ္းေတြ အမ်ားၾကီးရွိပါတယ္။

·         Segmentation         - Memory ကို အပိုင္းငယ္ေလးေတြအျဖစ္ပိုင္းျခားေပးတဲ့လုပ္ငန္းစဥ္ ျဖစ္ပါတယ္။ Memory Location ရဲ႕ Reference မွာ အပိုင္းငယ္ေလးေတြကိုခြဲျခားထားတဲ့ တန္းဖိုးတစ္ခုပါ၀င္ပါတယ္။ ေနာက္ေတာ့ Memory အပိုင္းငယ္ေလးေတြရဲ႕ ၾကားမွာ offset တစ္ခုလည္းပါ၀င္ပါတယ္။ 32 bit (x86) processors ေတြမွာဆိုရင္ Segment Register (4) ခုရွိပါတယ္။ CS(Code Segment), SS(Stack Segment), DS(Data Segment) နဲ႕ ES(Extra Segment) တို႕ျဖစ္ၾကပါတယ္။ ေနာက္ပိုင္းထပ္ထည့္လို္က္တဲ့ Segment ေတြက ေတာ့ FS နဲ႕ GS တို႕ျဖစ္ၾကပါတယ္။

STM32 မွာ MPU ကို Manage လုပ္မယ့္အေၾကာင္းကို ဆက္လက္ေဆြးေႏြးသြားပါ့မယ္။
 အရင္ဆံုး MPU ကိုမသံုးခင္ STM32 Microcontroller ရဲ႕ MPU ကို enable လုပ္ထားရပါမယ္။ program ေရး ထားရမယ္ေပါ့ဗ်ာ၊ MPU ကို မျဖစ္မေန enable လုပ္ထားခဲ့ရမွာပါ။ MPU ကို enable လုပ္မထားခဲ့ဘူး ဆိုရင္ မိမိ manage လုပ္သမ်ွက Memory အေပၚမွာ ဘာသက္ေရာက္မႈ မွရွိမွာမဟုတ္ပါဘူး။ MPU ကို Support ေပးတဲ့ STM32 ေတြကေတာ့ ARM Cortex M0+/M3/M4 နဲ႕ M7 တို႕ျဖစ္ၾကပါတယ္။ STM32F1 Series, STM32F2 Series, STM32F3 Series, STM32F7 Series, STM32L0 Series, STM32L1 Series, STM32L4 Series ေတြနဲ႕ STM32H7 Series ေတြမွာ MPU ကို support ေပး ထားကိုေတြ႕ရပါမယ္။ ပိုျပီးေတာ့ လံုျခံဳ ျပည့္စံုတဲ့ Embedded System တစ္ခုကို MPU သံုးျပီးေတာ့ ဖန္တီးျပဳလုပ္ႏိုင္ပါတယ္။ အဲဒီလိုမ်ိဳးပိုေကာင္းတဲ့ Embedded System တစ္ခုကိုတည္ေဆာက္ဖို႕ရန္ အတြက္ေအာက္ပါလုပ္ငန္းစဥ္ေတြကို ေဆာင္ရြက္ေပးရမွာျဖစ္ပါတယ္။

·         OS Kernal လိုမ်ိဳးအေရးၾကီးတဲ့ လုပ္ငန္းစဥ္ေတြကေနသံုးမယ့္ data ေတြကိုဖ်က္ဆီးပစ္မယ့္ User Application ေတြကိုတားျမစ္ထားရမွာျဖစ္ပါတယ္။


·         Injection လုပ္တာကိုကာကြယ္ႏိုင္ဖို႕အတြက္ SRAM Memory ကို non-executable အျဖစ္ သတ္မွတ္ထားရပါမယ္။ Code Injection အေၾကာင္းကို Java Program တစ္ခုနဲ႕ ရွင္းျပျပီး ေတာ့စာေရးပါဦးမယ္။
·         Memory Access Attributes ေတြကိုေျပာင္းလဲေပးရပါမယ္။
Memory Region ၁၆ ခု အထက္ကို ကာကြယ္ႏိုင္ဖို႕အတြက္ MPU ကိုအသံုးျပဳႏိုင္ပါတယ္။ Memory Region ၁ ခုဟာ 256 bytes အနည္းဆံုးရွိမယ္ဆိုရင္ အဲ့ဒီ Memory မွာ Sub-Region အေနနဲ႕ စုစုေပါင္း ၈ ခုရွိျပန္ပါတယ္။ Sub-Regions တစ္ခုခ်င္းစီဟာဆိုရင္ တစ္ခုနဲ႕ တစ္ခု size တူၾကပါတယ္။ ဘာလို႕လဲဆိုေတာ့ အငယ္ဆံုး Memory Region Size ဟာ Cache Line ကေနထိန္းခ်ဳပ္လို႕ျဖစ္ပါတယ္။ Cache Line ဟာ Length အေနနဲ႕ 32 bytes ရွိ ပါတယ္။ ဒါဆိုရင္ ေစာနက ကၽြန္ေတာ္ေျပာခဲ့တဲ့ 32 bytes အရြယ္အစားရွိတဲ့ Sub-region စုစု ေပါင္းရွစ္ခုမွာဆိုရင္ 256 bytes ရွိပါတယ္။ (8x32=256) ျဖစ္ပါတယ္။ Regions ေတြဟာဆို ရင္ 0 (သုည) ကေန 15 (ဆယ့္ငါး) အထိနံပါတ္စဥ္ အတိုင္းရွိေနပါတယ္။ Default Region ဆိုျပီးေတာ့လည္း ရွိပါေသးတယ္။ သူ႕ရဲ႕ ID ကေတာ့ (-1) ျဖစ္ပါတယ္။ 0-15 အထိ Memory Regions ေတြဟာဆိုရင္ Default Region ထက္ပိုျပီးေတာ့ Priority ျမင့္ပါတယ္။

Region ေတြကို ထပ္ထားလို႕ nested အေနနဲ႕ တစ္ခုနဲ႕တစ္ခုေရာထားလို႕လည္းရပါတယ္။ Region နံပါတ္ 15 ဟာဆိုရင္ Priority အျမင့္ဆံုးျဖစ္ပါတယ္။ Region နံပါတ္ 0 ကေတာ့ Priority အနိမ့္ဆံုးပါခင္ဗ်။ Priority ဆိုတာဟာလည္း Region ေတြ Overlap (ထပ္) တဲ့အခါ မွာလိုအပ္ပါတယ္။ 
Priority ေတြဆိုတာ အေသသတ္မွတ္ထားတာျဖစ္ျပီးေတာ့ ေျပာင္းလဲလို႕ မရႏိုင္ပါဘူး။ ပံု (၁) မွာ Region ေတြကို Overlap လုပ္ျပထားပါတယ္။ ၾကည့္လိုက္ပါ။ ပံု (၁) က Region (6) ခုနဲ႕ဥပမာျပေပးထားတာပါ။ Region 4 ဟာ Region 0 နဲ႕ 1 ကို Overlap လုပ္ထားတာကို ျမင္ၾကမွာပါ။ Region 3 ထဲမွာဆိုရင္ေတာ့ Region 5 ကို Enclosed လုပ္ထားတာကို ေတြ႕ၾကရပါမယ္။ Priority ကို Ascending Order (ၾကီးရာမွငယ္ရာသို႕) စီစဥ္ထားတဲ့အတြက္ေၾကာင့္ လိေမၼာ္ေရာင္နဲ႕ျပထားတဲ့ Region ေတြက Priority ပိုျမင့္ပါ တယ္။ ဒါေၾကာင့္မို႕လို႕ Region 0 က Write လုပ္လို႕ရျပီးေတာ့ Region 4 က Write လုပ္လို႕မရခဲ့ရင္ Region 0 နဲ႕ 4 ရဲ႕ Overlap ျဖစ္စဥ္ထဲမွာၾကေရာက္ေနတဲ့ address တစ္ခု ဟာလည္း write လုပ္လို႕ရမွာမဟုတ္ပါဘူး။
MPU ဟာ unified ျဖစ္ပါတယ္။ unified ျဖစ္တယ္ဆိုတာဘာလည္းဆိုေတာ့ data အတြက္ region နဲ႕ instruction အတြက္ region ဆိုျပီးေတာ့ regions ေတြကိုခြဲျခားထားတာမဟုတ္ လို႕ပါ။ Cache လုိမ်ိဳး Memory attributes ေတြကိုသတ္မွတ္ဖို႕ရန္အတြက္လည္း MPU ကို အသံုးျပဳႏိုင္ပါတယ္။ Cacheability ဟာ System Level Cache Unit ထဲကို ထည့္လို႕ရပါ တယ္။ ဒါမွမဟုတ္ Memory Controller ဆီကိုထည့္လို႕လည္းရပါတယ္။ ARM Processor Architecture ရဲ႕ Memory Attribute Setting ေတြထဲမွာ Cache Level ႏွစ္ခုရွိပါတယ္။ အတြင္းပိုင္း cache (Inner Cache) နဲ႔ အျပင္ပိုင္း cache (Outer Cache) ဆိုျပီးေတာ့ေပါ့ေနာ္ ။ သို႕ေပသိ ခၽြင္းခ်က္အေနနဲ႕ STM32F7 series နဲ႕ STM32H7 Series ေတြမွာ Cache Level တစ္ခုသာလွ်င္ရွိပါတယ္။ (L1- Cache) Cache Control Register ကေနျပီးေတာ့ Cache ေတြကို ထိန္းခ်ဳပ္ပါတယ္။ သို႕ေပသိ Memory Region က cacheable ျဖစ္သလား မျဖစ္ဘူး လားဆိုတာကို MPU ကေနျပီးေတာ့ ခြဲျခားသိပါတယ္။ ဒါ့အျပင္ MPU ဟာ Cache Policy ကို သတ္မွတ္ႏိုင္ပါေသးတယ္။ ခၽြင္းခ်က္အေနနဲ႕ L1-Cache ရွိတဲ့ STM32F7 ေတြနဲ႕ STM32H7 ေတြအတြက္ေတာ့ Memory Region ကေန L1-Cache အတြက္ cache attributes ေတြကို သတ္မွတ္ဖို႕ရန္အတြက္ MPU ကခြင့္ေပးပါတယ္။
STM32 products ေတြရဲ႕ processor မွာ default memory map ကအေသသတ္မွတ္ထား တာရွိပါတယ္ခင္ဗ်ာ။ သူ႕ကိုေတာ့ ပံု(၂) မွာျပသထားပါတယ္။



Memory types
Memory အမ်ိဳးအစာ သံုးခုရွိပါတယ္။
        Normal Memory
Data bytes ေတြကို သိုေလွာင္ျခင္းနဲ႕ load(ဆြဲတင္) လုပ္ငန္းစဥ္ေတြကိုေဆာင္ရြက္ပါတယ္။ Normal Memory မွာဆိုရင္ သိုေလွာင္ျခင္း (store) နဲ႕ load(ဆြဲတင္ျခင္း) လုပ္ငန္းစဥ္ေတြကို CPU ကေဆာင္ရြက္စရာမလိုအပ္ပါဘူး။
        Device Memory
Device Memory ဆိုရင္ေတာ့ သိုေလွာင္ျခင္း (store) နဲ႕ load(ဆြဲတင္ျခင္း) လုပ္ငန္းစဥ္ေတြ ကိုအစီအစဥ္အလိုက္အတိအက် သတ္မွတ္ထားပါတယ္။ Registers ေတြကိုေတာ့ သင့္ေလ်ာ္
တဲ့ အစီအစဥ္အလိုက္အတိအက်သတ္မွတ္ထားဖို႕လိုအပ္ပါလိမ့္မယ္။
        Strongly Ordered Memory:
Program ေရးထည့္ထားတဲ့ အစီအစဥ္အတိုင္းဘဲ အကုန္လံုးကိုေဆာင္ရြက္ပါတယ္။ ဒီေနရာ မွာဆိုရင္ေတာ့ CPU ဟာ Program ထဲက ေနာက္ instruction တစ္ခုကိုအလုပ္မလုပ္ခင္ load/store လုပ္ငန္းစဥ္အလုပ္လုပ္တာျပီးဆံုးေအာင္ေစာင့္ေပးပါတယ္။ ဒါဟာလည္း Performance ကို သက္ေရာက္မႈရွိပါတယ္။

No comments:

Post a Comment