Q:How can I configure MPU(Memory Protection Unit) for an OS_Task in Vector AUTOSAR Conguration Tool?

A:

For a configured task, you configure OsTaskMemoryProtectionIdentifier to specify a memory protection identifier for the task. you set the protection ID.

If this parameter is not set but the owner OS-Application has a memory protection identifier specified this value will be used for the task.

Memory protection identifier are configured inside Os/OsPublishedInformation/OsDerivativeInformation/OsMemoryRegionSpecifics

Depending on the used platform protection identifiers are also referred as PID (MPC), ASID (RH850) or protection sets (TriCore)

 
answered Jan 5, 2021 at 20:08

You can find a high level guide in section "3.17 Memory Protection" of TechnicalReference_Os.pdf in your SIP. Please work through this and then feel free to ask specific questions. However, then we will need a lot more information, which you probably cannot write in public here. 

 CommentedSep 14, 2021 at 15:35

 

对于已配置的任务,您可以配置OsTaskMemoryProtectionIdentifier为该任务指定内存保护标识符。您可以设置保护ID。

如果未设置此参数,但所有者OS-Application指定了内存保护标识符,则该值将用于任务。

内存保护标识符在Os/OsPublishedInformation/OsDerivativeInformation/OsMemoryRegionSpecifics内部配置

根据使用的平台,保护标识符也称为PID (MPC)、ASID (RH850)或保护集(TriCore)。

1、计算机原理简介

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

 

image

 2、存储器地址的映射简介

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,如下图所示,给存储器分配地址的过程称为存储器映射。如果内核整体可以寻址的 0 到 2^32 -1 共计 4GB 的寻址空间。功能部件RAM, Flash,外设等共同排列在一个4GB的地址空间内。

image

 

3、C程序地址映射到存储器,即编译器的链接过程。(Linux三级页表)

程序C语言通过这些地址可以访 问 RAM、Flash、外设等,进行读写操作。C编译的程序占用的内存分为以下几个部分:

image

 

image

 

(1)代码段(.text),也称文本段(TextSegment),存放着程序的机器码和只读数据,可执行指令就是从这里取得的。如果可能,系统会安排好相同程序的多个运行实体共享这些实例代码。这个段在内存中一般被标记为只读,任何对该区的写操作都会导致段错误(Segmentation Fault)。文字常量(.const)—常量字符串也是放在这里的。

 

(2)数据段,包括已初始化的数据段(.data)和未初始化的数据段(.bss),
data:用来存放保存全局的和静态的已初始化变量,
bss:后者用来保存全局的和静态的未初始化变量。数据段在编译时分配。

 

(3)堆栈段分为堆和栈:
堆(Heap):用来存储程序运行时分配的变量。
堆的大小并不固定,可动态扩张或缩减。其分配由malloc()、new()等这类实时内存分配函数来实现。
当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);
当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
堆的内存释放由应用程序去控制,通常一个new()就要对应一个delete(),如果程序员没有释放掉,那么在程序结束后操作系统会自动回收。 

栈(Stack)是一种用来存储函数调用时的临时信息的结构,如函数调用所传递的参数、函数的返回地址、函数的局部变量等。在程序运行时由编译器在需要的时候分配,在不需要的时候自动清除。
栈的特性: 最后一个放入栈中的物体总是被最先拿出来,这个特性通常称为先进后出(FILO)队列。
栈的基本操作: PUSH操作:向栈中添加数据,称为压栈,数据将放置在栈顶;
POP操作:POP操作相反,在栈顶部移去一个元素,并将栈的大小减一,称为弹栈。

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

image

image

 int a = 0; //全局初始化区

char *p1; //全局未初始化区

main

{

  int b; //栈

  char s[] = "abc"; //栈

  char *p2; //栈

  char *p3 = "123456"; //123456\0在常量区,p3在栈上。

  static int c = 0; //全局(静态)初始化区

  p1 = (char *)malloc(10);p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。

  strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

}

 

4、MPU内存保护单元

Memory Protection Unit

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

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

image

 

 

image

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

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

image

 

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

 

 

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

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

 

posted on 2025-09-17 09:31  长缨在手_521  阅读(127)  评论(0)    收藏  举报