http://tech.sinby.com/wiki_ja/index.php?xilkernel%20%A4%F2%C6%C9%A4%E0
EDK 8.X では /EDK/gnu/microblaze/nt/microblaze/lib/src にソースがある。EDK10.1 ではソースがなくなった。xilinx のダウンロードサイトからダウンロード可能。http://www.xilinx.com/guest_resources/gnu/
ながれとしては
_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.pdfbrai は絶対番地の即値にジャンプ(分岐)するとある。abs imm ということか。_start1 ではスタックポインタの設定をして _crtinit を brlid している。brlid は即値に分岐およびリンク。
brlid r15, _crtinit
r15 に呼びもとの PC が入る。すなわち関数コールに使う。
r0 は zero レジスタ。常に zero が読み出される。mips と似ている。
sbss と bss のクリア。その後、次の関数コールをする。
1 2
1264549c <_program_init>:1264549c: b60f0008 rtsd r15, 8126454a0: 80000000 or r0, r0, r0
crt1, 2, 3, 4 もあるのだがこれはまずは無視。どうやら別系統?
_init は次の関数を呼ぶ
結果として do_global_ctors_aux で C++ の事前処理が行われる模様。(gccのコードを読まないとなんともいえないが)
さぁ main だ。
xilkernel は sw/lib/bsp/xilkernel_v3_00_a にあるので読む。次の関数を呼んでいる。
hw_init 以外はすべてソフト的な機能。
src/src/arch/microblaze/mb-hw.c から。