1.66 スタックポインタの初期化とヒープの上下限

C ライブラリを使用する場合は、スタックポインタの開始位置を指定する必要があります。ヒープを使用する ARM ライブラリ関数(malloc()calloc() など)を使用する場合や、main()argc および argv コマンドライン引数を定義する場合は、ヒープが最初に使用するメモリ領域も指定する必要があります。

ヒープによって使用されるメモリ領域は、必要に応じてプログラム実行の後の段階で拡張できます。
スタックポインタの開始位置およびヒープが最初に使用するメモリ領域は、以下のいずれかの方法で指定できます。
  • スタックの一番上を指すシンボル __initial_sp を定義します。ヒープを使用している場合は、シンボル __heap_base および __heap_limit も定義します。
  • スキャッタファイル内で、以下のいずれかの操作を行います。
    • ARM_LIB_STACK 領域と ARM_LIB_HEAP 領域を定義します。
      ヒープを使用しない場合は、ARM_LIB_STACK 領域のみを定義します。
    • ARM_LIB_STACKHEAP 領域を定義します。
      ARM_LIB_STACKHEAP 領域を定義した場合、スタックは領域の先頭から始まります。ヒープは末尾から始まります。

    microlib では、上記の 2 つの方法のみが、スタックポインタの開始位置とヒープの上下限を定義するための方法としてサポートされます。
  • __user_setup_stackheap() を実装してスタックポインタを設定し、初期ヒープ領域の上下限を返します。
  • __user_initial_stackheap() を使用している従来のコードがあり、__user_initial_stackheap()__user_setup_stackheap() で置き換えたくない場合は、__user_initial_stackheap() を引き続き使用します。

    __user_initial_stackheap() の実装が以下に該当する場合を除き、ARM では、__user_initial_stackheap()__user_setup_stackheap() に置き換えることをお勧めします。
    • 適切なスタックを作成する前に独自のテンポラリスタックが必要になるなど、十分複雑に特殊化されている。
    • ユーザーに固有の特殊な要件があり、アセンブリ言語ではなく C で実装する必要がある。
初期スタックポインタは、8 バイトの倍数に境界整列されている必要があります。
デフォルトでは、ヒープ用のメモリがスタックに近い領域に配置されたメモリとオーバーラップする可能性がある場合、ヒープとスタックの潜在的な衝突が自動的に検出され、要求されたヒープ割り当ては失敗します。この自動衝突検出が必要でない場合は、#pragma import __use_two_region_memory を使用してこの機能を無効にすることにより、わずかですがコードサイズを小さくできます。

メモリ割り当て関数(malloc()realloc()calloc()、および posix_memalign())は、現在のスタックポインタと衝突する割り当ての検出を試みます。ただし、その試みが常に成功するとは限りません。
スタックへのヒープの拡張を自動的に検出することは可能ですが、ヒープメモリへのスタックの拡張を自動的に検出することはできません。
従来の目的のためには、これらの方法および動作をすべてバイパスすることができます。そのためには、以下の関数を定義して、独自にスタックおよびヒープメモリの管理を行います。
  • __rt_stackheap_init()
  • __rt_heap_extend()
関連する概念
1.69 __user_initial_stackheap() の従来のサポート
1.67 __initial_sp、__heap_base、および __heap_limit の定義
関連する作業
1.68 実行時のヒープサイズの拡張
関連する参考文書
4.52 __user_heap_extend()
4.53 __user_heap_extent()
4.61 古い関数 __user_initial_stackheap()
4.27 __rt_heap_extend()
4.31 __rt_stackheap_init()
4.54 __user_setup_stackheap()
4.55 __vectab_stack_and_reset
関連情報
スタックとヒープの配置
スキャッタファイルを使用したスタックとヒープの指定
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.