2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【ゼロからのOS自作入門】フォロー1日目

Posted at

とある事情で06/30までに「ゼロからのOS自作入門」という本を読み終えたいと思うようになりました。
自律のため毎日勉強したことを投稿しようと思うのでよろしくお願いします。


UEFI BIOSによる起動

  • 電源を入れるとCPUはBIOSを実行する
  • BIOSはパソコン本体や周辺機器を初期化する。
  • BIOSはストレージから.elfファイルを見つけ、それをメインメモリに読み出す
  • BIOSは自分の実行を中断して、CPUはそのファイルを実行する

メインメモリの内容は電源を切ると消える。BIOS自体はROMにかかれている。

OSを作る道具

  • UEFI BIOSが実行するプログラムをUEFIアプリケーションという(アプリケーション…)
  • これはバイナリファイルである
  • バイナリファイルの作り方の例としてC/C++を使ったものがある
    1. ソースコード(.cpp, .hpp)を書く
    2. ソースコードをコンパイルしてオブジェクトファイル.o)を作る
    3. すべてのオブジェクトファイル(上ではソースコード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を押す(焦った)

Screenshot from 2021-06-03 10-32-05.png

PEとCOFFとELF

  • アプリケーションは実行可能ファイルや設定ファイルから構成されている
  • 実行可能ファイルにはいくつかのタイプがある
    • スクリプト(プログラミング言語によって書かれ、インタプリタというアプリが読み取って実行する。シェルスクリプトなど)
    • 機械語プログラムを中心とするもの(CPUが直接実行できる機械語をファイルの中に含んでいる)
  • PE形式は機械語プログラムからなる実行可能ファイルの形式で、Windowsの標準
    • Windowsでは.exe, Linuxでは.elf
  • COFF形式はオブジェクトファイル形式の一種。PE形式を作る過程で作られるやつ。
  • ELF形式はオブジェクトファイル形式としても使える。PE形式は実行可能ファイル、COFF形式はオブジェクトファイル形式と別れているのに対し、ELF形式はどちらの形式も対応する。
  • ELF = Executable and Linkable Format
  • PE, COFF, ELFはx86-64 CPU用の機械語を格納するファイルという点で共通(文章を表すのにPDF, Word, HTMLの形式があるのと似ている)

参考、役に立ちそうなリンク

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?