MMU全稱「Memory Management Unit」,顧名思義就是「內存管理單元」。編程
創建頁表描述符號表,將物理地址映射成虛擬地址,以虛擬地址爲媒介來操做和管理實際的物理內存。code
頁表描述符號表,是由用戶根據所使用的主芯片的頁表描述格式,去建立、修改和管理的,而內存則依據頁表描述符號表進行映射、權限控制等。頁表描述符號表在建立或修改後,須要將它寫入協處理器CP15才能生效,而協處理CP15正是內存管理的實際執行者。blog
綜合來講,對MMU操做就是經過修改頁表描述符和控制CP15協處理器來實現的,具體運做流程以下圖1所示。接口
Huawei LiteOS的MMU有兩個方面的做用:內存
系統內部有些內存不但願被修改,不然會形成不可預測的後果,此時能夠用MMU修改該段內存的訪問權限。訪問該段內存時會檢查訪問權限,若權限不正確則會觸發異常,起到保護該段內存數據的做用。開發
Huawei LiteOS中MMU模塊爲用戶提供如下接口:權限控制
功能分類 | 接口名 | 描述 |
---|---|---|
內存訪問權限控制 | LOS_MMUParamSet | 修改指定地址段的內存cache狀態、buffer狀態、讀寫權限狀態 |
參數:it
BUFFER_ENABLE/BUFFER_DISABLE ---- 使能/關閉buffer
CACHE_ENABLE/CACHE_DISABLE ---- 使能/關閉cache
ACCESS_PERM_RW_RW/ACCESS_PERM_RO_RO ---- 可讀寫/只讀
內存管理
舉例:table
LOS_MMUParamSet(&__text_start, &__text_end, BUFFER_ENABLE|CACHE_ENABLE|ACCESS_PERM_RO_RO);
描述:
將__text_start, __text_end這兩個地址之間的內存設置爲(寫回)啓用cache、 buffer、只讀。
說明
LOS_MMUParamSet的入參1和入參2須要4KB對齊,入參3最好是顯示的選擇以上列舉的3種類型的宏。
調用接口LOS_MMUParamSet,修改內存區域的讀寫權限,再經過在該內存區域進行寫操做,查看是否讀寫權限正確修改。
步驟1 修改一段區間的內存讀寫權限爲只讀。
步驟2 在該段區間的內存中進行簡單的寫操做。
系統進入異常,說明將該內存設置爲「只讀」成功。
步驟3 註釋掉2中的寫操做,而是直接調用接口將讀寫權限從新修改成可讀可寫。
系統不進入異常,說明將該內存設置爲「可讀可寫」成功。
UINT32 MMU_Sample() { UINT32 *pAlignaddr; PRINTK("---- TEST START ----\n"); pAlignaddr = (UINT32 *)(&__text_start); PRINTK(">>1\n"); LOS_MMUParamSet(&__text_start, &__text_end, BUFFER_ENABLE|CACHE_ENABLE|ACCESS_PERM_RO_RO); *pAlignaddr = 0xa; //if done, be exc PRINTK(">>2\n"); LOS_MMUParamSet(&__text_start, &__text_end, BUFFER_ENABLE|CACHE_ENABLE|ACCESS_PERM_RW_RW); *pAlignaddr = 0xb; PRINTK(">>3\n"); PRINTK("---- TEST END ----\n"); return LOS_OK; }