■
嘘です続きはあります。
それ以外にGRUBを使う利点として、TFTPブートができるので、デバッグ時間の短縮ができるん。
GRUBは以下のようにビルドするとTFTPが使えるようにぬる。RTL8139以外を使ってる人は適宜変更して。
$ ./configure --enable-diskless --enable-rtl8139 --enable-pci-direct
ディストリに付いてくるGRUBはdisklessが無効になってるので使えへんね。
できたGRUBをUSBメモリに入れてごー。menu.lstは↓のようにしておけばよろし。kernelの部分は自分のプログラムの名前におきかえて、serialのコメントを外すと、grubの画面がシリアルで見れるように!
default 0 timeout 1 #serial --speed=115200 #terminal serial title=QO3 bootp root (nd) kernel /QO3 boot
気を付ける点としては、
- D945GCLFはHDD無しだとBIOS画面に行けなくなることがある→ジャンパをずらすとBIOS画面に行くよ
- D945GCLFのBIOSはパーティションのブートフラグを見るのでブートフラグを立てとかなあかんよ
でござるよ。
で、次、BOOTPとTFTPはdnsmasqを使うことにするの。だってGentooがdnsmasqを使っていたんだもん
普通にビルドして、/etc/dnsmasq.confに、
dhcp-range=192.168.10.128,192.168.10.192 enable-tftp tftp-root=/tftp
とかでよろし。
- /tftpにファイル置く
- シリアル設定する
で準備よかですね。シリアルの確認はGRUBのシリアルを有効にして見るとよいと思うわ。
GRUB Multiboot Specification
GRUBから起動してもらうには、実行ファイルをMultiboot Specificationに従って作ればよかよ。
ELFだと話が簡単になるのでえるふるのがよいとおも。
えるふる、というのは、実行ファイルをELFにするの略なー。ちなみにえるふらなかった奴の代表としてOSXが挙げられ、話を面倒にしてるので、やめてほしいと思った。
えるふった場合はファイルのどっかに↓を置くよろし。ELF以外の場合はGRUBに付いてるmultiboot.infoをよくよんで使用上の用法、用量を守ってお使いください。
align 4 dd 0x1badb002 ; magic dd 0 ; flags dd -0x1badb002 ; checksum
たったこれで、
- ファイルサイズは512byteまで
- A20が無効になっている
- バグだらけのBIOSと仲良くする
といった人生を無駄にする問題から開放されまする。
まとめ
動くコードとMakefileを置いておきます。
SECTION .text global _start cpu 486 _start: jmp start2 align 4 dd 0x1badb002 ; magic dd 0 ; flags dd -0x1badb002 ; checksum start2: jmp start2
kernel:boot.o gcc -m32 -nostdlib -Wl,-Ttext,100000 -o pcmonitor $^ boot.o: boot.s %.o: %.s nasm -felf32 -o $@ $<
手順としては、
- 実機をようい
- LANをつなぐ
- シリアルをつなぐ
- GRUBをつくる
- GRUBをUSBメモリに入れる
- dnsmasqをつくる
- dnsmasqを設定して起動(最初は -d 付きで起動するとエラーが見れてよいとおも)
- Multiboot Specificationに対応した実行ファイルを作る
- 実行ファイルをTFTPに見えるとこに置く
- きどうしてごー
と、いう感じで思ったより長くなってしまった…(手順も文章も)
それでも、詳細をかなり省略して書いてるので(GRUBのインストール方法とか…)これを読んでも実際できるようになるとは思えないなー。まあ、誰かが試すとも思ってないんですがー。
もし試した人がいて、よくわからない、ということがあれば、コメントにひとこと「よくわからん」と書いていただければもうちょっと説明しまする多分。
あと、今回も描いたはいいけど、使う場面が無かった図があるのでとりあえず貼っておきます。
いや、使い道のある画像には見えないが…Multibootの説明をするついでに入れようかと思ったら、Multiboot書くまでに力尽きたので…