Tricore系列之MPU

以下内容是从官方文档翻译过来,仅为自己学习使用,如有错误欢迎指正!!!

TriCore保护系统提供了隔离错误的基本功能。该系统是不显眼的,较少的开销,并避免不确定的运行时行为。保护系统集成了硬件机制,保护用户指定的存储范围,防止未经授权的读、写或指令获取访问。保护硬件也可以方便应用程序调试。

存储保护子系统

如下的子系统和存储保护有关。

陷阱系统(The Trap System)

当出现不可屏蔽中断(NMI)、指令异常或非法访问等事件时,就会触发trap。
TriCore架构包含八类陷阱,并进一步分为同步或异步、硬件或软件。
更多信息请参见Trap System章节

I/O权限级别(The I/O Privilege Level)

I/O模式有三种:User-0模式、User-1模式和Supervisor模式。
User-1模式允许应用程序任务直接访问非关键的系统外设。这使得系统可以更有效地实现,而不会丧失在特权模式下运行时固有的安全性。(User-1模式的默认行为可能被系统控制寄存器覆盖)。
更多信息请参见Access Privilege Level Control章节

存储保护(Memory Proteciton)

提供任务访问权限控制,即允许访问哪些内存区域以及允许哪些类型的访问。

  • 基于范围(MPU)
    基于范围的内存保护系统是为小型和低成本的应用设计的,用于为不需要虚拟内存的系统提供粗粒度的内存保护。本章将详细介绍该系统(range-based system 即 MPU)。
  • 基于页(MMU)
    对于需要虚拟内存的应用,可选的内存管理单元(memory Management Unit,即MMU)支持一种常见的模型,该模型赋予每个内存页自己的访问权限。

有效地址(Effective Address)
有效地址通过以下两种转换机制之一转换为物理地址:

  • 直接转换
  • 基于PTE(Page Table Entry,即页表)的转换(仅限MMU可选)。

对经过直接地址转换的地址进行内存保护,需使用本章描述的基于范围的内存保护系统(MPU)。

基于区间的的存储保护

基于范围的内存保护系统是为小型和低成本的应用设计的,为不需要虚拟内存的系统提供内存保护。
本章描述了:

  • 保护区间(Protection Ranges)
  • 访问权限(Access Permissions)
  • 保护集(Protection Sets)
  • 保护区间和保护集的关系(Associating Protection Ranges with Protection Sets)

保护区间
保护区间是一段连续的地址空间,可以为其指定访问权限。
保护区间由下边界和上边界划定。一个地址在以下情况下属于这个区间:

  • 下边界 <= 地址 <= 上边界(Lower Boundary <= Address <= Upper Boundary)

保护区间分为两组:

  • 数据保护区间用于指定数据访问权限
  • 代码保护区间用于指定代码访问权限

代码和数据保护区间的数量取决于实现,限制为至少4个最多16个。
上下边界的粒度为8字节。
代码/数据保护上边界寄存器和下边界寄存器的三个最低有效位是不可写的,总是返回零。

访问权限
访问权限定义了对保护区间允许的访问类型。
访问类型有:

  • 数据读(Data Read)
  • 数据写(Data Write)
  • 指令获取(Instruction Fetch)

通过设置相应的访问标志,可以分别允许每种访问类型。
在这里插入图片描述
保护集
为所使用的整个地址空间定义的完整访问权限集称为保护集。
每个保护集由以下组成:

  • 执行使能的代码保护区间
  • 写使能的数据保护区间
  • 读使能的数据保护区间

保护集定义了数据访问权限和指令获取权限。
在保护集中,每个数据保护区间都关联了读使能和写使能标志。每个代码保护区间都关联了执行使能标志。提供的内存保护集的数量是特定于每个TriCore实现,最少两个最多四个。
拥有多个保护集允许在User和Supervisor模式切换时或在不同的User任务之间切换时,快速更改整个访问权限保护集。
在任何给定的时间,所有保护集中的一个就是当前保护集,它决定当前任务访问存储区域的合法性。PSW.PRS字段决定了当前生效的保护集(以编号体现)。

交叉保护区间的访问权限

交叉保护区间的实际访问权限是交叉保护区间访问权限设置的OR值。这意味着当两个区间相交时,相交的区间将拥有最大可能的权限。
例如:

  • A区域设置为读写权限
  • B区域设置为读权限
  • 则A与B交叉区域为读写权限

区间的嵌套可用于允许对当前任务允许读访问的区间的子区间进行读/写访问。

交叉保护边界

存储器访问可以跨越由保护系统定义的两个区域。下图显示了跨越允许访问区域和不允许访问区域边界的存储器访问(代码或数据)。在这种情况下,是否触发存储保护陷阱是由实现定义的(而不是体系结构定义的)。
在这里插入图片描述
注意:在TriCore的所有实现中,为了确保确定性的行为,应该在每个内存保护区域之间留下一个至少是最大内存访问大小的两倍的区域,减去一个字节。一些实现可能需要更少的缓冲区间距,请参阅具体实现文档以了解详细信息。

使用基于区间的存储保护

当保护系统被使能,所有的存储访问(读、写、执行)都需要在存储访问执行之前进行合法性检查,其合法性由如下因素决定:

  1. SYSCON寄存器中的保护使能位(SYSCON.PROTEN)
  2. 当前选择的保护寄存器设置(PSW.PRS)
  3. 保护寄存器设置中的保护区域
  4. 保护设置中对保护区域的访问权限检查

保护使能位(Protection Enable Bit)

如果需要使能存储保护系统,则保护使能位必须被设置为1(SYSCON.PROTEN = 1)。
如果存储保护被关闭(SYSCON.PROTEN = 0),则允许任意地址的任意权限访问。

保护集选择(Set Selection)

在任意给定时刻,在所有的保护集中只有一个生效,当前运行的任务或者中断服务程序根据该保护集进行合法性检查。
PSW.PRS字段指示了当前保护集的编号。

地址空间(Address Range)

数据地址(读写权限)根据数据地址空间表来进行检查。
指令获取地址根据代码地址空间表来进行检查。
为了从程序空间读出数据,那么在数据地址空间表中必须有一个条目涵盖被读地址。同样的,在代码地址空间表中必须有一个条目涵盖被读指令。
保护系统不区分访问权限级别。无论当前权限级别为Supervisor、User-1还是User-0模式,数据保护设置和代码保护设置的效果相同。
对于指令的读取(instruction fetches),将根据当前保护集中启动执行权限的代码保护范围来检查PC值。当PC被发现在所有选择范围之外,那么访问权限被拒绝。当PC值被发现在一个启动的范围内,访问是允许的。
对于读取操作(load operations),将根据当前保护集中启动读权限的数据保护范围来检查读取数据的地址值。当该地址被发现在所有选择范围之外,那么访问的权限被拒绝。当该地址被发现在一个启用的范围内,访问是允许的。
对于写入操作(store operations),将根据当前保护集中已启用写权限的数据保护范围来检查写入数据的地址值。当该地址被发现在所有选择范围之外,那么访问的权限被拒绝。当该地址被发现在一个启用的范围内,访问是允许的。
特权模式(supervisor mode)不会自动禁用存储保护。为特权模式任务(Set-0)选择的保护集通常被设置为允许对被保护的用户模式访问的内存区域进行写访问。此外,特权模式任务可以执行指令来更改保护映射(protection maps)或完全禁用保护系统。由于Supervisor模式不会隐式改写存储保护,因此特权模式任务有可能触发内存保护陷阱(trap)。
将上下文保存或还原到上下文保存区(CSA)不需要保护系统的许可。

陷阱(traps)

基于范围的存储保护系统(MPU)产生三个陷阱,每个陷阱对应三个保护模式寄存器位:

  • MPW trap = WE bit (MPW = memory protection write)
  • MPR trap = RE bit (MPR = memory protection read)
  • MPX trap = XE bit (MPX = memory protection execute)
    有关Trap的完整描述,请参考其他系列文章。

保护寄存器命名约定(Protection Register Naming Convention)

数据保护范围寄存器的名称如下:

  • DPRx_L - 定义数据范围x的下地址边界
  • DPRx_U - 定义数据范围x的上地址边界

代码保护范围寄存器的名称如下:

  • CPRx_L - 定义代码范围x的下地址边界
  • CPRx_U - 定义代码范围x的上地址边界

保护集使能寄存器命名约定(Protection Set Enable Register Naming Convertion)

保护集使能寄存器的名称如下:

  • CPXE_n - 为set-n定义启用执行权限的代码保护范围
  • CPRE_n - 为set-n定义启用读取权限的代码保护范围
  • CPWE_n - 为set-n定义启用写入权限的代码保护范围
    在这些寄存器中,如果寄存器的bit-x为1,则对应的range-x具有权限,否则权限被禁用。由于代码和数据保护范围的数量与实现有关,这些寄存器中的位数也与实现有关。

基于范围的存储保护寄存区(MPU)

数据保护范围寄存器上边界

DPRx_U(x=0-31)
Data Protection Range Register x Upper Bound
保护区间x上边界

数据保护范围寄存器下边界

DPRx_L(x=0-31)
Data Protection Range Register x Lower Bound
保护区间x下边界

代码保护范围寄存器上边界

CPRx_U(x=0-31)
Code Protection Range Register x Upper Bound
在这里插入图片描述

代码保护范围寄存器下边界

CPRx_L(x=0-31)
Code Protection Range Register x Lower Bound
在这里插入图片描述

数据保护读使能设置配置寄存器

DPRE_x(x=0-7)
Data Protection Read Enable Set Configuration Register x
在这里插入图片描述

数据保护写使能设置配置寄存器

DPWE_x(x=0-7)
Data Protection Write Enable Set Configuration Register x
在这里插入图片描述

代码保护执行使能设置配置寄存器

CPXE_x(x=0-7)
Code Protection Execute Enable Set Configuration Register x
在这里插入图片描述

图解

保护区域相关属性

在这里插入图片描述

保护集与保护区对应图

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值