戻る

OS自作

別ページ


目次


準備

USBをEFI実行可能にする


コマンドなど

コマンド種別説明
sum [filename]linuxチェックサムを計算する
certutil -hashfile [filepath] [hashaalgorithm]dosチェックサムを計算する
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartpowershellLinux用サブシステムを有効にする
dism.exe /online /enable-feature /featurename:VirtualMathinePlatform /all /norestartpowershell仮想マシンプラットフォームを有効にする
wsl --list --onlinepowershellwslで利用可能なLinuxディストリビューション一覧を表示
wsl --install [distName]powershell[distName]で指定したLinuxをwslでインストールする
wsl --unregister [distName]powershell指定したLinuxをwslから削除する

使用ツール

書籍で利用するOS(MikanOS)ソースコードの入手

ブートローダーのビルド

  1. ブートローダーのディレクトリをリンクする
  2. EDK2のビルドに必要な環境変数の設定、target.txtを生成
  3. Conf/target.txtの設定
  4. 設定項目設定値
    ACTIVE_PLATFORMMikanLoaderPkg/MikanLoaderPkg.dsc
    TARGETDEBUG
    TARGET_ARCHX64
    TOOL_CHAIN_TAGCLANG38
  5. ブートローダーをビルドする

MikanOSのビルド

  1. ビルドに必要な環境変数を読み込む
  2. ビルドする

QEMU実行

実行のためのshファイルが用意されている

三章のコンパイル方法(Clang++)

C++の動作環境

その他の操作

make

Makeはコンパイルやリンク作業を自動化するツール

makeの説明
トップへ戻る

リンク

実行可能ファイルの種類

PE,COFF,ELFはいずれも機械語を格納するファイル形式。いずれもx86-64CPUの機械語を拭くことができる。ファイル内部の表現は異なる。

実行可能ファイル
スクリプトインタプリタで実行する。
機械語プログラムPE形式機械語プログラムの実行可能ファイルのためのファイル形式。Windows標準。PE形式のファイルを「.exe」拡張子としている。
COFF形式オブジェクトファイル形式。PE形式のファイルを作る過程の中間ファイル形式としてCOFFF形式を使うことが多い。COFF形式のオブジェクトファイルをリンクしてPE形式の実行可能ファイルを作る。この流れが一般的。
ELF形式
(Executable and Linkable Format)
機械語プログラムの実行可能ファイルのためのファイル形式。Linux標準。オブジェクトファイルも表せる。

ABI(Application Binary Inerface)

プログラムとCPUの相互作用を機械語レベルで規定する。例えば必要なレジスタやメモリの使いかたがABIによって決まる。コンパイラはABIに従って機械語を生成する。

System V AMD64 ABILinux標準
Microsoft x64 ABIWindowsで使われている
x64(引数:RDI,RSI,RDX,RCX,R8,R9/戻り値:RAX,RDX)
x86(引数:スタック)
関数呼び出しの前後では[RSP,RBP,RBX,R12~R15]の7個のレジスタの値が保たれていなければならない。これ以外は呼び出された関数が自由に書き換えていい
項目
呼出規約(Calling Convention)関数を呼び出す際の決まり事

トップへ戻る


トップへ戻る

語彙リスト

単語カテゴリー説明
ブートサービスUEFIOSを起動するために必要な機能を提供する
ランタイムサービスUEFIOS起動前、起動後どちらでも使える機能
ホスト環境(hosted environment)C++の動作環境OS上で動くプログラムのための環境。そのためのコンパイル方法
フリースタンディング環境(freestanding environment)C++の動作環境OSなしで動くプログラムのための環境。そのためのコンパイル方法

トップへ戻る

EDK2関数一覧

関数引数戻り値説明
Print()L""で表現するワイド文字を利用する文字列を表示
OpenRootDir()書き込み先のファイルを開く
root_dir_Open()

トップへ戻る