移動ちう
いきなり出発で出鼻をくじかれちう。飛行機到着遅れとやらで 1h 程度出発が遅れるとの事で仕方がないので端末をひっぱり出して掘削開始。
とりあえず Linux のブートプロセスの 2 回目が載ってるうにまがが手元にあったりなんかするので、という訳でもないのですが boot 配下のナニを確認するなど。
head.s
これ、main() 手続きを呼び出すナニなのですが、以前掘った折にはどうやって main がナニされるのか、な仕掛けが全く分からんかったのですが、どうやら
.org 0x4000 after_page_tables: pushl $0 # These are the parameters to main :-) pushl $0 pushl $0 pushl $L6 # return address for main, if it decides to. pushl $main jmp setup_paging L6: jmp L6 # main should never return here, but # just in case, we know what happens.
で
- main() のパラメータを 3 つ push
- L6 なアドレスを push
して main() 手続きのフレームを作ってから main() 手続きのアドレスを push する事で setup_paging の末端の ret 命令が戻り先を main() 手続きと認定しつつ戻ったら main() 手続きなフレームも準備済み、っていうナニなのかなぁ、という結論に逹してたりします。
む、ちょい違う? L6 の前の要素は形式上戻るソレの frame pointer になるのかな。0 だし戻らないのでどーでも良いっちゃ良いですが。
とは言え、てっぺんに戻り先のアドレス積んどいて ret すりゃ OK ってのはなんとなく解釈として乱暴な気がするなぁ。でも intel のマニュアルには
RET 命令によってリターン命令ポインタがスタックからポップされ、EIP レジスタに戻される。
IA32_Arh_Dev_Man_Vol1_Online_i.pdf より引用
という記述があるので良いのかな。でもベースポインタってどうなるんだろ、と思ったらこのあたりは LEAVE 命令で云々、という事で良いのかどうなのか。
とりま
ちょっとこれ前提って事で head.s の中身を掘削な方向ですが、とりあえず電源が無いので本読みに戻ります。
今飛行機
なんですが、台湾トランジットはダッシュ一本だそうです。台湾で無線に繋いで云々と思っていたのにがっかり。あと 20 分で到着する模様。
トランジットなう
hinet 接続。最初方法分かんなくて焦りました。霧が大変な事になってて混乱している模様。気温15度とかどうなってるんでしょうね。