“TriCore”保护系统提供了隔离错误的基本功能。该系统不引人注目,开销很小,避免了不确定的运行时行为。
保护系统包含硬件机制,保护用户指定的内存范围不受未经授权的读、写或指令获取访问。该保护硬件还可以方便应用程序调试。
一、内存保护子系统概述
下面子系统涉及内存保护
1、Trap系统
trap是由于诸如 不可屏蔽中断(NMI)、指令异常或非法访问等事件而产生的。
TriCore架构包含八个Trap类,这些陷阱类进一步分为同步或异步、硬件或软件。
2、I/O特权级别
I/O模式有三种:
·User-0模式
·User-1模式
·Supervisor模式
3、基于范围的内存保护
基于范围的内存保护系统专为小型和低成本应用程序设计,为不需要虚拟内存的系统提供粗粒度内存保护
4、基于页的内存保护
对于需要虚拟内存的应用程序,可选的内存管理单元(memory Management Unit, MMU)支持一种熟悉的模型,该模型为每个内存页提供自己的访问权限。
5、有效地址
有两种转换机制: ·直接翻译
·基于页表条目(PTE)的翻译(仅限可选的MMU)。
二、基于范围的内存保护
1、保护范围
保护的范围是地址空间的连续部分,可以为其指定访问权限。
保护范围由“下限”和“上限”定义
一个地址属于以下范围:
下边界<=地址<上边界
保护范围分为两组:
·数据保护范围用于指定数据访问权限
·代码保护范围指定指令获取权限
代码和数据保护范围的数量取决于具体实现,每个限制为最少4个,最多32个
上下边界的粒度对于数据保护范围为8字节,对于代码保护范围为32字节数据
保护上限和下限寄存器的三个最低有效位是不可写的,并且总是返回零(重置位)
代码保护上限和下限寄存器的五个最低有效位是不可写的,并且总是返回零(重置位)
2、访问权限
访问权限定义了对保护范围允许的访问类型:
·数据读取
·数据写入
·指令取出
通过设置相应的访问标志,可以分别允许每种访问类型
3、保护设置
为所使用的整个地址空间定义的访问权限的完整集合称为保护集(Protection Set)
每个保护集包括:
· 代码保护范围的选择
·数据保护范围的选择
·为每个范围定义的访问权限
·使能了代码保护范围可执行的选择
·使能了数据保护范围可写入的选择
·使能了数据保护范围可读取的选择
保护集定义数据访问权限和指令获取权限。
在保护集中,每个数据保护范围都有关联的“读使能”和“写使能”标志。
每个代码保护范围都有一个关联的执行启用标志。
提供的内存保护集的数量是特定于每个TriCore实现的,限制为最少2个,最多8个。
当在User和Supervisor模式之间进行切换时,或者在两个不同User任务之间切换时拥有的多个保护集允许快速更改整个访问权限集
在任何给定时间,其中一个集是当前保护寄存器集,它决定当前任务访问内存的合法性
PSW.PRS字段决定当前保护寄存器集是哪个
4、用于交叉内存范围的访问权限
访问内存位置的权限是内存范围权限中的OR(如果其中一个范围允许,则允许内存访问)
这意味着当两个范围相交时,相交区域将具有最允许范围的权限
举例: 范围A设置读写权限范围
B设置为只读权限因此
A和B的相交区域将被读/写
范围嵌套可用于允许对允许当前任务读访问的更大范围的子范围进行读/写访问
5、跨越保护界限
存储器访问可以跨越保护系统定义的两个区域。下图显示了内存访问(代码或数据)跨越允许区域和不允许内存区域的边界。在这种情况下,是否采用内存保护Trap是由实现定义的(而不是体系结构定义的)
注:为了确保在所有TriCore实现中的确定性行为,应该在每个内存保护区域之间留下至少是最大内存访问大小的两倍的区域(减去一个字节)作为缓冲区。一些实现可能需要更小的缓冲区间距,请参考实现特定的文档了解详细信息。
6、使用基于内存保护系统的范围
当保护系统启用时,每次访问内存(读、写或执行)在访问之前都要检查合法性
其合法性由以下所有因素决定:
·SYSCON寄存器中的保护使能位(SYSCON. PROTEN)
·当前选择的保护寄存器集(PSW.PRS)
·保护寄存器集中选择的范围
·保护集选择的范集为访问权限集
1、保护使能位
为了使内存保护系统处于活动状态,
保护使能位(SYScoN.PROTEN)必须设置为1(SYSCON.PROTEN == 1)
如果内存保护系统被关闭(SYSCON.PROTEN == 0),则允许对任何内存地址进行任何访问
2、设置选择
在任何给定时间,其中一组是当前保护寄存器集,它决定当前任务或中断服务程序(ISR)访问内存的合法性。PSW.PRS字段表示当前保护寄存器集是哪个
3、地址范围
根据当前选择的数据地址范围表检查数据地址(读和写访问)。根据当前选定的代码地址范围表检查指令获取地址。
数据范围表项的模式项只允许读写访问,而代码范围表项的模式项只允许执行访问。
为了从程序空间中读取数据,数据地址范围表中必须有一个包含被读取地址的条目,在代码地址范围表中则必须有一个包含正在读取的指令的条目。
保护系统不区分访问权限级别。无论当前权限级别为“Supervisor”、“User-1”还是“User-0”模式,数据保护和代码保护设置的效果都是一样的。
对于指令获取,将根据当前保护集的启用执行的选定代码保护范围检查获取的PC值。当发现PC不在所有启用的执行范围内时,则拒绝访问权限。当PC被发现在允许执行的范围内时,就允许访问。当发现某个地址属于所选范围之一时,将检查相关的访问权限,并根据需要允许或拒绝访问。
对于加载和存储操作,将根据当前保护集的选定数据保护范围检查数据地址值。当发现某个地址不在所有选定范围内时,将拒绝该地址的访问权限,当发现一个地址在启用范围内时,就允许访问
Supervisor模式不会自动关闭内存保护。为Supervisor模式任务(set -0)选择的保护寄存器集通常会设置为允许对不受User模式访问保护的内存区域进行写访问。此外,Supervisor模式任务还可以执行指令来更改保护映射,或者完全禁用保护系统。由于Supervisor模式不隐式覆盖内存保护,因此Supervisor模式任务有可能采取内存保护Trap。将上下文保存或恢复到上下文保存区域 不需要保护系统的许可即可进行。
4、Trap
基于范围的内存保护系统产生三个Trap,每个Trap对应三个保护模式寄存器位:
MPW (Memory Protection Write) trap = WE位
MPR (Memory Protection Read) trap=RE位
MPX (Memory Protection Execute) trap = XE位
5、保护寄存器命名约定
数据保护范围寄存器被命名如下:
DPRx_L-定义数据范围对x的下地址边界
DPRx_u -定义数据范围对x的上地址边界
代码保护范围寄存器的名称如下:
CPRx_L -定义代码范围对x的下地址边界
CPRx_U -定义代码范围对x的上地址边界
6、保护设置使能寄存器命名约定
保护集使能寄存器命名如下:
CPXE_x -定义set-x的执行权限启用代码保护范围
DPRE_x -定义set-x的读权限数据保护范围
DPWE_x-定义set-x的写权限数据保护范围
在这些寄存器中,如果寄存器的bit-x为1,则range-x具有启用权限,否则禁用权限。由于代码和数据保护范围的数量依赖于实现,因此这些寄存器中的位数也依赖于实现。
三、基于范围的内存保护寄存器
1、数据保护范围寄存器上界
3、代码保护范围寄存器上界
4、代码保护范围寄存器下限
5、数据保护读使能设置配置寄存器
RE[n] 数据保护范围Read使能Data protection Range Read Enable
0:保护集x不允许对数据保护范围[n]进行读访问
1:保护集x允许对数据保护范围[n]进行读访问
注:保护范围的数量取决于具体实现。未实现范围的启用位是只读的,读取时返回0。
6、数据保护写使能设置配置寄存器
7、代码保护执行使能设置配置寄存器