进程表中的条目数量取决于MPU。Cortex-M架构MCU可以有8个或16个MPU区域。由于可用的区域数量有限,通常更多设置区域保护RAM中的数据访问。但是,如果应用程序没有用完所有区域,也可以通过区域限制对代码的访问来提高安全性。
1、一个MPU域提供对代码空间的读取和执行访问。因为常量通常存储在Flash中(ASCII字符串、查找表、常量等),所以读访问是必须的。
2、一个区域用于提供进程相关的外设访问,例如,以太网控制器、USB控制器等。MPU区域设置为读写访问,但不允许执行代码。如果进程不需要访问外设,则不需要此MPU区域。
3、一个MPU区域封装进程全局变量以及堆(heap)空间。MPU区域将设置为读写权限,但同样不允许执行代码。
4、一个MPU区域用于检测堆栈溢出。此方法假设进程中的任务不会通过其堆栈共享数据。同样,在此区域中不允许执行代码。RTOS负责选择运行哪个任务,相应任务的堆栈将被封装在MPU区域中。
5、该区域显示了由于MPU区域大小和对齐限制而可能导致的RAM浪费。资源受限的嵌入式应用中应尝试尽量减少浪费。
6、此MPU区域用于建立多个进程共享的RAM。如果进程不需要共享数据,则不需要此MPU区域。
进程表由“N”个条目组成,每个条目包含两个字段:区域的基地址和区域属性(区域大小,允许读、写或执行等)。
进程表在创建任务时被分配给任务。RTOS只是在任务的控制块(TCB)中保留一个指向进程表的指针。RTOS在上下文切换时增加更新MPU进程表的代码,如图4所示。在切换任务时不需要保存MPU配置。
Cortex-M 特权等级
为了保证系统的安全,特权模式代码保留给经过完全测试并受信任的代码。由于大多数RTOS都经过了完整的测试,通常被认为是值得信任的,而应用代码是不可信的。也有例外,例如,只要ISR保持尽可能短而不被滥用,ISR通常被认为是受信任的,因此也以特权模式运行。这是大多数RTOS供应商的建议。
应用代码在非特权模式下运行,从而限制了代码可以做的事情。具体来说,非特权模式可以防止代码关中断、更改嵌套向量中断控制器(NVIC)的设置、将运行模式更改为特权等级、修改MPU设置等。这是一个理想的特性,因为我们不希望不受信任的代码赋予自己特权,从而更改系统设计者提供的保护。
由于CPU总是以特权模式开始运行,任务需要从创建时就以非特权模式运行,或者在启动后通过API调用,切换到非特权模式。一旦进入非特权模式,CPU只有在中断或异常服务中才能切换回特权模式。
IC697MDL253 IC697MDL254 IC697MDL340
IC697MDL341 IC697MDL350 IC697MDL640
IC697MDL651 IC697MDL652 IC697MDL653
IC697MDL654 IC697MDL671 IC697MDL740
IC697MDL750 IC697MDL752 IC697MDL753
IC697MDL940 IC697MEM713 IC697MEM715
IC697MEM717 IC697MEM719 IC697MEM731
IC697MEM732 IC697MEM733 IC697MEM735
IC697MLX000 IC697MSC800 IC697MSC801
IC697MSC802 IC697PCM711 IC697PWR710
IC697PWR711 IC697PWR720 IC697PWR724
IC697PWR748 IC697RCM711 IC698ACC701 IC698ACC720
IC698ACC735 IC698CHS009 IC698CHS017
IC698CHS109 IC698CHS117 IC698CHS217
IC698CMX016 IC698CPE010 IC698CPE020
IC698CPE030 IC698CPE040 IC698CRE020
IC698CRE030 IC698CRE040 IC698ETM001
IC698PSA100 IC698PSA350 IC698PSD300