|
绝大部分的cortex-m4 的芯片上都具备了MPU保护的功能,但是如何要利用好这个功能,备受争议。笔者之前利用MPU实现过一套把raw-os的各个任务相互隔离的机制,但是发现这条路不通用,果断放弃,之后MPU一直当做废物扔在垃圾箱里,事实上其它rtos基本上也把MPU功能扔在垃圾箱里。
那到底MPU到底是个废物还是宝呢?笔者在实践过程中摸索出使用MPU的一些方法供大家参考。
rtos中最头疼的是任务栈的溢出,而且这种溢出是一种隐晦的过程,无论低手还是高手都会踩陷阱,虽然利用raw-os自带的shell功能可以及时侦测任务栈的大小,以及栈设置了特殊的标记位,但是这些比较繁琐,成功率也不是100%。但是利用MPU这种方法几乎可以达到100%的即时侦测栈溢出,具体的方法如下.
我们知道MPU最小的region保护大小为32字节,在笔者的lpc4357上总共有16个region。每一个region都可以设置权限,比如不可读写,读,写,这些权限。
知道这些之后我们需要知道中断栈的底部起始位置,这个很简单。然后往上对齐到32个字节后把地址写入其中的一个region,然后这个region的权限设置为不可读也不可写。这样只要中断栈的指针到达这个区域读写会自动被硬件侦测到并报错。笔者已经在lpc4357上完美的验证这个理论。既然总共有16个region,那其他15个咋办呢,可以拿来用来保护任务的栈,选几个感觉有风险的任务的栈像之前那样的设置,就可以了。如果还剩一些region的话可以用来设置保护一些只读数据等,或者在系统里面安放几个关卡,用来当做防御使用。
|
|