uchan-nos/os-from-zero

第3章_3.5カーネルからピクセルを描く(osbook_day03c)が書籍通りの実行結果とならない

Opened this issue · 5 comments

(概要)
p85 の図3-8 適当な模様をフレームバッファに描くができません #166にてtaxin39様が質問されているissueと同等の内容となりますが、自分の環境でも書籍通りの実行結果にならずフレームバッファが白で塗りつぶされるといった状況で行き詰まっております。

(実行環境)
OS:Windows
「付録A_開発環境のインストール」の手順通りにWSL、QEMU、Xサーバーの環境構築を実施

(検証内容)
下記手順をそれぞれ実行してみましたが「フレームバッファが白で塗りつぶされる」という実行結果を解消することができない。

  1. taxin39様投稿のissueに記載ある手順と全く同じコマンドで実行
  2. MikanLoaderPkgのシンボリックリンク貼り替え
    →既存のリンクrmコマンドで削除し貼り直し
  3. clang++及びld.lld実行前に既存のmain.o、kernel.elfを削除してから実行
    →古い情報が残ってしまっている可能性があると考えた為
  4. Ubuntu再インストール、環境構築からやり直して1.の手順再実施
  5. 一旦第3章を飛ばし、第4章の「ピクセルを自在に描く」を実施、osbook_day04bにcheckoutしコンパイルやリンク作成等実行しqemu実行

なお、本事象発生後、gitのタグをosbook_day02aに切り替え「EDKⅡでハローワールド」章を実行したところ、書籍通りの実行結果になる事が確認できました。

(確認事項)
本事象につきまして上記検証内容から、他検証すべき手順及び解消方法が見つかるものかご確認/ご助力をお願いしたいです。

お手数おかけしますがご確認の程よろしくお願い申し上げます。

2024/05/08追記
・調査進捗報告
- 3章~4章を書籍の通りコマンド実行し出力結果確認→qemuのフレームバッファが白く塗りつぶされるまま変わらない。
- 5章(osbook_day05a)を書籍の通りコマンド実行し出力結果確認→書籍の通り白背景に一部グリーン塗りつぶしの上"AA"と表示される事確認

検証報告をありがとうございます。

#166 (comment) で書いた Main.c の書き換えで挙動が変化するかの確認と、kernel.elf のファイルサイズの確認をしていただけるでしょうか。

Main.c の書き換えで挙動が変化するかの確認
Main.cの書き換えで挙動が変化する事確認できました。

Main_c書き換え前

Main_c書き換え後

kernel.elf のファイルサイズの確認
1448byteと出力が確認できました。

kernel_elfサイズ

上記より他QAをあげられている方とファイルサイズが異なるのが原因の1つと考えているのですがファイルサイズの違いは開発環境ごとに変わるものでしょうか?

私も白い塗りつぶしの画面から進みません。しましまの模様にしたいです。以下実行したもの
cd $HOME/workspace/mikanos
git checkout osbook_day03c
cd $HOMsource edksetup.sh
source edksetup.sh
build
source $HOME/osbook/devenv/buildenv.sh
cd /home/mi/workspace/mikanos/kernel
source $HOME/osbook/devenv/buildenv.sh
clang++ $CPPFLAGS -O2 --target=x86_64-elf -fno-exceptions -ffreestanding -c main.cpp
ld.lld $LDFLAGS --entry KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf main.o
$HOME/osbook/devenv/run_qemu.sh /home/mi/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi /home/mi/workspace/mikanos/kernel/kernel.elf

前の状態の白く塗りつぶしするファイルが変更されていないのでしょうか?カーネルをコンパイルするときはどのように手順が変わりますか?

私も同様の現象が起きております。確認してみると、osbook_day03aの時点で、KernelMain()が呼ばれていないようです。
osbook_day03aにおいて、カーネルのベースアドレスとサイズが表示されたあとにinfo registersを何度か実行してみると、RIP=0x3fb73016でずっと変わらないことが分かりました。その部分を見てみると、

0x000000003fb73016:  cmpq   $0x0,0x40(%rsp)
0x000000003fb7301c:  je     0x3fb73016

という機械語があり、RSP+0x40には0x0が格納されているため、ここで無限ループが発生している模様です。(これはkernel.elf内の無限ループとは別の部分です)
また、ブートローダを終了させる部分に所々Print()を配置すると、二回目のgBS->ExitBootServices()の前のPrintは実行されますが、その後に置いたPrintは実行されていないようです。そのため、この無限ループは二回目のExitBootServices()の中で発生していると考えています。

この問題については、osbook_day03cに切り替えても同じ部分で無限ループに入っているため、KernelMain()が実行されないために、画面に縞模様も現れないのだと考えています。

いずれにせよ、kernel.elf が実行できないままだとこの先の章の内容も試すことができなくなってしまうため、解決法に心当たりがある方は、教えていただきたいです。

お忙しいところ恐縮ではありますが、よろしくお願いいたします。

実行環境

  • Windows 11
  • WSL2 + QEMU