ゼロからのOS自作入門を実際に手元で試してみました。ステップが多いので何回かに分けてやってみようと思っています。
環境の準備
普段使いの環境が Windows でなるべく環境をクリーンに保ちたかったため、 Docker を活用した DevContainer 環境で始めることにしました。既にこのコンテナを用意してくれている方がいらっしゃるので、ありがたく使わせてもらうことにしました(ありがとうございます!)。
一番最初のバイナリエディタで打ち込む作業は、 Windows 環境で追加でなにもせずに作れますけどね。それで動かしたのが以下の画像です。 VMware Workstation や GPDWIN (初代) で動かしてみました。
メモリマップの取得
ここまでにもいくつかのステップがありますが、メモリマップの取得まで進められました。これも VMware, GPDWIN で動作可能でした。
無事にファイルも出来て、メモリマップが記録されていました!
Index, Type, Type(name), PhysicalStart, NumberOfPages, Attribute 0, 7, EfiConventionalMemory, 00000000, 8F, F 1, A, EfiACPIMemoryNVS, 0008F000, 1, F 2, 7, EfiConventionalMemory, 00090000, E, F 3, 0, EfiReservedMemoryType, 0009E000, 2, F 4, 7, EfiConventionalMemory, 00100000, 1EF00, F 5, 0, EfiReservedMemoryType, 1F000000, 1200, F 6, 7, EfiConventionalMemory, 20200000, 51E00, F 7, 4, EfiBootServicesData, 72000000, 20, F 8, 7, EfiConventionalMemory, 72020000, 6214, F 9, 1, EfiLoaderCode, 78234000, 2, F 10, 4, EfiBootServicesData, 78236000, 28CF, F 11, 7, EfiConventionalMemory, 7AB05000, 3B4, F 12, 3, EfiBootServicesCode, 7AEB9000, 24C, F 13, 0, EfiReservedMemoryType, 7B105000, 516, F 14, 7, EfiConventionalMemory, 7B61B000, 20, F 15, A, EfiACPIMemoryNVS, 7B63B000, E8, F 16, 6, EfiRuntimeServicesData, 7B723000, 2D1, F 17, 5, EfiRuntimeServicesCode, 7B9F4000, 7B, F 18, 4, EfiBootServicesData, 7BA6F000, 591, F 19, 7, EfiConventionalMemory, 100000000, 80000, F 20, C, EfiMemoryMappedIOPortSpace, E0000000, 4000, 1 21, B, EfiMemoryMappedIO, FEA00000, 100, 1 22, B, EfiMemoryMappedIO, FEC00000, 1, 1 23, B, EfiMemoryMappedIO, FED01000, 1, 1 24, B, EfiMemoryMappedIO, FED03000, 1, 1 25, B, EfiMemoryMappedIO, FED06000, 1, 1 26, B, EfiMemoryMappedIO, FED08000, 2, 1 27, B, EfiMemoryMappedIO, FED1C000, 1, 1 28, B, EfiMemoryMappedIO, FED80000, 40, 1 29, B, EfiMemoryMappedIO, FEE00000, 1, 1 30, B, EfiMemoryMappedIO, FFC00000, 400, 1 1
ネットワークブートについて
楽をしようとしてネットワークブート (iPXE ブート) に手を出したのが苦難の道のりでした。結果としては、自分の使える環境では動作に至りませんでした。
- GPDWIN は WiFi のみ。そしてこれは起動時に認識されていないので使えない
- ステップバイステップでやると “no more network devices” と表示されていることに気付く
- USB の有線LAN を接続しても、起動用に使えない模様
- VMware Workstation の UEFI ブートでネットワークブートでも失敗
- 以下の画像のように停止してしまいます。
- ステップバイステップで手作業でコマンドを打ち込んでであれば、
bootx64.efi の取得は出来て、 boot まではいくのですが、同じ状態に陥りました。
コンテナ内のメモ
コンテナ内では /home/vscode 以下で edk2 や OS自作用ツールセットが格納されています。開発コンテナ(DevContainer) のデフォルトでは /workspace で Windows 側フォルダをマウントするのでこのあたりは注意する必要があります。必要に応じてシンボリックリンクを活用するのがよいかもしれませんね。
自分の手順としては、以下のようなコマンドで作業していました。 なお、edk2 ディレクトリでは事前に MikanLoaderPkg のディレクトリに向けてシンボリックリンクを配置しています。このあたりは書籍に書かれている手順に従っている感じですね。
cd /home/vscode/edk2 source edksetup.sh build
この後 Loader.efi が出来るのですが、 /home/vscode/edk2 以下では Windows 側からアクセスできないので、 /workspace 以下にコピーしたりして対処をしています。
この開発コンテナでは python3 も既にインストール済みなので、ネットワークブートへの準備も出来ていると思います。自分の手元では動作する実機がなくて今一歩確認できていませんが、うまく動きそうに思います。
まとめ
ネットワークブートを活用し、実機を用いた楽な開発をしようと考えている場合には、 WiFi は使えない前提をしておいたほうがよいでしょう。 USB3 と 有線 LAN が使えるデスクトップ PC あたりを使うのが良いと思います。自分の手元には両方を満たすものがなく、毎回 USB メモリにカーネルを焼くことになりそうです。