BitVisor の UEFI 向けのブートローダーを読む(2nd stage)
この記事は BitVisor Advent Calender 2017 ,20 日目の記事(大遅刻)です。 UEFI 向けのローダーでも読んで記事書くかーって思ってたら 先にやられてしまって ウンウン唸ってましたが, 彼の記事の続きを勝手に書けば良いことに気がつきました。 では元気よく,UEFI の 1st stage loader から entry_func に飛んだ後を追っていきましょう。 いきなり find と grep を使っても良いのですが,折角手掛りがあるのでまずリンカスクリプト, bitvisor.lds を読んでみます。1st stage loader を読む記事に因ると, bitvisor.elf を 0x10000 だけ読んで, paddr (おそらく物理アドレス,physical address の略でしょう)に読んで,そこからエントリポイントを計算して, entry_func に飛んでるらしいです。 bitvisor.lds リンカスクリプト 2 行目, phys = 0x00100000; となっており,11 行目, .entry : AT (phys + (code - head)) { をみるとこのアドレスは bitvisor.elf の .entry というセクションになってるらしいので,このセクションを探せば良さそう。ついでに,このスクリプトから bitvisor.elf がメモリに置かれるときの仮想アドレスの開始位置もわかります。 core/entry.s .entry セクションをみると,まず multiboot のヘッダが書いてあって,次に 32-bit のコードが始まってます。 test 命令の結果,もしリアルモードであるならば, jc によってリアルモード用の初期化コードに飛んでますが,今回は割愛。 で,その後,32-bit なら jnc 命令で分岐せず multiboot のためのコードにジャンプ,ロングモードなら uefi64_entry に分岐しているわけですが,この分岐のやりかたが結構トリッキーというか,あんまりちゃんとなんでこれでいいのかわかってないなあと思ったら, BitVisor本体のブート仕様 2 年前のえいらくさんの記事にしっかり書いてあ