前置き
本記事は「ゼロからのOS自作入門」のメモになります。
仕事上OSの知識があってもいいなと思って、取り組むことにしました。
各章に対し、1記事をOutputする予定です。
メモ本編
目標
Hello WorldをUEFIで表示させる。
やったことメモ
まず、前提として開発環境の用意が必要。
ほかの環境でも使っていたもの
WindowsならWSL2を使うと新しいPCを用意しなくてもよくて楽。
BZEditorを導入。BOOTをBinaryで書くため。
本環境に必要なもの
QEMU
X Serverのインストールがまず必要。以下でダウンロードできる。
https://sourceforge.net/projects/vcxsrv/
ダウンロードしたインストーラを起動し、そのままインストール。
いったん起動し、以下の通りにする。
- GUIの選択では、Multiple Windowsを選択
- GUIアプリを起動するか問われるので、
Start No cliaent
を選択 - Extra Settingの
Disable Access Control
にCheckを入れる - 起動するよと言われるので、そのまま完了
- Windowsのセキュリティ画面が出てくるので、「パブリックネットワークでの接続のところにCheckを入れ、アクセス許可をする <-実際やったときは、見逃していた
quemをインストール。ここは特に何も情報がなかった。
sudo apt install qemu-utils
sudo apt install quem-system-x86
Build環境などの用意
GithubのMikanOSのところにあるレポジトリを、指示に従ってダウンロードする
https://github.com/uchan-nos/mikanos-build
行うのは以下の通り
sudo apt update
sudo apt install git (gitをインストールしていればやらなくてよい)
cd #HOME
git clone https://github.com/uchan-nos/mikanos-build.git osbook
開発ツールをインストールする。
sudo apt install ansible
cd $HOME/osbook/devenv
ansible-playbook -K -i ansible_inventory ansible_provision.yml
isal
というコマンドがインストールされ、HOME/edk2
というディレクトリが生成される。
HOME/.profile
にDISPLAY
環境変数が追加される(こともある)ため、反映させる。
source $HOME/.profile
これ以降は実行はしたが、今は必要なさそうだった。
実際に行ったこと
Boot Loaderをバイナリで記述する。
今回は本の通りにBZ Editorを使った。
400-420の部分がHello, World!という文字列に対応している。
00:0000 4D 5A 00 00 00 00 00 00-00 00 00 00 00 00 00 00
*
00:0030 00 00 00 00 00 00 00 00-00 00 00 00 80 00 00 00
*
00:0080 50 45 00 00 64 86 02 00-00 00 00 00 00 00 00 00
00:0090 00 00 00 00 F0 00 22 02-0B 02 00 00 00 02 00 00
00:00A0 00 02 00 00 00 00 00 00-00 10 00 00 00 10 00 00
00:00B0 00 00 00 40 01 00 00 00-00 10 00 00 00 02 00 00
00:00C0 00 00 00 00 00 00 00 00-06 00 00 00 00 00 00 00
00:00D0 00 30 00 00 00 02 00 00-00 00 00 00 0A 00 60 81
00:00E0 00 00 10 00 00 00 00 00-00 10 00 00 00 00 00 00
00:00F0 00 00 10 00 00 00 00 00-00 10 00 00 00 00 00 00
00:0100 00 00 00 00 10 00 00 00-00 00 00 00 00 00 00 00
*
00:0180 00 00 00 00 00 00 00 00-2E 74 65 78 74 00 00 00
00:0190 14 00 00 00 00 10 00 00-00 02 00 00 00 02 00 00
00:01A0 00 00 00 00 00 00 00 00-00 00 00 00 20 00 50 60
00:01B0 2E 72 64 61 74 61 00 00-1C 00 00 00 00 20 00 00
00:01C0 00 02 00 00 00 04 00 00-00 00 00 00 00 00 00 00
00:01D0 00 00 00 00 40 00 50 40-00 00 00 00 00 00 00 00
*
00:0200 48 83 EC 28 48 8B 4A 40-48 8D 15 F1 0F 00 00 FF
00:0210 51 08 EB FE 00 00 00 00-00 00 00 00 00 00 00 00
*
00:0400 48 00 65 00 6C 00 6C 00-6F 00 2C 00 20 00 77 00
00:0410 6F 00 72 00 6C 00 64 00-21 00 00 00 00 00 00 00
*
00:0600
確認のために、Check sumを使う
sum BOOTX64.EFI
これで12430が出てこればOK.
なお、WSLで行う場合は、BOOTLOADERをUSBに移す必要はない。(後々出てくるのかもしれないが)
一般的に、WSLはWindowsを/mnt/c
でマウントしているので、そこからBOOTX64.EFI
を引っ張ってくる。
作業ディレクトリ直下においておく。
その後、書籍の通りにコマンドを実行する。
qemu-system-x86-64
を実行するShellを用意してくれるので、それを実行するだけでよくなる。
後半は、C言語でハローワールドする。
先ほどのバイナリのデータ自体はEfiMain()で実装されたものだとネタ晴らし。
clang
とlld-link
を使って作れるという実践を行う。