ホーム  |  製品 & サービス   |  サポート & ダウンロード  |  開発者向け情報  |  お問い合わせ
人生に地図はない
xilkernel を読む

http://tech.sinby.com/wiki_ja/index.php?xilkernel%20%A4%F2%C6%C9%A4%E0

boot シーケンス=mainが呼ばれるまで

EDK 8.X では /EDK/gnu/microblaze/nt/microblaze/lib/src にソースがある。
EDK10.1 ではソースがなくなった。xilinx のダウンロードサイトからダウンロード可能。
http://www.xilinx.com/guest_resources/gnu/

ながれとしては

  • _start
  • _start1
    • _crtinit
  • exit

crt0.s

_start で始まる。_start1 を呼ぶ。



brai _start1

逆アセンブラすると

   0:   b0001260        imm     4704
4: b8080000 brai 0 // 12600000 <_start1>

brai 命令は即値をみてジャンプする。b0001260 はデータとして一時的なレジスタに格納される。次の命令で使えるようになる。これはマイクロブレーズの仕様。
http://japan.xilinx.com/ise/embedded/j_mb_ref_guide8.pdf
brai は絶対番地の即値にジャンプ(分岐)するとある。abs imm ということか。
_start1 ではスタックポインタの設定をして _crtinit を brlid している。
brlid は即値に分岐およびリンク。



brlid r15, _crtinit

r15 に呼びもとの PC が入る。すなわち関数コールに使う。

r0 !!!

r0 は zero レジスタ。常に zero が読み出される。mips と似ている。

_crtinit

sbss と bss のクリア。
その後、次の関数コールをする。

  • _program_init

    ここにはない。xylon のサンプルを見ると何もしていない
      1
    2

    1264549c <_program_init>:
    1264549c: b60f0008 rtsd r15, 8
    126454a0: 80000000 or r0, r0, r0
    libxil.a に _program_init.o があった。なければリンクする。必要であればユーザが用意する。というコンセプトのようだ。
  • __init
  • main
  • __fini
    おー main が見えてきた。参考までに書くと, xilkernel は bss のクリアしかしていないようだ。これは ROM 上に SREC 形式で書かれたプログラムをロードするのを前提にしているためらしい。つまり、data のコピーはブートシーケンスではせずに、boot loader がやってくれることを期待している。

crt1, 2, 3, 4 もあるのだがこれはまずは無視。どうやら別系統?

__init

_init は次の関数を呼ぶ

  • __frame_dummy
  • __do_global_ctors_aux
    これらの関数は crtbegin.o にある。gcc が提供している。参考までに書くとこの文書の元になっている gcc は 3.4.1。4.1.X では初期化がもっと一般化されている(ctor という形ではないようだ)ようなのでちょっと情報としては古いかも。

結果として do_global_ctors_aux で C++ の事前処理が行われる模様。(gccのコードを読まないとなんともいえないが)

まとめ

  • _start
  • _start1
    • _crtinit
      • bss の clear
      • _program_init (なにもしない)
      • __init (C++ の初期化含む)
      • main
      • __fini
  • exit

さぁ main だ。

xilkernel_main

xilkernel は sw/lib/bsp/xilkernel_v3_00_a にあるので読む。
次の関数を呼んでいる。

  • xilkernel_init
  • xilkernel_start
    通常は XPS で初期化時に起動するスレッドを設定しておく。pthread が有効なら pthread のテーブルに起動時に起こしたい関数群を記述することになる。xilkernel_init で初期化される。さらにxilkernel_start で割り込みがかかりそのまま main は idle_task になる。

xilkernel_init

  • hw_init

    src/arch/microblaze/mb-hw.c にある。割り込みとタイマーの初期化。
  • ptable の初期化
  • sp の設定
  • readyq_init
  • pthread_init
  • sem_heap_init
  • msgq_init
  • shm_init
  • init_idle_task
  • se_process_init(sys_process_create が使われが、通常使われない?)
  • kb_pthread_init
  • soft_tmr_init

hw_init 以外はすべてソフト的な機能。

src/src/arch/microblaze/mb-hw.c から。

  • int_system_init 割り込みハンドリングシステムの初期化
  • pit_initialize 周期的な割り込みの登録