liteos MMU(十八)

1. 概述

1.1 基本概念

MMU全稱「Memory Management Unit」,顧名思義就是「內存管理單元」。編程

1.2 運做機制

創建頁表描述符號表,將物理地址映射成虛擬地址,以虛擬地址爲媒介來操做和管理實際的物理內存。code

頁表描述符號表,是由用戶根據所使用的主芯片的頁表描述格式,去建立、修改和管理的,而內存則依據頁表描述符號表進行映射、權限控制等。頁表描述符號表在建立或修改後,須要將它寫入協處理器CP15才能生效,而協處理CP15正是內存管理的實際執行者。blog

綜合來講,對MMU操做就是經過修改頁表描述符和控制CP15協處理器來實現的,具體運做流程以下圖1所示。接口

Huawei LiteOS的MMU有兩個方面的做用:內存

  • 提供硬件機制的內存cache/nocache屬性的控制接口。
  • 提供硬件機制的內存訪問權限控制接口。

2. 開發指導

2.1 使用場景

系統內部有些內存不但願被修改,不然會形成不可預測的後果,此時能夠用MMU修改該段內存的訪問權限。訪問該段內存時會檢查訪問權限,若權限不正確則會觸發異常,起到保護該段內存數據的做用。開發

2.2 功能

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種類型的宏。

3 注意事項

  • 目前MMU二級頁表可操做最小內存單位是4KB,因此要設置訪問權限的內存區域的起始地址和結束地址都要4KB對齊。一級頁表修改未作對外接口,無需關注。
  • 經過該接口可控制的內存大小,取決於分配用於存放二級頁表的內存大小,例如Hi3516a:預留了0x80000000~0x80008000的內存用於存放頁表,其中0x8000000~0x80004000用於存放一級頁表,0x80004000~0x80008000(16K)用於存放二級頁表(每條表項佔用4byte,每條表項對應4K內存),因此最多能夠控制16M的可配置內存。

4 編程實例

4.1 實例描述

調用接口LOS_MMUParamSet,修改內存區域的讀寫權限,再經過在該內存區域進行寫操做,查看是否讀寫權限正確修改。

步驟1 修改一段區間的內存讀寫權限爲只讀。

步驟2 在該段區間的內存中進行簡單的寫操做。

系統進入異常,說明將該內存設置爲「只讀」成功。

步驟3 註釋掉2中的寫操做,而是直接調用接口將讀寫權限從新修改成可讀可寫。

系統不進入異常,說明將該內存設置爲「可讀可寫」成功。

4.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;
}

4.3 運行結果

相關文章
相關標籤/搜索