以非特权模式运行用户代码
使用MPU时,以特权模式运行应用代码。这意味着应用程序代码将能够更改MPU设置,并破坏使用MPU的目的。以特权模式运行应用可能更容易地迁移应用代码。在某些时候,大多数应用程序代码将需要在非特权模式下运行,用户需要添加SVC处理程序。
ISR具有完全访问权限
当识别到中断并且启动ISR时,处理器将切换到特权模式。由于MPU控制寄存器的PRIVDEFENA为1,因此ISR可以访问所有I/O内存。
此外,ISR应该尽可能短,并简单地发信号给任务,由任务执行中断设备所需的大部分工作。当然,这假设ISR是内核感知的ISR,并且该中断设备有相当多的工作处理。例如,不应在ISR中上处理以太网数据包。然而,闪烁LED或更新脉冲宽度调制(PWM)计时器的占空比可以直接在ISR中完成。
防止在RAM中执行代码
大多数MPU可以防止从RAM执行代码,从而限制代码注入攻击。防止外设执行代码可能看起来很奇怪,但可以防止想方设法进入系统的黑客。
限制进程对外设的访问
应该留出一个或多个MPU区域,以限制进程只能访问自己的外设。换言之,如果一个进程管理USB端口,那么它应该只能访问USB外设或与USB控制器的需求相关的外设,例如DMA。
限制可用的RTOS API
设计者必须确定应用代码可使用哪些RTOS API。例如,是否禁止应用代码在系统初始化后创建和删除任务或RTOS对象?换言之,RTOS对象是否只能系统启动时创建,而非运行时创建?如果是,SVC处理程序查找表应只包含向应用公开的API。即使ISR在特权模式下运行,可以访问所有的RTOS API,一个好的RTOS也会阻止从ISR中创建和删除RTOS对象。
在RTOS空间中分配RTOS对象
任务堆栈位于进程空间内,但是,RTOS对象(信号量、队列、任务控制块等)应在内核空间中分配,并通过引用进行访问。不应在进程空间中分配RTOS对象,因为这意味着应用代码可以不调用RTOS API,即可有意或意外地修改内核对象。
|