1、内存保护系统
TriCore™保护系统提供了隔离错误的基本功能。该系统不引人注目,开销很小,避免了不确定的运行时行为。
该保护系统包含硬件机制,用于保护用户指定的内存范围免受未经授权的读取、写入或指令获取访问。
保护硬件还可以促进应用程序调试。
1.1、内存保护子系统
以下子系统涉及内存保护。
Trap系统
Trap是由于诸如非屏蔽中断(NMI)、指令异常或非法访问之类的事件而发生的。
TriCore体系结构包含八个Trap类,这些Trap类进一步分为同步或异步、硬件或软件。
有关更多信息,请参阅第1页的“Trap系统”。
I/O特权级别
有三种I/O模式:User-0模式,User-1模式和特权模式。
User-1模式允许应用程序任务直接访问非关键系统外围设备。这使得系统能够有效地实现,而不会失去在Supervisor模式下运行所固有的安全性。(用户-1模式的默认行为可以被系统控制寄存器覆盖)。
有关更多信息,请参阅第8页的“访问权限级别控制(I/O权限)”。
内存保护
提供对允许任务访问哪些内存区域以及允许哪些类型的访问的控制。
- 基于范围
基于范围的内存保护系统是为小型和低成本应用程序设计的,为不需要虚拟内存的系统提供粗粒度的内存保护。本章详细介绍了这种基于范围的系统。 - 基于页
对于需要虚拟内存的应用程序,可选的内存管理单元(MMU)支持一个熟悉的模型,该模型赋予每个内存页自己的访问权限。
有效地址
使用以下两种转换机制之一将有效地址转换为物理地址:
- 直接翻译。
- 基于页面表条目(PTE)的翻译(仅限可选MMU)。
使用本章中描述的基于范围的内存保护系统,对经过直接地址转换的地址实施内存保护。
1.2、基于范围的内存保护
基于范围的内存保护系统是为小型和低成本应用程序设计的,为不需要虚拟内存的系统提供内存保护。
本节介绍:
- 保护范围
- 访问权限
- 保护装置
1.2.1、保护范围
保护范围是地址空间的连续部分,可以为其指定访问权限。
保护范围由下边界和上边界定义。地址属于以下范围:
- 下边界 <= 地址 < 上边界
有两组保护范围:
- 数据保护范围指定数据访问权限
- 代码保护范围指定指令获取权限
代码和数据保护范围的数量取决于实施方式,每个范围最少限制为4个,最多限制为32个。
数据保护范围的下限和上限粒度为8字节,代码保护范围的粒度为32字节
数据保护上限和下限寄存器的三个最低有效位不可写,并且总是返回零。
代码保护上限和下限寄存器的五个最低有效位不可写,并且总是返回零。
1.2.2、访问权限
访问权限定义允许对保护范围进行访问的类型。
可用的类型有:
- 数据读取
- 数据写入
- 指令获取
通过设置相应的访问标志,可以分别允许每种访问类型。
表18-访问类型
访问类型 | 标志名称 | 短名称 | 受影响操作 |
---|---|---|---|
数据读 | 读使能 | RE | 加载 |
数据写 | 写使能 | WE | 存储 |
指令提取 | 执行使能 | XE | 指令提取 |
1.2.3、保护设置
为所使用的整个地址空间定义的一整套访问权限称为保护集。
每个保护集包括:
- 代码保护范围的选择
- 数据保护范围的选择
- 为每个范围定义的访问权限
- 选择启用执行的代码保护范围
- 选择启用写入的数据保护范围
- 选择启用读取的数据保护范围
保护集定义数据访问权限和指令获取权限。
在保护集中,每个数据保护范围都有相关的读取启用和写入启用标志。每个代码保护范围都有一个相关的执行启用标志。
所提供的内存保护集的数量特定于每个TriCore实现,最少限制为两个,最多限制为八个。
当在“用户”和“主管”模式之间或在不同的“用户”任务之间切换时,拥有多个保护集可以快速更改整个访问权限集。
在任何给定的时间,其中一个集合是当前保护寄存器集合,它确定当前任务访问内存的合法性。PSW.PRS字段确定当前保护寄存器组编号。
1.2.4、相交内存范围的访问权限
访问内存位置的权限是内存范围权限的OR。
如果其中一个范围允许,则允许内存访问。这意味着,当两个范围相交时,相交区域将具有最允许范围的权限。
例如:
- 范围A设置为读/写权限
- 范围B设置为只读权限
- 因此,A和B的交叉区域将被读取/写入
范围嵌套可用于允许对当前任务所在的较大范围的子范围进行读/写访问
允许读取访问。
1.2.5、 跨越保护边界
存储器访问可以跨越由保护系统定义的两个区域。下图显示了跨越内存允许区域和“不允许”区域边界的内存访问(代码或数据)。在这种情况下,是否采用内存保护Trap是由实现定义的(而不是体系结构定义的)。
注意:为了确保TriCore的所有实现中的确定性行为,应在每个内存保护区域之间留出一个大小至少为最大内存访问大小的两倍的区域,减去一个字节,作为缓冲区。某些实现可能需要较小的缓冲区间距,有关详细信息,请参阅特定于实现的文档。
1.3、使用基于范围的内存保护系统
启用保护系统后,在执行访问之前,会检查每次内存访问(读取、写入或执行)的合法性。合法性由以下所有因素决定:
- SYSCON寄存器中的保护启用位(SYSCON.PROTEN)
- 当前选择的保护寄存器集(PSW.PRS)
- 保护寄存器集中选择的范围
- 为保护集选择的范围设置的访问权限
1.3.1、保护启用位
要使内存保护系统处于活动状态,保护启用位(SYSCON.PROTEN)必须设置为1(SYSCON_PROTEN1)。
如果内存保护系统被禁用(SYSCON.PROTEN0),则允许对任何内存地址进行任何访问。
1.3.2、设置所选内容
在任何给定时间,其中一个集合是当前保护寄存器集合,它确定当前任务或中断服务例程(ISR)访问内存的合法性。
PSW.PRS字段表示当前的保护寄存器集编号。
1.3.3、寻址范围
根据当前选择的数据地址范围表检查数据地址(读取和写入访问)。
根据当前选择的代码地址范围表检查指令提取地址。
数据范围表项的模式项仅允许读取和写入访问,而代码范围表项仅允许执行访问。
为了从程序空间读取数据,数据地址范围表中必须有一个条目覆盖要读取的地址。相反,代码地址范围表中必须有一个条目,该条目涵盖正在读取的指令。
保护系统不区分访问权限级别。无论权限级别当前设置为Supervisor、User-1还是User-0模式,数据和代码保护设置都具有相同的效果。
对于指令获取,将根据当前保护集的已启用执行的选定代码保护范围检查获取的PC值。当发现电脑不在所有启用执行的选定范围内时,访问权限将被拒绝。当发现PC处于启用执行的范围内时,允许访问。
当发现地址位于所选范围之一内时,将检查相关联的访问权限,并酌情允许或拒绝访问。
对于加载和存储操作,将根据当前保护集的选定数据保护范围检查数据地址值。当发现某个地址超出所有选定范围时,访问权限将被拒绝。当发现某个地址位于启用范围内时,允许访问。
对于加载操作,将根据当前保护集的已读数据保护范围检查数据地址值。当发现某个地址超出所有选定范围时,访问权限将被拒绝。当发现某个地址位于启用范围内时,允许访问。
对于存储操作,将根据当前保护集的写启用数据保护范围检查数据地址值。当发现某个地址超出所有选定范围时,访问权限将被拒绝。当发现某个地址位于启用范围内时,允许访问。
当发现某个地址位于所选范围之一内时,将检查相关联的访问权限,并酌情允许或拒绝访问。
Supervisor模式不会自动禁用内存保护。为Supervisor模式任务(set-0)选择的保护寄存器集通常将被设置为允许对受保护的存储器区域进行写访问,使其不受用户模式访问的影响。此外,监督员模式任务可以执行指令来更改保护地图,或完全禁用保护系统。由于主管模式不会隐式覆盖内存保护,因此主管模式任务可能会陷入内存保护陷阱。
将上下文保存或恢复到上下文保存区域不需要保护系统的许可即可继续。
1.3.4、Traps
基于范围的存储器保护系统生成三个Traps,每个Trap对应于三个保护模式寄存器位:
- MPW(内存保护写入)Trap=WE位
- MPR(内存保护读取)Trap=RE位
- MPX(内存保护执行)Trap=XE位
有关Trap的完整说明,请参阅Trap系统一章。
1.3.5、保护寄存器命名规则
数据保护范围寄存器的名称如下:
- DPRx_L-定义数据范围对x的地址下限。
- DPRx_U-定义数据范围对x的地址上限。
代码保护范围寄存器的名称如下:
- CPRx_L-定义代码范围对x的地址下限。
- CPRx_U-定义代码范围对x的地址上限。
注:x=取决于实现。
1.3.6、保护集启用寄存器命名规则
保护集启用寄存器的名称如下:
- CPXE_x-定义set-x的启用执行权限的代码保护范围
- DPRE_x-为set-x定义启用读取权限的数据保护范围
- DPWE_x-为set-x定义启用写入权限的数据保护范围
在这些寄存器中的每个寄存器中,如果寄存器的位-x为1,则range-x具有启用的权限,否则权限被禁用。由于代码和数据保护范围的数量取决于实现,因此这些寄存器中的位数也取决于实现。
1.4、基于范围的内存保护寄存器
数据保护范围寄存器上限
数据保护范围寄存器下限
代码保护范围寄存器上限
代码保护范围寄存器下限
数据保护读取启用集配置寄存器
数据保护写入启用集配置寄存器
代码保护执行启用集配置寄存器