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

3.3 初めてのカーネル(osbook_day03a)

% cd $HOME/workspace/mikanos/kernel
cd: no such file or directory: $HOME/workspace/mikanos/kernel
と、いきなりエラーが出ます。
 
第2章が終わった段階(osbook_day02b)では、$HOME/workspace/mikanos/ にはまだ、kernelディレクトリがないためです。
(→ サポートページ Issue #72正誤表

なので、
% cd $HOME/workspace/mikanos   
% git checkout osbook_day03a
% cd kernel
とします。

本の通りに、コンパイルします。
% clang++ -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone \
-fno-exceptions -fno-rtti -std=c++17 -c main.cpp

次のリンクですが、Macに入れたLLVMが LLVM10以降なので、リンカのオプションに -z separate-code をつける必要があるそうです。(理由は→上記記事 参照)
% ld.lld --entry KernelMain -z norelro --image-base 0x100000 --static \
-z separate-code -o kernel.elf main.o
これで、初めてのカーネルファイル kernel.elf ができました。
 
 
次に、カーネルファイルを読み込むように書き換えたブートローダをビルドします。
% cd $HOME/edk2
% source edksetup.sh 
% build

※ この章以降、カーネルファイルとブートローダの2種類を書き換えながら作っていきます。
そのため、カーネルファイル kernel.elf を作るためのコンパイルとリンク、およびブートローダ Loader.efi を作るためのビルドという、2種類の操作がそれぞれ必要になってきます。
ちょっと、分かりづらいポイントです。


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

起動するとこんな感じ↓
day03a


QEMUモニタで確認します。
(qemu) info registers
RAX=0000000000100000 RBX=000000003feac9f0 RCX=0000000000000000 RDX=0000000000000000
RSI=000000003f226f18 RDI=000000003feac9a8 RBP=000000003fea8800 RSP=000000003fea8800
R8 =000000003fea8794 R9 =000000003fb7b48f R10=000000003fbcd018 R11=fffffffffffffffc
R12=000000003f226a20 R13=000000003feac8a0 R14=000000003fea9140 R15=000000003e695820
RIP=0000000000101011 RFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=1
ES =0030 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0038 0000000000000000 ffffffff 00af9a00 DPL=0 CS64 [-R-]
SS =0030 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0030 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0030 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0030 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
TR =0000 0000000000000000 0000ffff 00008b00 DPL=0 TSS64-busy
GDT=     000000003fbee698 00000047
IDT=     000000003f306018 00000fff
CR0=80010033 CR2=0000000000000000 CR3=000000003fc01000 CR4=00000668
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000 
DR6=00000000ffff0ff0 DR7=0000000000000400
EFER=0000000000000500
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
XMM08=00000000000000000000000000000000 XMM09=00000000000000000000000000000000
XMM10=00000000000000000000000000000000 XMM11=00000000000000000000000000000000
XMM12=00000000000000000000000000000000 XMM13=00000000000000000000000000000000
XMM14=00000000000000000000000000000000 XMM15=00000000000000000000000000000000
(qemu) x /2i 0x101011
0x00101011:  eb fd                    jmp      0x101010
0x00101013:  cc                       int3     
(qemu) x /2i 0x101010
0x00101010:  f4                       hlt      
0x00101011:  eb fd                    jmp      0x101010

RIP=0000000000101011
になってます。

そして、
0x00101011 で  jmp  0x101010

ジャンプ先は、
0x00101010hlt
になっているので、良いようです。



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