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