0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

AUTOSAR内存分区和MPU关系简述

汽车ECU开发 来源:AutomotiveSoftwareEngineer 2024-03-18 11:15 次阅读

MPU的功能

wKgaomX3spuAIr-1AAB0LYdjRW0563.jpg

MPU功能简述

MPU保护与当前执行的代码“不相关“的所有数据。

“不相关”是相关内存地址的权限受限制,或者是程序访问内存地址的范围于其无关,阻止关键数据被破坏,使嵌入式系统更加健壮与安全。

MPU作用主要有两个方面:

为两个保护,一个检测

1)MPU的保护作用

指访问区域的保护和读写区域的保护。

① 访问区域的保护。

可以将内存区域划为特权区域和普通区域,特权区域只有特权用户才能访问,普通用户被禁止访问,以此来保护特定的数据。

常见的应用场景:

1> 对带系统的来说,可以设置数据,以防止用户应用程序破坏操作系统使用过程中的数据。

2> 隔离任务,以防止一个任务访问其他任务的数据。

3> 将SRAM或者RAM空间定义为不可执行,防止代码注入。

② 读写区域的保护。

设置指定的区域为只读,可以有效的防止比较关键的数据被错误修改。

2)MPU的检测功能

指可以检测堆和栈的溢出情况及数组有没有越界。

功能安全中对内存分区MPU的相关描述

汽车ECU软件是高度模块化的嵌入式软件,其功能实现是可以为非功能安全,和功能安全的SWC组合,它们分别拥有不同的ASIL安全等级。

wKgaomX3spuAM8-FAAD_AF1j25A516.jpg

根据ISO26262,如果嵌入式软件包含不同ASIL等级的SWC,要么整个软件工程都需要基于最高安全等级的要求进行开发,需要保证拥有更高安全等级的SWC的操作不会受到其他SWC的干扰,也即需要做到FFI(Freedom from interference)的设计。

基于更低安全等级要求开发的SWC,可能会出现错误地访问到更高安全等级SWC的内存区域,产生干扰。

为此,SWC需要运行在不同的内存区域,或者不同的内存分区,来防止类似的内存访问违例。

wKgZomX3spuAK_H2AAEUuQ7-yaI262.jpg

ISO26262中,以下内存相关的故障影响被视为SWC之间产生干扰的原因:

内容损坏

读写区域属于另一个SWC

数据不一致

栈溢出或栈下溢

要满足上述定义,是MPU内存保护的目标,也可以通过限制对于内存以及内存对应的硬件的访问。

这里的内存分区意味着:

各OS Application运行在相互保护(不干涉)的内存区域,在某一个分区上运行的代码,无法修改另一个分区的内存。

内存分区也可以保护只读内存段(例如代码执行)以及内存对应的硬件。

内存分区和用户/特权模式可以保证SWC之前互不干扰——即使某一个SWC出现了内存相关的故障,也不会对其他软件模块有影响。

如果一个SWC运行在用户模式,那么它对CPU资源/指令的访问也是受限制的。

MPU的微控制器有专用的硬件

即内存保护单元(MPU),来支持内存分区。

wKgZomX3spuAV2evAABGB8Zm_xE658.jpg

若想深入理解上述的MPU描述,得先来看下,内存分区和MPU的基础知识。

计算机程序执行的基础简介

内存

计算机的主要作用是对输入数据进行处理和运算后输出,CPU处理器主要完成数据的处理运算,但输入输出数据包括处理过程中的临时数据需要有一个空间去存放,这个临时存放数据供处理器和外设使用的地方就是内存。

wKgaomX3spuAV7RuAABnBrStZBE939.jpg

如上图,为了提高效率把存放程序(也即控制指令)和数据(也即操作数)的空间分开,同时把访问指令与访问数据的总线分开,使取指令和执行指令能够重叠(处理器的流水线)。

内存寻址

wKgZomX3spuAEbAgAACsXxyhfJY935.jpg

处理器与内存之间有地址总线用于寻址,有数据总线用于传输数据,当然也有相应的控制线来读写操作。

wKgaomX3spuASCcBAAIFx9TNW5k653.jpg

存储器地址的映射简介

wKgaomX3spuAJsYQAAS_VxC0iTA783.jpg

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,如图所示,给存储器分配地址的过程称为存储器映射。

如果内核整体可以寻址的 0 到 2^32 -1 共计 4GB 的寻址空间。功能部件RAM, Flash,外设等共同排列在一个4GB的地址空间内。

地址分配

程序C语言通过这些地址可以访 问 RAM、Flash、外设等,进行读写操作。

C编译的程序占用的内存分为以下几个部分:

wKgZomX3spuAZ98xAACXKaK0p4w862.jpg

栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

文字常量区(.const)—常量字符串就是放在这里的。

程序代码区(.text)—存放函数体的二进制代码。

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。MPU也支持堆栈溢出检测,简单如下图。

wKgZomX3spuAExeKAAA7Nz-KGd4060.jpg

代码例子

wKgaomX3spuAEL-iAAFP6IaP8H4378.jpg

inta=0;//全局初始化区
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main() {
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456�在常量区,p3在栈上。
static int c = 0; //全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456�放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

MPU内存保护单元

Memory Protection Unit

上文描述的内存区,堆栈区,数据区,代码区都可以被MPU保护,安全相关的微处理器通常都在硬件级别上支持内存分区保护,MPU主要是通过内存映射的地址范围限制,和监控非受信区域的内存访问来实现的。

wKgaomX3staAYDmPAADRYBF8LkQ452.jpg

MPU可以保护的区域为内存映射区memory map,可以设置不同存储区域的存储器访问特性(如只支持特权访问或全访问)和存储器属性(如可缓存、可缓冲、可共享),对存储器(主要是内存和外设)提供保护,保护可执行程序的(data、code和stack)区域。

MPU 的Region区域

是可编程保护区域(需要控制器硬件支持),如下图

wKgZomX3staAYErPAADVW2HyLQg573.jpg

wKgZomX3steAVnDwAADdh7eBgy0792.jpg

MPU的配置是通过设置多个MPU寄存器,定义多个MPU region,每个MPU region的可配置选项包括: 被保护的起始地址,大小size,访问权限,所属硬件MPU分类,Region Owner 以及有效ID等。

wKgZomX3staAYEeTAABc-R9FvWU751.jpg

MPU在执行其功能时,也是以“region区域”为单位的。

通过上述的MPU配置,各个软件模块将具备对不同memory区域的不同访问权限。

如图,一个region上述配置的一段连续的地址,它们的位置和范围都要满足一些限制。

MPU是可以管理所有的存储空间(如图 4G),可以划分不同的Region内存区域,并为每个Region设置访问权限与规则,不同的Region允许相互重叠,重叠区域受多重访问规则的限制。

Link命令对于内存的设置

编译器关联的,可参考下面TI的解释

https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html

特权模式与用户模式

是内核的执行模式。

当代码运行在特权模式下,代码拥有所有的访问许可;

而代码运行在用户模式,则访问权限受限制。

也是MPU中所定义的内存访问规则。

AUTOSAR中的定义

内存分区的定义

wKgaomX3staALuhYAAGS7b0Zu-Y658.jpg

如上图,一般来说,

BSW模块运行在授信模式/监控者模式内存分区当中。

部分SWC分组并放置到非授信/用户模式内存分区当中。

个别SWC也运行在授信/监控者模式内存分区当中。

项目中可以有多个非授信/用户分区,每个分区都可以包含一个或多个SWC。

上图中,分区是以应用软件OS-Application为对象定义的,OS-Application和内存分区(Partition)之间,是一对一的关系。

如何理解OS-Application?

下文简述

如下图中,应用程序内的 AUTOSAR SWC

wKgaomX3syOAXsBZAABizeS-lKU542.jpg

在AUTOSAR架构中,应用程序位于RTE之上的,基于应用功能逻辑定义,内部包含一组存在信息交换的软件组件(SWC)。

软件组件SWC是实现一系列的原子功能(最小单元不可拆分),SWC包含一系列的功能实现和变量定义,这些功能实现和变量定义对于外部是不可见的,仅能通过公布的RTE接口使用。

SWC以周期性执行或者以外部触发的runnable中执行。

从分配的角度来看,一个SWC可以由多个Runnable构成,一个OS-Task可以触发多个Runnable(同一个SWC内的Runnable可以在不同的OS-Task上执行),一个OS-Application可以管理多个OS-Task。

AUTOSAR OS-Application

wKgaomX3steAIR9EAACTN05oCzs270.jpg

AUTOSAR的OS-Application是操作系统对象的集合体,其中包括任务(Tasks),中断服务程序 (ISRs),调度表 (Schedule Tables),计数器 (Counters)和警报 (Alarms),这些对象构成一个内聚的功能单元。

OS-Application可以分为2类:

受信任 (Trusted)的OS-Application

可以不受那些运行时的监控 (Monitoring)或者保护 (Protection)特性的限制执行。

这类应用可以不受限的访问内存和操作系统API。受信任的应用对于执行时间上也不受限制,同时也可以在任何支持的处理器上以特权模式执行。

不受信任 (Non-trusted)的OS-Application

不可以在运行时监控及保护机制关闭的时候执行。这类应用在访问内存、操作系统API时都有限制,同时也不允许以特权模式执行。

AUTOSAT Memory Mapping

AUTOSAR有memory mapping的特性可支持上述内存分区Memory

Partitioning,从而提供MPU需要的Non-trusted 和Trusted的内存分配区域设置。

wKgZomX3steAWHEqAABp2IxsNUY035.jpg

详细见AUTOSAR_SWS_MemoryMapping.pdf

MPU的限制规则

内存分区Memory Partitioning的限制

wKgaomX3steAfKDnAAHadi3TSC4049.jpg

在同一个OS-Application内的对象相互访问,提供了不受限的通信支持。

在一个OS-Application内的各个对象可以互相访问,可以分属于不同的SWC。

MPU工作的过程

wKgZomX3steATe9VAAS_OlEHQfQ712.jpg

操作系统要事先根据功能,和软件架构,定义软件分区,进行MPU region配置,

任务运行时,操作系统根据MPU的配置,检测和阻止不正确的内存访问,若出现了在非受信区域的内存访问或者执行了不合法的CPU指令,这些访问首先会被阻止,然后处理器硬件会产生一个异常 (Exception),记录故障码DTC。

操作系统和RTE会处理这些异常:执行内存分区的关闭 (Shutdown),或重启分区内的所有SWC的动作。

总结语

AUTOSAR中提供的内存分区机制,通过SWC,RTE,Mem映射实现,限制访问内存,支持内存保护。而内存分区的定义(trust/un trust)和限制规则由控制器的系统设计决定。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7487

    浏览量

    151027
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136147
  • MPU
    MPU
    +关注

    关注

    0

    文章

    346

    浏览量

    48730
  • AUTOSAR
    +关注

    关注

    10

    文章

    350

    浏览量

    21466
  • SRAM芯片
    +关注

    关注

    0

    文章

    65

    浏览量

    12048

原文标题:AUTOSAR 内存分区和MPU关系讲解

文章出处:【微信号:eng2mot,微信公众号:汽车ECU开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Autosar软件开发技术概述

    AUTOSAR是由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立,各成员保持开发合作伙伴关系。自2003年起,各伙伴公司携手合作,致力于为汽车工业开发一个开放的、标准化的软件架构
    发表于 12-26 10:34

    AUTOSAR的工作原理是什么?为什么需要AUTOSAR

    AUTOSAR的工作原理是什么?为什么需要AUTOSAR
    发表于 05-17 06:44

    如何在MCU系统中实现完全分区隔离

    的处理器来实现可接受的进程切换时间,而且在任务级别并不合适。使用内存保护单元 (MPU) 实现 MCU 的完全分区隔离是可能的,但难度很大。这是讨论如何在 MCU 系统中实现完全分区
    发表于 11-01 08:17

    AUTOSAR是什么

    一、AUTOSAR是什么AUTOSAR组织自己的介绍是AUTOSAR (AUTomotive Open System ARchitecture) is a worldwide development
    发表于 11-10 07:47

    介绍AUTOSAR支持的四种功能安全机制

    1、AUTOSAR的四种功能安全机制虽然AUTOSAR不是一个完整的安全解决方案,但它提供了一些安全机制用于支持安全关键系统的开发。本文用于介绍AUTOSAR支持的四种功能安全机制:内存
    发表于 06-10 17:33

    AUTOSAR功能安全机制之内存分区与实现

    1、AUTOSAR功能安全机制之内存分区与实现  在AUTOSAR架构中,应用软件位于RTE上方,由互连的AUTOSAR SWC组成,这些组
    发表于 09-19 15:55

    基于迭代填充的内存计算框架分区映射算法

    针对内存计算框架Spark在作业Shuffle阶段一次分区产生的数据倾斜问题,提出一种内存计算框架的迭代填充分区映射算法(IFPM)。首先,分析Spark作业的执行机制,建立作业效率模
    发表于 12-05 16:32 0次下载
    基于迭代填充的<b class='flag-5'>内存</b>计算框架<b class='flag-5'>分区</b>映射算法

    简单剖析虚拟内存与交换分区

    很多朋友会把虚拟内存认为就是交换分区。其实,虚拟内存并非真正存在的物理空间,它仅仅是一个虚拟的东西。
    的头像 发表于 02-09 08:44 6239次阅读

    存储器的分区内存管理与分区存储管理

    内存固定地划分为若干个大小不等的分区供各个程序使用,每个分区的大小和位置都固定,系统运行期间不再重新划分。
    发表于 05-26 10:28 3101次阅读
    存储器的<b class='flag-5'>分区内存</b>管理与<b class='flag-5'>分区</b>存储管理

    Cortex-M内核的MPU内存保护单元

    讲讲Cortex-M内核的MPU内存保护单元
    的头像 发表于 03-04 11:17 3614次阅读
    Cortex-M内核的<b class='flag-5'>MPU</b><b class='flag-5'>内存</b>保护单元

    为什么要使用MPUMPU如何实现内存保护?

    如果你开发的嵌入式项目,因内存溢出,或者内存故障等一些原因,造成了重大经济损失,或者造成了重大事故,你就能体会为什么要使用内存保护单元(MPU)了。
    的头像 发表于 07-05 17:38 6660次阅读
    为什么要使用<b class='flag-5'>MPU</b>?<b class='flag-5'>MPU</b>如何实现<b class='flag-5'>内存</b>保护?

    AUTOSAR SWC内存分区与实现

    AUTOSAR架构中,应用软件位于RTE上方,由互连的AUTOSAR SWC组成,这些组件以原子方式封装了应用软件功能的各个组成部分。
    发表于 10-08 11:58 2546次阅读
    <b class='flag-5'>AUTOSAR</b> SWC<b class='flag-5'>内存</b><b class='flag-5'>分区</b>与实现

    AUTOSAR架构之内存分区与实现

    AUTOSAR SWC独立于硬件,因此可以集成到任何可用的ECU硬件上。为了便于ECU内部和内部的信息交换,AUTOSAR SWC仅通过RTE进行通信。
    发表于 11-11 11:49 1184次阅读

    为什么要使用MPUMPU如何实现内存保护?

    如果你开发的嵌入式项目,因内存溢出,或者内存故障等一些原因,造成了重大经济损失,或者造成了重大事故,你就能体会为什么要使用内存保护单元(MPU)了。
    的头像 发表于 02-24 11:59 2608次阅读

    什么是MPUMPU在哪些方面保护内存安全?

    内存保护单元(MPU)是一种硬件机制,通过只允许代码访问需要的内存和外设来提高嵌入式设备的安全性。
    的头像 发表于 06-12 09:06 1.1w次阅读
    什么是<b class='flag-5'>MPU</b>?<b class='flag-5'>MPU</b>在哪些方面保护<b class='flag-5'>内存</b>安全?