EDK2を使ってブートローダを書いていこう

2022-11-26-02-09-39.webp
目次

イントロダクション

OS自作入門を始めました。今日は2章をやっていきます。先が長いですね。

EDL2を使ったブートローダを動かしてみる

OSを動作させるためには、メインメモリの状態把握が必須です。 使用中のメモリを書き換えてしまったら誤作動の原因になるため、空き地をのび太やジャイアンのようにUEFI機能を使ってメモリマップを取得するところからやっていきます。

git clone https://github.com/uchan-nos/mikanos.git

MikanLoaderPkgというフォルダに、EDK2関連ファイルが入っています。

  • パッケージ宣言ファイル
  • パッケージ記述ファイル
  • コンポーネント定義ファイル
[Defines]
  INF_VERSION                    = 0x00010006
  BASE_NAME                      = Loader
  FILE_GUID                      = c9d0d202-71e9-11e8-9e52-cfbfd0063fbf
  MODULE_TYPE                    = UEFI_APPLICATION
  VERSION_STRING                 = 0.1
  ENTRY_POINT                    = UefiMain

#  VALID_ARCHITECTURES           = X64

[Sources]
  Main.c

[Packages]
  MdePkg/MdePkg.dec

[LibraryClasses]
  UefiLib
  UefiApplicationEntryPoint

[Guids]
  gEfiFileInfoGuid
  gEfiAcpiTableGuid

[Protocols]
  gEfiLoadedImageProtocolGuid
  gEfiLoadFileProtocolGuid
  gEfiSimpleFileSystemProtocolGuid
  gEfiBlockIoProtocolGuid
ENTRY_POINT                    = UefiMain

この部分がエントリーポイントを指定するようです。 EDKⅡでは、UEFIアプリによってこのエントリーポイントを自由に変更できるとのことです。

ビルド準備

git checkout osbook_day02a

edk2フォルダの中に移動して、シンボリックリンクを貼ります。

cd ~/edk2
ln -s ~/workspace/mikanos/MikanLoaderPkg/ ./

上手く貼れたらこんな感じです。 シンボリックリンク

source edksetup.sh 

実行結果はこんな感じです。

Using EDK2 in-source Basetools
WORKSPACE: /home/ayahumohumo/edk2
EDK_TOOLS_PATH: /home/ayahumohumo/edk2/BaseTools
CONF_PATH: /home/ayahumohumo/edk2/Conf
Copying $EDK_TOOLS_PATH/Conf/build_rule.template
     to /home/ayahumohumo/edk2/Conf/build_rule.txt
Copying $EDK_TOOLS_PATH/Conf/tools_def.template
     to /home/ayahumohumo/edk2/Conf/tools_def.txt
Copying $EDK_TOOLS_PATH/Conf/target.template
     to /home/ayahumohumo/edk2/Conf/target.txt

Conf/target.txtというファイルから、MikanLoaderPkgをビルドする設定を行います。

vim Conf/target.txt

設定はこうします。

ACTIVE_PLATFORM = MikanLoaderPkg/MikanLoaderPkg.dsc
TARGET_ARCH = x64
TOOL_CHAIN_TAG = CLANG38

書き換えることができたら、ビルドを実行します。

build

できあがったファイルをQEMUから起動させたら、ハロワ実行できます。

まとめ

2日目もとりあえず通せました。 引き続き頑張りましょう。