天天看點

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可能有一個區域優先級機制,它使用覆寫記憶體通路的最高優先級區域來确定執行政策。其他國家可以根據邏輯或地區來确定執行政策。

大小和對齊限制可能會導緻堆棧配置設定大于請求的大小。在實作堆棧保護時,區域優先級機制可能會增加一些複雜性。

繼續閱讀