引き続き
Mac で始める「ゼロからのOS自作入門」 - yamoridon - Qiita
の記事を見ながら実行していきます。

5.2 分割コンパイル(osbook_day05b)

% cd $HOME/workspace/mikanos/kernel
% git checkout osbook_day05b

※ファイルを自分で変更していると、git checkout コマンドで
error: Your local changes to the following files would be overwritten by checkout
というエラーが出ます。変更を廃棄してもいいのなら、
% git reset --hard
これで、チェックアウトできるようになります。


カーネル用のMakefile($HOME/workspace/mikanos/kernel/Makefile)を修正します。
day04aの記事と同じく、LDFLAGS に -z separate-code に追加します。

LDFLAGS  += --entry KernelMain -z norelro --image-base 0x100000 --static -z separate-code

さらに、上記記事の通りに
sed --in-place 's|$(notdir $(OBJ))|$(OBJ)|' $@

sed -I '' -e 's|$(notdir $(OBJ))|$(OBJ)|' $@
に変更します。

また、$HOME/workspace/mikanos/kernel/main.cpp に以下の記述を追加します。
(私の環境では、makeエラーは出なかったのですが、一応。)
extern "C" void __cxa_pure_virtual() {
  while (1) __asm__("hlt");
}


※ Makefile、main.cpp の修正はこれ以降もずっと、Macでは同じく必要です。 

修正したら、カーネルファイルをmakeします。
% source $HOME/osbook/devenv/buildenv.sh

% make


続いて、ブートローダです。
$HOME/workspace/mikanos/MikanLoaderPkg/Main.c を修正します。
※ Makefile の修正はこれ以降もずっと、Macでは同じく必要です。
typedef void EntryPointType(const struct FrameBufferConfig*);

typedef void __attribute__((sysv_abi)) EntryPointType(const struct FrameBufferConfig*);
に修正します。
修正ポイントは、day03cの記事と基本的には同じ箇所になります。


修正したら、ブートローダをビルドします。
% cd $HOME/edk2

% source edksetup.sh

% build


それでは、QEMUで実行してみます。(長いですがコマンドプロンプトの% を除いて1行です。)
% $HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANGPDB/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf


day05b


ウィンドウの見た目は、day05aと同じです。




ゼロからのOS自作入門
内田公太
マイナビ出版
2021-03-22