cyber205の日記: sh-ipl+g
現在、SH ipl+g のソースコードを引っ張り出して読んでいたりして。
以前は「BIOS-ROMを改造するぜ!」っていきまいてたのだが、
いつのまにか、ほったらかしにしてしまっていたのだよなぁ。
忘れかけたSuperHの命令セットを再度見直しちう。
ああ、アセンブラむずいむずい…。
「RISCらしい命令の使い方してるな」と思ったのは、
遅延分岐の遅延実行命令にオートデクリメント型の命令を
組み合わせて使っている部分とか。これは結構面白いコードだ。
[CODE AREA]
/* Initialize BSS */
mov.l 2f, r1
add #4, r1
mov.l 3f, r2
mov #0, r0
9:
cmp/hs r2, r1
bf/s 9b
mov.l r0, @-r2
[DATA AREA]
2:
.long SYMBOL_NAME(__bss_start)
3:
.long SYMBOL_NAME(__bss_end)
BSS領域(よく知らんが、初期化されない予約データ領域らしい)
の、初期化を行ってゼロクリアするコードなのだけど、
bf/s ってのがRISC系プロセッサで特徴的な遅延分岐命令。
この次の命令 mov.l ro, @-r2 が必ず実行されてから条件分岐するのだが、
この命令には、オートデクリメント機能が入っている。
ぱっと見、比較命令と分岐命令の間でグルグル回して、
無限ループを実行しているだけのように見えるし、個別のデクリメント命令も見えないので、
ループカウンタを操作していないように見えるが、これでちゃんと動くんだよねぇ。
---
古来よりコンピュータってのは、起動する部分が一番面白い。
いわゆる、IPL(Initial Program Loader)とか、ブートストラップという部分だが、
強烈にハードごとの個性が出る部分であり、同時にまた、
最もソフトウェア的には制約のない、自由に活動できるコードを書くことができる領域でもある。
リスタートが解除されたらまず、CPUはハード的にマッピングされた
ROMの特定領域からコードを読み、
ここでバスコントローラ設定、DRAM初期化・メモリチェックの後、
スタック領域などの設定があれば行い、次いで各種周辺機器の初期設定。
その後、ブートデバイスを決定して、ブートストラップローダーに実行を引き継ぎ、
ついでこの部分がカーネルの本体をメモリに引き込んで、本格的に起動する。
これはブートシーケンス、起動シーケンスとも言う。
しかし、ブートは英語でboot(ブーツ)つまり「靴(長靴?)」のことであり、
また、ストラップとは「携帯ストラップ」などと言われるように、要はヒモのこと。
つまり、ブートストラップというのは「靴のヒモ」のことで、
コンピュータは、靴のヒモをつたって動き出すことになる。
「起動」という意味は、本来持ち合わせていない単語なわけで、
実に妙な例えなのだ(笑
これは元々、ほら吹き男爵の法螺(ホラ)話の中から取られた用語らしい。
彼はある時、底無し沼に落ち、はい上がる手がかりもない絶体絶命のピンチに陥ったのだが、
そこで一計を案じた彼は、「自分の靴のヒモ」をたぐって脱出したのだとか。
(もちろんそんなことは、実際には不可能である)
コンピュータも目覚めたならまず、自分で自分の初期設定をし、
本格的な活動を開始するために自力で這い上がってくる必要があるわけで、
そういう姿がホラ吹き男爵のこの話に、よくマッチしていたのだろう。
# あ、…いかんいかん。コード読もうとしてたのに、日記書きに逃避してしまった。
# いよいよ9/10まであと2日。今度こそは買うぞ、5万ゲートFPGAのオマケ付きDesignWave。
sh-ipl+g More ログイン