4.52 __user_setup_stackheap()

__user_setup_stackheap() は、初期スタックおよびヒープの位置を設定し、返します。

この関数を定義した場合、プログラムの起動時に C ライブラリによって呼び出されます。
__user_setup_stackheap() が呼び出されると、sp はアプリケーションへのエントリ時と同じ値になります。有効な値が設定されてから C ライブラリ初期化コードが呼び出されると、この値が保持されます。sp が有効な値でない場合は、スタックの使用前および呼び出し元に戻る前に、__user_setup_stackheap() によってこの値を変更する必要があります。
__user_setup_stackheap() の戻り値は以下のとおりです。
  • プログラムでヒープを使用する場合は、ヒープベース。
    • AArch32 状態では、レジスタ R0 にはヒープベースが含まれています。
    • AArch64 状態では、レジスタ X0 にはヒープベースが含まれています。
  • sp のスタックベース。
  • プログラムでヒープおよび 2 領域メモリを使用する場合はヒープリミット。
    • AArch32 状態では、レジスタ R2 にはヒープリミットが含まれています。
    • AArch64 状態では、レジスタ X2 にはヒープリミットが含まれています。
この関数を再実装する場合には、以下のガイドラインに従う必要があります。
  • PCS によって要求される SP 以外のレジスタを保存すること。
  • ヒープのアラインメントを守ること。
    • AArch32 状態では、ヒープベースが 8 バイトの倍数になるようにして、ヒープ内は常に 8 バイト境界の整列を守る。
    • AArch64 状態では、ヒープベースが 16 バイトの倍数になるようにして、ヒープ内は常に 16 バイト境界の整列を守る。
sp を実行環境から継承し、ヒープを持たない __user_setup_stackheap() を作成するには、以下のようにします。
  • AArch32 状態では、r0r2 をゼロに設定して、復帰する。
  • AArch64 状態では、x0x2 をゼロに設定して、復帰する。
スタックのサイズに制限はありません。ただし、ヒープ領域がスタックにオーバーラップする場合は、malloc() がオーバーラップしているメモリの検出を試み、新しいメモリ割り当て要求を失敗させます。

__user_setup_stackheap() はアセンブラで再実装する必要があります。
関連する概念
1.11.3 スタックポインタの初期化とヒープの上下限
1.11.4 __user_initial_stackheap() の従来のサポート
関連する参考文書
4.25 __rt_heap_extend()
4.29 __rt_stackheap_init()
4.50 __user_heap_extend()
4.51 __user_heap_extent()
1.6.5 C ライブラリ関数の直接セミホスティング依存関数
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.