天天看点

Zephyr内核——用户模式——MPU堆栈对象MPU堆栈对象线程堆栈创建堆栈保护内存放置

MPU堆栈对象

线程堆栈创建

线程堆栈用

K_THREAD_STACK_DEFINE()

静态声明,或者使用

K_THREAD_STACK_MEMBER()

嵌入到结构中

对于使用内存保护单元(MPU)硬件的体系结构,堆栈在物理上是连续的分配。这种连续的分配会影响到内存中堆栈的放置,以及诸如堆栈保护和用户空间等其他特性的实现。对放置的影响直接归因于MPU区域的对齐要求。这将在下面的内存放置部分中进行讨论。

堆栈保护

堆栈保护机制需要硬件支持,以限制对内存的访问。内存保护单元可以提供这种支持。MPU提供了固定数量的区域。每个区域都包含有关要在该特定区域上强制执行的开始、结束、大小和访问属性的信息。

堆栈保护是通过使用单个MPU区域并设置该区域的属性以不允许写入访问来实现的。如果出现无效的访问,则会出现故障。堆栈保护层定义在堆栈的底部(最低地址)。

内存放置

在堆栈创建期间,会对内存的分配强制执行一组约束。这些约束条件包括确定堆栈的对齐方式和堆栈的正确大小。在链接二进制文件的过程中,这些约束被用于正确地放置堆栈。

内存约束的主要来源是针对SoC的MPU设计。MPU的设计可能需要对区域定义的特定约束。这些可以包括开始地址和结束地址的对齐,分配的大小,甚至是重叠区域之间的相互作用。

一些mpu要求每个区域对准2的幂。这些SoCs将会被定义为

CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT

。这意味着一个1500字节的堆栈应该对齐到一个2kb的边界,堆栈的大小也应该调整到2kb,以确保在区域的其余部分没有放置其他位置。包括未修改的ARMv7mMPU的SoCs将有这些约束。

一些ARMMPU使用起始地址和结束地址来定义MPU区域,起始地址和结束地址都需要32字节对齐。这种MPU的一个例子是在NXP FRDM K64F中发现的。

mpu可能有一个区域优先级机制,它使用覆盖内存访问的最高优先级区域来确定执行策略。其他国家可以根据逻辑或地区来确定执行政策。

大小和对齐约束可能会导致堆栈分配大于请求的大小。在实现堆栈保护时,区域优先级机制可能会增加一些复杂性。

继续阅读