引き続き
・Mac で始める「ゼロからのOS自作入門」 - yamoridon - Qiita
第2章が終わった段階(osbook_day02b)では、$HOME/workspace/mikanos/ にはまだ、kernelディレクトリがないためです。
(→ サポートページ Issue #72、正誤表)
なので、
本の通りに、コンパイルします。
※ この章以降、カーネルファイルとブートローダの2種類を書き換えながら作っていきます。
そのため、カーネルファイル kernel.elf を作るためのコンパイルとリンク、およびブートローダ Loader.efi を作るためのビルドという、2種類の操作がそれぞれ必要になってきます。
ちょっと、分かりづらいポイントです。
QEMUで実行します。 (長いですがコマンドプロンプトの% を除いて1行です。)
RIP=0000000000101011
になってます。
そして、
0x00101011 で jmp 0x101010
ジャンプ先は、
0x00101010 で hlt
になっているので、良いようです。
・Mac で始める「ゼロからのOS自作入門」 - yamoridon - Qiita
の記事を見ながら実行していきます。
3.3 初めてのカーネル(osbook_day03a)
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
% 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
(qemu) info registersRAX=0000000000100000 RBX=000000003feac9f0 RCX=0000000000000000 RDX=0000000000000000RSI=000000003f226f18 RDI=000000003feac9a8 RBP=000000003fea8800 RSP=000000003fea8800R8 =000000003fea8794 R9 =000000003fb7b48f R10=000000003fbcd018 R11=fffffffffffffffcR12=000000003f226a20 R13=000000003feac8a0 R14=000000003fea9140 R15=000000003e695820RIP=0000000000101011 RFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=1ES =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 LDTTR =0000 0000000000000000 0000ffff 00008b00 DPL=0 TSS64-busyGDT= 000000003fbee698 00000047IDT= 000000003f306018 00000fffCR0=80010033 CR2=0000000000000000 CR3=000000003fc01000 CR4=00000668DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000DR6=00000000ffff0ff0 DR7=0000000000000400EFER=0000000000000500FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80FPR0=0000000000000000 0000 FPR1=0000000000000000 0000FPR2=0000000000000000 0000 FPR3=0000000000000000 0000FPR4=0000000000000000 0000 FPR5=0000000000000000 0000FPR6=0000000000000000 0000 FPR7=0000000000000000 0000XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000XMM08=00000000000000000000000000000000 XMM09=00000000000000000000000000000000XMM10=00000000000000000000000000000000 XMM11=00000000000000000000000000000000XMM12=00000000000000000000000000000000 XMM13=00000000000000000000000000000000XMM14=00000000000000000000000000000000 XMM15=00000000000000000000000000000000(qemu) x /2i 0x1010110x00101011: eb fd jmp 0x1010100x00101013: cc int3(qemu) x /2i 0x1010100x00101010: f4 hlt0x00101011: eb fd jmp 0x101010
RIP=0000000000101011
になってます。
そして、
0x00101011 で jmp 0x101010
ジャンプ先は、
0x00101010 で hlt
になっているので、良いようです。