30日後にosを完成させる。(3日目)

2023/11/01に公開

やったこと(p80まで)

カーネルファイルを作成し、ブートローダーでメインメモリに読み込んでosを起動するところまで。
スクショは0x101010のアドレスを逆アセンブリした結果。

RIPのアドレス(0x101011)をダンプし、逆アセンブルした結果がjmp命令。jmp先のアドレスが指し示す命令がhltであり、今回作ったカーネルファイルの以下のコードと一致した。
※hltはcpuを停止させる命令

extern "C" void KernelMain() {
	while (1) __asm__("hlt");
}

本日の進捗
https://github.com/satouyuuki/mikanos/releases/tag/day3
リポジトリURL
https://github.com/satouyuuki/mikanos

qemuモニタのデバッグ

qemuをデバッグするにはqemu-system-X86_64の起動オプションに"-monitor stdio"をつける。cpuのレジスタ値やメインメモリをメモリダンプすることができる。逆アセンブルことで命令を見ることができる

cpuのレジスタについての説明

  • 汎用レジスタは16個ある(値を記憶する領いき)
  • 特殊レジスタは多くある。よく使うものを以下に示す。
    RIP: cpuが次に実行する命令のメモリアドレスを保持するレジスタ
    RFLAGS命令の実行結果によって変化するフラグを集めたレジスタ。
    CR0: cpuの重要な設定を集めたレジスタ
qemuのcpuレジスタを実際に表示
(qemu) info registers
RAX=0000000000000000 RBX=0000000000000001 RCX=000000003fb7b1c0 RDX=0000000000000031
RSI=0000000000000400 RDI=000000003fea92d0 RBP=000000000000002e RSP=000000003fea88a0
R8 =0000000000000000 R9 =000000003fecc30f R10=0000000000000050 R11=0000000000000000
R12=000000003e662568 R13=000000003fea8930 R14=000000003e7737a0 R15=000000003fea88e8
RIP=000000003e661416 RFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
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

カーネルの作成

準備: ブートローダーの実行ファイル、カーネルの実行ファイルをUSBメモリに書き込む。
実行時の流れ:

  1. ブートローダーファイルからカーネルファイルを開く
  2. カーネルファイルサイズを取得し、その分メモリを割り当てる
  3. カーネルファイルを読み込んでメモリに書き込む
  4. UFBI BIOSのブートサービスを停止する(裏で動いているがosにとって邪魔なため)
  5. カーネルを起動する

一言

課題: ubuntuでバックスラッシュが¥になってしまう。。

GitHubで編集を提案

Discussion