とある事情で06/30までに「ゼロからのOS自作入門」という本を読み終えたいと思うようになりました。
自律のため毎日勉強したことを投稿しようと思うのでよろしくお願いします。
UEFI BIOSによる起動
- 電源を入れるとCPUはBIOSを実行する
- BIOSはパソコン本体や周辺機器を初期化する。
- BIOSはストレージから
.elf
ファイルを見つけ、それをメインメモリに読み出す - BIOSは自分の実行を中断して、CPUはそのファイルを実行する
メインメモリの内容は電源を切ると消える。BIOS自体はROMにかかれている。
OSを作る道具
- UEFI BIOSが実行するプログラムをUEFIアプリケーションという(アプリケーション…)
- これはバイナリファイルである
- バイナリファイルの作り方の例としてC/C++を使ったものがある
- ソースコード(
.cpp
,.hpp
)を書く - ソースコードをコンパイルしてオブジェクトファイル(
.o
)を作る - すべてのオブジェクトファイル(上ではソースコード1つにつきオブジェクトファイル1つが作られる)をリンクしてまとめ、ひとつの実行可能ファイル(
.elf
)にする
- ソースコード(
簡単なプログラムの実行可能ファイルa.out
は拡張子が違うだけで.elf
ファイルと解釈して良いのかな?
C言語でハローワールド
- 環境構築が済んでいれば
~/osbook/day01/c/hello.c
にソースコードがある - プログラムの本体は最後にある
EfiMain()
だけ
EFI_STATUS EfiMain(
EFI_HANDLE ImageHandle,
EFI_SYSTEM_TABLE *SystemTable
) {
SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello, world!\n");
while (1);
return 0;
}
これをClangとLLDを用いてコンパイルとリンクする
$ cd ~/osbook/day01/c/
$ clang -target x86_64-pc-win32-coff \ # ELFではなくWindows向けのCOFF形式で出力する
-mno-red-zone -fno-stack-protector -fshort-wchar -Wall -c hello.c
$ lld-link /subsystem:efi_pplication /entry:EfiMain /out:hello.efi hello.o
-
clang
はLinux用コンパイラで-target x86_64-pc-win32-coff
でWindows向けのCOFF形式で出力する(lld-link
がCOFF形式を要求するため) -
lld-link
はPE形式の実行可能ファイルを作るためのリンカだが、/subsystem:efi_pplication
でUEFI用のPEファイルを生成してくれる - できた
hello.elf
をUSBの/EFI/BOOT/
に置いて起電すれば実行される - この本ではQEMUで実行するために
$HOME/osbook/devenv/run_qemu.sh
というスクリプトを用意してくれている - QEMUからマウスのカーソルを戻すにはCtrl + Altを押す(焦った)
PEとCOFFとELF
- アプリケーションは実行可能ファイルや設定ファイルから構成されている
- 実行可能ファイルにはいくつかのタイプがある
- スクリプト(プログラミング言語によって書かれ、インタプリタというアプリが読み取って実行する。シェルスクリプトなど)
- 機械語プログラムを中心とするもの(CPUが直接実行できる機械語をファイルの中に含んでいる)
- PE形式は機械語プログラムからなる実行可能ファイルの形式で、Windowsの標準
- Windowsでは
.exe
, Linuxでは.elf
- Windowsでは
- COFF形式はオブジェクトファイル形式の一種。PE形式を作る過程で作られるやつ。
- ELF形式はオブジェクトファイル形式としても使える。PE形式は実行可能ファイル、COFF形式はオブジェクトファイル形式と別れているのに対し、ELF形式はどちらの形式も対応する。
- ELF = Executable and Linkable Format
- PE, COFF, ELFはx86-64 CPU用の機械語を格納するファイルという点で共通(文章を表すのにPDF, Word, HTMLの形式があるのと似ている)
参考、役に立ちそうなリンク
- MikanOS ソースコード:https://github.com/uchan-nos/mikanos
- MikanOS 開発環境:https://github.com/uchan-nos/mikanos-build
- osdev-jp:https://osdev.jp/
- 著者(uchan)のTwitter:@uchan_nos
-
「ゼロからの OS 自作入門」サポートサイト
- SlackやDiscordでサポート、勉強会(2021年3月27日から)を行っているらしい! 途中からかもだけど参加してみよっと。
- ゼロからのOS自作入門をMacで勉強する方法 (Docker使用)
- Docker ではじめる "ゼロからのOS自作入門"
- 追加していきます