You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.8 KiB
63 lines
2.8 KiB
.. _mpu_stack_objects: |
|
|
|
MPU Stack Objects |
|
################# |
|
|
|
Thread Stack Creation |
|
********************* |
|
|
|
Thread stacks are declared statically with :c:macro:`K_THREAD_STACK_DEFINE()`. |
|
|
|
For architectures which utilize memory protection unit (MPU) hardware, |
|
stacks are physically contiguous allocations. This contiguous allocation |
|
has implications for the placement of stacks in memory, as well as the |
|
implementation of other features such as stack protection and userspace. The |
|
implications for placement are directly attributed to the alignment |
|
requirements for MPU regions. This is discussed in the memory placement |
|
section below. |
|
|
|
Stack Guards |
|
************ |
|
|
|
Stack protection mechanisms require hardware support that can restrict access |
|
to memory. Memory protection units can provide this kind of support. |
|
The MPU provides a fixed number of regions. Each region contains information |
|
about the start, end, size, and access attributes to be enforced on that |
|
particular region. |
|
|
|
Stack guards are implemented by using a single MPU region and setting the |
|
attributes for that region to not allow write access. If invalid accesses |
|
occur, a fault ensues. The stack guard is defined at the bottom (the lowest |
|
address) of the stack. |
|
|
|
Memory Placement |
|
**************** |
|
|
|
During stack creation, a set of constraints are enforced on the allocation of |
|
memory. These constraints include determining the alignment of the stack and |
|
the correct sizing of the stack. During linking of the binary, these |
|
constraints are used to place the stacks properly. |
|
|
|
The main source of the memory constraints is the MPU design for the SoC. The |
|
MPU design may require specific constraints on the region definition. These |
|
can include alignment of beginning and end addresses, sizes of allocations, |
|
or even interactions between overlapping regions. |
|
|
|
Some MPUs require that each region be aligned to a power of two. These SoCs |
|
will have :kconfig:option:`CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT` defined. |
|
This means that a 1500 byte stack should be aligned to a 2kB boundary and the |
|
stack size should also be adjusted to 2kB to ensure that nothing else is |
|
placed in the remainder of the region. SoCs which include the unmodified ARM |
|
v7m MPU will have these constraints. |
|
|
|
Some ARM MPUs use start and end addresses to define MPU regions and both the |
|
start and end addresses require 32 byte alignment. An example of this kind of |
|
MPU is found in the NXP FRDM K64F. |
|
|
|
MPUs may have a region priority mechanisms that use the highest priority region |
|
that covers the memory access to determine the enforcement policy. Others may |
|
logically OR regions to determine enforcement policy. |
|
|
|
Size and alignment constraints may result in stack allocations being larger |
|
than the requested size. Region priority mechanisms may result in |
|
some added complexity when implementing stack guards.
|
|
|