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