徽州骆驼 · 1 天前

英飞凌Aurix™ TC3XX 芯片内核详解——内存保护

本文主要介绍Infineon Aurix™ TC3XX系列芯片内核内存保护机制,并通过代码实例进行演示。

01 简  介

随着汽车电子架构向集中化、智能化发展(如域控制器、中央计算平台),功能安全(Functional Safety)信息安全(Cyber Security)成为核心设计要求。在智能网联汽车时代,内存保护已成为车规MCU的基础安全特性,直接影响车辆的合规性、安全性和市场准入(如通过ASPICE、TISAX认证)。

而汽车电子系统需符合ISO 26262功能安全标准,其核心目标是避免因硬件/软件故障导致危害(如刹车失灵、动力中断)。在软件安全领域中,内存保护是一项非常重要的措施。它可以防止软件错误导致系统崩溃、保护关键数据的完整性、多任务隔离等。

在当下汽车行业广泛使用的AUTOSAR架构中,内存保护定义在OS模块内部,通过SC3级别的OS定义来实现。而OS要实现SC3内存保护功能,必须依赖硬件芯片提供相应的内存保护机制,软件是无法在进程运行时每时每刻监控其内存访问轨迹的。也就是说,要实现内存保护,必须使用带有MPU(Memory Protection Unit,内存保护单元)的芯片。

英飞凌Aurix™ TC3XX系列芯片内核带有内存保护单元,能够对数据读写、代码执行进行较小的颗粒度区分,并结合I/O权限等级、Trap机制等,实现灵活的内存保护机制。

02 TriCore™内存保护

TriCore™运行时的内存保护主要包括三种途径,一种是通过设置总线访问权限来保护本地SRAM,即Bus MPU,另一种是通过 I/O权限来限制进程对寄存器的访问权限,即Register Access Protection,最后一种是设置地址保护范围来限制进程对程序的执行和对数据的读写,也就是CPU MPU。

下图是TriCore™内存保护示意图,其中黄色部分为Bus MPU、Register Access Protection(AP)和CPU MPU(Task MPU)。

图片

  • Bus MPU是通过设置每个CPU本地SRAM的访问权限,来限制其他Master对于本地SRAM的访问,主要用于防止跨核数据访问或者DMA访问等对本核的数据侵犯,本核对本地SRAM的访问没有限制;
  • Register Access Protection则是通过I/O权限则是限制了进程对外设寄存器的访问,以及限制某些特殊指令的执行,一般情况下仅由OS内核或者受信进程能够执行某些敏感操作,因此这些进程具有更高的I/O权限;
  • CPU MPU保护方式则是通过设置地址保护段,通过对不同进程设置不同的保护集,来限制其代码执行和数据读写,其保护方式是从CPU访问端进行仲裁,保护范围可覆盖所有地址空间,包括寄存器地址空间;

通常第一种Bus保护方式在实践中较少使用,一般情况下会使用I/O权限保护和地址保护相结合实现运行时的内存保护。

2.1 Bus MPU

在Aurix™ TC3XX系列芯片中,总线上挂有多个核以及DMA等内存Master设备,同时也会挂有DLMU、DSPR、PFlash等内存Slave设备,它们都通过SRI总线进行连接,如下图所示。

图片

我们知道,每个CPU内部,具有一块Data Scratch Memory (DSPR)用于数据RAM,一块Program Scratch Memory (PSPR) 用于Code RAM,还有一块Distributed LMU (DLMU)一般用于全局数据的存储,还有一块本地Flash用于存储代码或常量。

在Bus MPU的功能下,CPU对于自身所附带的这三块RAM和一块Flash是不具有访问限制的,但是它可以对其他CPU、DMA等Master设备设置读写权限,以保护自身数据。

这里需要了解Bus Master的概念,Aurix™ TC3XX系列芯片中对于所有前文提到的总线上的Master设备都进行了编号Master TAG,这些编号是芯片静态设置的不可更改,用于识别总线上各个Master设备,Bus MPU的权限设置也是通过这个Master TAG来绑定的。可通过查询芯片Family手册查看编号(最多64个,此处未截全)。

图片

2.1.1 Local xSPR保护

对于DSPR和PSPR,每个核可针对本地RAM设置8个地址段,每个地址段都有两个寄存器,用来标记64个Master TAG的访问权限,每个Master TAG一个Bit位。

对于每个段来说,通过寄存器SPR_SPROT_RGNUAi (x=0-7) 来定义地址段上限,通过寄存器SPR_SPROT_RGNLAi (i=0-7) 下限。

对于每个段,SPR_SPROT_RGNACCENAi_R(Masters 31-0) 和SPR_SPROT_RGNACCENBi_R (Masters 63-32)两个寄存器定义了所有64个Master对该段的读权限。SPR_SPROT_RGNACCENAi_W(Masters 31-0)和SPR_SPROT_RGNACCENBi_W (Masters 63-32)两个寄存器则定义了64个Master对该段的写权限。每个Bit对应一个Master,比如bit6对应Master TAG6的主设备。

如下图为访问示意图。

图片

地址保护权限采用左闭右开区间,即SPR_SPROT_RGNLAi <= address < SPR_SPROT_RGNUAi表示该段的权限范围。当访问的地址不在这8个段中,或者Master设备的权限为0,则会产生错误,错误信号发送到SMU模块。

系统复位时,每个地址段的默认范围是0x0~0xFFFFFFE0,且所有保护权限寄存器bit都为1,表示未开启保护,所有访问都被允许。

该保护权限寄存器是具有SafetyEndInit机制的,因此改写的时候要操作SafetyWdg。另外需要注意的是,在改写之后,由于流水线等因素,保护生效具有一定的延时。

发生错误时DIEAR和DIETR寄存器可用于协助排查。

2.1.2 Local DLMU保护

同样的对于DLMU也具有完全相同的保护机制,其功能与xSPR的保护相互独立,具有独立的寄存器设置,此处不再加以赘述。

2.1.3 Local PFlash保护

对于本地PFlash来说,没有详细的地址段的划分,仅具有权限的划分,即权限为整块PFlash为颗粒度。

同样的,根据LPB_SPROT_ACCENA _R (master31-0)寄存器和LPB_SPROT_ACCENB _R (master 63-31)两个寄存器来定义64个Master设备的访问权限。

2.2 Register Access Protection(I/O Privilege Level)

内存保护中第二种方法是通过寄存器访问权限来防护,在TriCore™中,内核具有三种特权模式,也称为I/O模式:User-0 mode, User-1 mode and Supervisor mode。三种模式对于指令和寄存器具有不同的访问权限,首先对于指令三种模式就具有明显的区别:

图片

从图中我们可以看出,一些内核指令如MTCR(修改内核寄存器)等,需要在Supervisor模式下才能访问,而开关中断的ENABLE、DISABLE需要至少User-1以上模式才能访问,其余指令则所有模式都可以访问。

另外一个至关重要的区别,就是前文提到的寄存器访问保护,也就是说Aurix™ TC3XX内部的众多寄存器,对于CPU在访问时的模式是有要求的,也就是说某些寄存器,在CPU达到某些模式级别以上才能够访问。

所有的寄存器都有各自的访问权限,我们可以通过查询芯片手册中的寄存器表来判断其权限要求。比如下面这些QSPI相关寄存器,我们可以看到STATUS1寄存器在所有模式下都能够读写,而SSOC寄存器仅在SV模式下才能够写入,而一般情况下所有权限级别都能够读寄存器。

图片

特权模式的修改是通过修改程序状态字寄存器PSW.IO来实现的,2表示Supervisor Mode,1表示User-1 Mode,0则表示User-0 Mode。

特殊的,当程序处于用户态,而此时又需要访问特权模式下的寄存器时,则需要通过syscall来进入内核模式,一般是通过操作系统的相关权限调整,来实现寄存器的访问。

2.3 CPU MPU

CPU MPU是内存保护的核心内容,也是在AUTOSAR™架构下实现OS SC3内存保护的关键手段。在TriCore™的CPU MPU功能中,CPU中对代码和内存分别定义了多个地址段,针对这些地址段,设置了多个内存保护集,每个内存保护集具有详细的内存保护权限设置。

CPU MPU中的数据保护和代码保护是相互隔离的,存在相互独立的地址段定义。但是共用6个内存保护集,内存保护集相当于进程的身份识别,一般情况下与进程绑定。

CPU MPU的功能是需要单独开启的,是通过将SYSCON.PROTEN位置位来实现的,注意这是一个CPU寄存器,其作用范围仅为当前核。

2.3.1 Data Protection

在数据保护中,用户可以通过DPRi(i=0-17)寄存器定义最多18个地址段,每个内存保护集可以对这18个地址段分别定义访问权限。同样的,该地址段的区间范围也是左闭右开。如果两个区段地址具有重合,则权限取或逻辑,即拥有任意段的权限,则拥有了交叉地址间的权限。

如下图中我们可以看到,每个内存保护集使用DPREx(x=0-5)寄存器和DPWEx(x=0-5)寄存器分别定义对这18个段的读写权限,每个bit对应一个地址段(bit18-31为reserve),图中R表示Read,W表示Write,1表示有权限。比如图中Set1的DPWE寄存器的bit0为0,表示Set1保护集下没有对于Range0的写权限,但是DPRE的bit0为1,表示对Range0具有读权限。

图片

操作系统会把不同的保护集分给不同的进程,从而对不同进程进行权限管理。在TriCore™系统中,CPU进入中断程序或者Trap时,内存保护集自动切换到Set0,因此一般将内存保护集Set0分配给操作系统内核进程,其他进程在需要提权时通过syscall指令进入到操作系统内核模式。

在实践过程中,我们可以把Set0分给操作系统内核线程,给予其较大的访问权限;把Set1分给可信应用程序,给予适当的访问权限,把Set2分给非可信应用程序,给予较小的访问权限,从而实现内存数据的保护和隔离。

图片

与前面提到的Bus MPU不同,CPU MPU的访问是以CPU为主体的,当CPU进行数据访问时,MPU硬件结合当前内存保护集对地址进行权限检查,其保护范围可以是任意地址范围,但其仅能对对本地CPU进行限制,对于其他Master设备如DMA则不具有限制能力。

内存保护集的切换通过设置PSW.PRS寄存器实现。操作系统在进程切换时同步切换保护集,确保进程权限隔离。

在AUTOSAR操作系统中,一般保护集是跟随OsApplication进行分配的,核内的每个OsApplication通过保护集进行权限区分,其附属的Task或者Isr继承其保护集;同时也支持Task和Isr具有独立于OsApplication外的特有保护集,在Task或者Isr切换的时候切到特有的保护权限。

2.3.2 Code Protection

与数据保护相同,CPU MPU对代码执行保护的方式也是通过设置地址段以及保护集的权限来实现的,不同于数据保护的是,代码保护仅有一个执行权限的设置,且代码段仅可以设置10个区段。

同样的,代码保护也有专有的寄存器CPRi(i=0-9)来设置代码保护段,以及专有的CPXEi(i=0-5)权限寄存器来定义6个内存保护集对这些代码段的执行权限。CPXEi的每个bit对应一个地址段(bit18-31为reserve),图中X表示代码执行,1表示有权限。

图片

与数据保护逻辑类似,在将Set0分配给操作系统内核之后,将最大程度赋予其代码执行权限。当低权限的线程想要调用其权限以外的服务时,可通过syscall提权由其他高权限线程代为执行。

2.3.3 多核特性

CPU MPU的权限限制仅限于本核,并且前文所提到的所有内存保护寄存器都是CPU寄存器,每个核都有各自的一套该类寄存器,相互之间的MPU功能是独立的。

图片

因此每个核的内存保护之间是相互独立的,各个核需要根据实际需求实施特定的内存保护策略。

2.4 Trap异常系统

对于I/O寄存器权限保护和CPU MPU保护来说,如果进程违反了数据保护限制,即访问了当前保护集权限外的寄存器,执行了权限外的代码或者访问了权限外的数据,则CPU会产生Trap。

在TriCore™架构中,Trap Class 1中的类型是专门为内存保护设计的,我们可以看到图中Class 1的7个Trap类型都与内存保护有关。

图片

  • PRIV:Privileged Instruction,即访问了当前I/O权限以外的指令;
  • MPR:Memory Protection Read,即读取了当前内存保护集权限外的数据地址;
  • MPW:Memory Protection Write,即写入了当前内存保护集权限外的数据地址;
  • MPX:Memory Protection Execution,即执行了当前内存保护集权限外的代码地址;
  • MPP:Memory Protection Peripheral Access,即操作了当前I/O权限以外的外设寄存器;
  • MPN:Memory Protection Null Address,即空指针,访问了0地址;
  • GRWP:Global Register Write Protection,非法操作了全局寄存器,TriCore™提供了4个全局地址寄存器,一般用于操作系统保存当前线程指针等数据;

03 TC4 TriCore™ 1.8新特性

本文介绍的TriCore™内核版本为TriCore™ 1.6.2,英飞凌在2024年发布了新一代的Aurix™ TC4XX系列芯片,相对于TC3XX系列有较大升级,其使用TriCore™ 1.8的内核架构。

3.1 资源数量

在TriCore™ 1.8的内核架构中,数据和地址的内存保护区段数量都提升到了32个,同时内存保护集提高到了8个,相对于旧版本内存保护灵活性大大提高。

3.2 Level 2 Memory Protection

在Aurix™ TC4XX系列芯片中,增加了虚拟化功能,一个CPU内核能够虚拟出最多8个虚拟机。而这些虚拟化内存之间的访问自然而然需要进行内存间的保护和隔离,因此TriCore™ 1.8内核架构中增加了Level 2 Memory Protection。

在TriCore™ 1.8内核中,前向兼容前文所介绍的CPU MPU,并将其称为Level 1的内存保护,在此基础上还需要通过Level 2的内存保护的检查。

图片

在TriCore™ 1.8中,前代的Level 1内存保护独立存在,仍然可以进行开关和内存保护设置,与Level 2相互独立。

当CPU使能了虚拟化功能,并且VM1-VM7有虚拟机在运行,则Level 2的内存保护自动开启。

VM0作为硬件资源管理主虚拟机,无需经过Level 2的数据检查,而VM1-VM7则必须通过Level 2的MPU检查。

Level 2的检查原理与Level 1大致相同,通过设置地址区段以及各保护集的访问权限寄存器,通过VCON2.L2_PRS寄存器进行保护集的切换,实现虚拟机内存保护隔离。

3.3 Hypervisor trap system

TriCore™ 1.8架构中增加了虚拟化,同时也为虚拟化配备了相应的虚拟化专用Trap系统,用于处理在虚拟化中发生的Trap。

针对Level 2的内存保护,也如同Level 1一样提供了诸如读、写、执行相关的内存保护Trap。

图片

04 示 例

接下来我们通过一段调试示例,来进行TriCore™ 1.6中的内存保护讲解,通过一段非法访问的示例,介绍其内存保护的作用机制。

4.1 保护段配置

这里我选取了DLMU0的0xB0000000~0xB0010000地址作为目标地址段,将其配置到DPR9的位置。

图片

图片

将测试代码的进程保护集设置为Set2,设置其对进程对其访问权限为只读。

这里DPRE寄存器为0x237,对应的bit9为1,对该段具有读权限。

图片

这里DPWE寄存器为0x1b5,对应的bit9为0,对该段没有写权限。

图片

4.2 示例代码

这里直接通过指针访问该区域,首先通过读取该地址的值,然后对其进行写入。

go/* Init Data Ptr and Test Var. */volatile uint32 *TestAddr = (uint32*)0xB0000000;volatile uint32 TestVar;/* Here test memory access. */TestVar = *TestAddr;*TestAddr = 1u;

4.3 示例调试

我们将断点打在 TestVar = *TestAddr 这行准备执行。

图片

然后我们单步执行该地址的读操作,可以看到执行过程没有问题。这里DCache我是关闭的,所以不存在发生Trap的延迟。

图片

然后我们单步执行该地址的写操作,就进了Trap。并根据相关信息判断为Trap Class 1,TIN 3,即前文提到的MPW写权限异常。

图片

同时我们查看DEADD寄存器可以看到异常访问的地址,就是我们前面指针的目标地址。

图片

然后我们查看DSTR寄存器可以看到其内存错误类型为内存保护错误。

图片

以上就是关于内存保护的相关示例,读者可通过模拟示例加深对TriCore™内存保护系统的了解。

04 小 结

本文详细介绍了TriCore™架构的内存保护系统,介绍了其三种保护机制:Bus MPU用来防止其他Master对本地SRAM的异常访问,Register Access Protection用于防止非特权进程篡改外设寄存器,CPU MPU则是通过不同的保护集,来限制本核各个进程的内存访问权限。其中第一种使用较少,后两种在当下车规软件中广泛应用。最后通过示例代码和调试演示向读者展示了TriCore™内存保护的机制,并通过仿真错误场景介绍异常处理场景。

图片

END

作者:林Nova
来源:汽车电子与软件

推荐阅读:

更多汽车电子干货请关注汽车电子与软件专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
5796
内容数
530
汽车电子与软件行业的相关技术报道及解读。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息