でけた。ブートローダーはBIOSのint 0x13をAL=2で呼び出してドライブの読み込みをさせてるんだけど、USBから起動した場合は自動的にUSBから読んでくれるのね、便利。手順をメモっておく。

OSイメージの作成

起動させるOSはOS自作入門のはりぼてOSで、フロッピー起動のものと全く同じ。はりぼてOSは512バイトのブートローダーと、そのブートローダーから読み込まれるOS本体からなっている。ドライブからのデータの読み込みはブートローダーでBIOSを使って行っていて、すべてのデータをメモリ上に読み込んでしまい、OS起動後はメモリへのアクセスだけでドライブへのアクセスは一切していない。

起動用USBの作成

Macでのやりかたの説明。まずアプリケーション>ユーティリティ>ディスクユーティリティを開いて、消去タブからUSBメモリをフォーマットする。 次に、ddコマンドでディスクイメージを書き込む。んだけど、メモリスティックを挿した段階でマウントされてしまっているので、アンマウントする必要がある(参考):

$ ls -l /dev/disk*  # ドライブ情報の確認
  ...
$ df  # ドライブ情報の確認
  ...
$ sudo umount -fv /Volumes/UNTITLED  # アンマウント
$ sudo dd if=ディスクイメージのパス of=/dev/disk1  # イメージの書き込み

最後のddコマンドでディスクイメージをUSBメモリの0クラスタから書き込む。 (出力先を間違ったらハードディスクがぶっ壊れる可能性があるので、怖いなぁ…)

実機で起動

書き込んだUSBメモリを挿して起動させる。 今回はノートパソコンASUS X202Eで試した。完全にマシン依存の話だけど、USB起動させるにはただ挿せばいいんじゃなくて、いろいろ手順が必要だった(参考):

  • 電源を入れて、F9を押しっぱなしにする
  • 「オプションの選択」画面が出る
  • 「トラブルシューティング」
  • 「詳細オプション」
  • 「UEFI ファームウェアの設定」
  • 「再起動」 →再起動してブートセッティング画面になる
  • 「Security」タブの「Secure Boot Control 」を「Disable」にする
  • 「Boot」タブの「Launch CSM」を「Enabled」にする
  • あとは、起動時のドライブの優先でUSBメモリを1番にする、または
  • 再起動させ、F9を押しっぱなしにして、オプションの選択画面>デバイスの使用>Removable Driveを選ぶとリブートがかかって、USBメモリから起動される

エミュレータだけじゃなく、実機でも動くってのはいいなぁ。OS作りの励みになるね。タッチパッドも勝手にマウスの割り込みとして扱ってくれるのね、便利。 今はOS起動後にドライブにアクセスしていないからいいけど、もしするようにした場合、どのドライブ(フロッピーディスク、またはUSBメモリ)から起動したかはどこかでわかるのだろうか?