「ゼロからのOS自作入門」2章 EDKⅡでHello worldを実行する(前編)

ゼロからのOS自作入門」2章 EDKⅡでHello worldを実行します.

EDKⅡのダウンロードはDockerでビルドした時に実行済みです.

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

# MikanLoaderPkg

/workspaces/mikanos-devcontainer/mikanos/MikanLoaderPkgを作成し,下記の内容のファイルを作成します.

(MikanLoaderPkg.dec・MikanLoaderPkg.dsc・Loader.inf・Main.c)

// MikanLoaderPkg.dec
[Defines]
  DEC_SPECIFICATION              = 0x00010005
  PACKAGE_NAME                   = MikanLoaderPkg
  PACKAGE_GUID                   = 452eae8e-71e9-11e8-a243-df3f1ffdebe1
  PACKAGE_VERSION                = 0.1
// MikanLoaderPkg.dsc
[Defines]
  PLATFORM_NAME                  = MikanLoaderPkg
  PLATFORM_GUID                  = d3f11f4e-71e9-11e8-a7e1-33fd4f7d5a3e
  PLATFORM_VERSION               = 0.1
  DSC_SPECIFICATION              = 0x00010005
  OUTPUT_DIRECTORY               = Build/MikanLoader$(ARCH)
  SUPPORTED_ARCHITECTURES        = X64
  BUILD_TARGETS                  = DEBUG|RELEASE|NOOPT

[LibraryClasses]
  UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
  UefiLib|MdePkg/Library/UefiLib/UefiLib.inf

  // 下記は教材にない設定です.ただ,入れないとエラーが吐いた
  BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
  BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
  DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
  DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
  MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
  PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
  PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
  DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
  UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
  UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf

[Components]
  MikanLoaderPkg/Loader.inf
// Loader.inf
[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

  // 下記は教材にない設定です.ただ,入れないとエラーが吐いた
  BaseLib
  BaseMemoryLib
  DebugLib
  DevicePathLib
  MemoryAllocationLib
  PcdLib
  PrintLib
  DebugLib
  UefiBootServicesTableLib
  UefiRuntimeServicesTableLib

[Guids]

[Protocols]
// Main.c
#include  <Uefi.h>
#include  <Library/UefiLib.h>

EFI_STATUS EFIAPI UefiMain(
    // handle:ウィンドウ等を操作したいときに対象を識別するために割り当てられる一意の番号
    // table:データを入れる表
    EFI_HANDLE image_handle,
    EFI_SYSTEM_TABLE* system_table) {

  Print(L"Hello, Mikan World!\n");
  while (1);
  return EFI_SUCCESS;
}

# edkⅡの設定

edkⅡディレクトリの中に/workspaces/mikanos-devcontainer/mikanos/MikanLoaderPkgのシンボリックリンクを作成します.

できうる限り書籍に沿うために,$HOME(/home/vscode)内にworkspacesのシンボリックリンクも作成します.

cd $HOME
ln -s /workspaces ./

cd ~/edk2/
ln -s $HOME/workspaces/mikanos-devcontainer/MikanLoaderPkg ./

シンボリックリンクの作成後,edksetup.shを実行し,作成されたConf/target.txtで下記の項目を書き換えます.

設定項目 設定値
ACTIVE_PLATFORM MikanLoaderPkg/MikanLoaderPkg.dsc
TARGET DEBUG
TARGET_ARCH X64
TOOL_CHAIN_TAG CLANG38

書き換える時は,vimを使用しました.

sudo apt upgrade
sudo apt list upgrade
sudo apt install -y vim

vim Conf/target.txt

# build

下記のコマンドでビルドし,実行ファイル(~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi)が作成されていることを確認します.

実際の実行は,また後日実施します.

cd ~/edk2
build

ls Build/MikanLoaderX64/DEBUG_CLANG38/X64/
# Loader.debug  Loader.efi  MdePkg  MikanLoaderPkg  TOOLS_DEF.X64

# まとめ

USBに突っ込んだ上での実行はしていませんが,一通り実装しました.

# 参考サイト

「ゼロからのOS自作入門」のサポートサイト (opens new window)

EDK II で UEFI アプリケーションを作る (opens new window)

ハンドル(handle)とは - IT用語辞典 (opens new window)

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

データ可視化ライブラリ Altairを使ってみる(時系列データ編)

データ可視化ライブラリ Altairを使ってみる(時系列データ編)

時系列データでのデータ可視化ライブラリ Altair を使ってみる.

データ可視化ライブラリ Altairを使ってみる(クロス集計編)

データ可視化ライブラリ Altairを使ってみる(クロス集計編)

クロス集計でのデータ可視化ライブラリ Altair を使ってみる.