MPU(memmory protection uint)内存保护单元。不同mcu的mpu单元的实现和配置大同小异。mpu 一般包含多组region 配置寄存器,每组region 寄存器,可以配置起始地址,结束地址以及访问权限。芯片的用户模式有supervisor 和 user两种模式,以它们为基础,加上读、写、执行等操作,可以组成UR UW UX SR SW SX等访问权限(U user,S supervisor,R read,W write,X excute)。假设region0 定义起始地址为addr0 结束地址为addr1,访问权限为UR SR SW 。在mpu使能之后,如果某时mcu运行在user模式下,可以读取地址在addr0 到 addr1 之间region0 上的数据,但是不可以写入,也不能执行在region0 对应的代码;如果某时运行supervisor模式下,则可以读取、写入region0上的数据,但不可以执行该区域上面的代码。一旦region0 在user 模式下被写入,被执行或在supervisor 模式被执行等情况发生,mpu能够检出程序的操作超出了它当前模式对应的权限,从而触发mpu的异常。
那么在autosar 中,内存分区是如何通过芯片mpu实现的呢?在autosar 中,内存的分区是根据application 来划分的,一般情况下,有几个application 就有几个内存分区。
首先,我们以最简单的两个application 为例,如下所示,该程序分为成了trusted 和 untrusted 两个application。trusted 程序在supervisor 模式下执行,该区域权限是SR SX,untrusted 程序在user 模式下执行,对应的访问权限就是UR UX。我们需要将这两个application 对应的首末地址和访问权限配置到MPU的两组region 寄存器中,然后使能MPU。就是可以实现两个applicaiton rom空间的相互隔离。比如在trusted application 程序执行时,如果非法越界访问了untrusted 的程序,就会引起MPU异常,反之亦然。
Application trusted | SR SX |
Application untrusted | UR UX |
然而,如果我们autosar 程序如果applicaiton 数量大于两个呢?如下所示,四个applicaiton 分别是trusted ,和untrusted application 1~3。如果仅仅靠user mode 和 supervisor mode无法将它们隔离开来。
Application trusted |
Application 1 |
Application 2 |
Application 3 |
这里我们就需要动态的MPU配置。什么意思呢,就是我们的MPU不是一成不变的,对于不同的application,会有不同的MPU的配置参数,同一个region,在不同的application下,可能会有不同的访问权限。OS会在OS Application切换时对MPU相关寄存器进行重新初始化,并设置为即将切换到的OS Application权限。
Application mpu config | MPU config 1 | MPU config2 | MPU config3 |
Application trusted | SR SX | SR SX | SR SX |
Application 1 | UR UX | ||
Application 2 | UR UX | ||
Application 3 | UR UX |
以上表为例,我们MPU 分出4组region 分别记录四个application 对应的代码的范围和访问权限。根据需要,表中列出了,三种MPU的配置参数,分别时MPU config1~3。tusted application 一般运行在supervisor mode下,可以使用上表中MPU 任意一个MPU 配置。对于untrusted application 1~3 则分别对应着MPU config 1~3,即这三个application 对应的MPU不一样,需要在application 切换时,动态调整,重新配置。例如MPU config1 表示,application 1 对application 1 这个范围内的程序,有读和执行的权限,而对于application 2 和 3 范围内的程序则没有这方面的权限。当applicaiton 1切换到application2时,会提前将application2 对应的MPU 配置参数MPU config2 写入到mpu 相关的配置寄存器。切换到application2后,application2 对应分region 变成了UR UX,原来的applicaiton1 对应的region 的权限少了UR 和 UX,因此当前程序只能访问application2 对应区域,访问其他application 对应的区域就会导致MPU产生异常。