2017-08-28 6 views
0

私は、ベアメタルCアプリケーションがどのように正確に動作するかを理解しようとしています。 __libc_init_arrayを呼び出す独自の起動アセンブリコードを書きましたが、preinit_arrayセクションを反復して内部のすべての関数を呼び出していました。 gccはmainの前に実行する必要があるいくつかの独自の初期化ルーチンに対してこのセクションを追加しますが、その後は.initセクションの_init()関数になります。ベアメタルCアプリケーションはどのくらい正確に起動しますか?

gccはその機能を生成しますか? libcから来ていますか?それとも自分のものを提供しなければならないのですか?それらのことを学ぶための良い資源は何ですか?

+0

良いリソースには、プラットフォーム文書と 'objdump'が含まれています。 – spectras

+0

シンボルはプラットフォームと何が関係していますか?あるプラットフォームでgccによって生成され、別のプラットフォームではinit_()は生成されません:) –

+0

すべてのプロセスはプラットフォーム固有です。たとえば、AVRでは、初期化コードに割り込みベクタテーブルをスキップするためのパディングが含まれている必要があります。そして、コンテンツそのものは、Cプログラムが実行される環境を設定するためのものです:固定レジスタの初期化、スタックポインタの設定、トラップハンドラのインストールなどです。 – spectras

答えて

1

記号はプラットフォームと何が関係していますか? 1つのプラットフォームで gccによって生成され、別のプラットフォームではinit_()ですか?

はい起動とエピローグルーチンは実装に残されており、実際にはgccは生成しません。初期化は、完全に異なる方法で行うことができるターゲットハードウェアに応じて、https://github.com/bminor/newlib/blob/e0f24404b3fcfa2c332ae14c3934546c91be3f42/newlib/libc/misc/init.c

-

libcのは、これらのsysmbolsを提供します。

例STM32Fxxxの起動。

.section .text.Reset_Handler 
    .weak Reset_Handler 
    .type Reset_Handler, %function 
Reset_Handler: 
    ldr sp, =_estack /* Atollic update: set stack pointer */ 

/* Copy the data segment initializers from flash to SRAM */ 
    movs r1, #0 
    b LoopCopyDataInit 

CopyDataInit: 
    ldr r3, =_sidata 
    ldr r3, [r3, r1] 
    str r3, [r0, r1] 
    adds r1, r1, #4 

LoopCopyDataInit: 
    ldr r0, =_sdata 
    ldr r3, =_edata 
    adds r2, r0, r1 
    cmp r2, r3 
    bcc CopyDataInit 
    ldr r2, =_sbss 
    b LoopFillZerobss 
/* Zero fill the bss segment. */ 
FillZerobss: 
    movs r3, #0 
    str r3, [r2], #4 

LoopFillZerobss: 
    ldr r3, = _ebss 
    cmp r2, r3 
    bcc FillZerobss 

/* Call the clock system intitialization function.*/ 
    bl SystemInit 
/* Call static constructors */ 
    bl __libc_init_array 
/* Call the application's entry point.*/ 
    bl main 

あなたはこの実装で見るように、2つの関数が呼び出される - 1つの非常に低いレバーのハードウェアの初期化のためのSystemInit__libc_init_array

それが(最近で最も一般的なベアメタルで使用newlibのライブラリの内部初期化ですプロジェクト)

問題は、標準ライブラリを使用せず、標準ライブラリをリンクしたくない場合です。いくつかのチェーンチェーンは、リターンステートメントだけで弱い機能を提供します。リンカーに問題がある場合は、スタートアップファイルでこの呼び出しをコメントするか、空の関数を自分で指定してください。

関連する問題