自作OS 2章の振り返りと3章の前半 雑メモ

11月毎日投稿 2日目

雑に2章振り返り

メモリマップ取得できるようにしたなあ。 print関数をハードウェアまでおったなあ。 メモリマップをkarnelに行く前に取得して、それを使ってkarnelで色々するんだなあ。 ということで3章:画面表示の練習とブートローダーに進む。

自分用メモ ~/workspace/mikanos/が自分がいじるファイル MikanLoaderPkgにMain.cがあり、これがBootloaderである。 kernel/main.cppにkernelの動きがある。

ここで疑問 Main.cはどこが呼び出している?

```c

EFI_STATUS EFIAPI UefiMain( EFI_HANDLE image_handle,

``` ここから始まっているため、これを呼び出している場所があるはず。

怪しいファイルを見てみる。

```

❯ cat Loader.inf [Defines] INF_VERSION = 0x00010006 BASE_NAME = Loader FILE_GUID = c9d0d202-71e9-11e8-9e52-cfbfd0063fbf MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 0.1 ENTRY_POINT = UefiMain

VALID_ARCHITECTURES = X64

[Sources] Main.c

```

普通にここにEntryPointとして設定されていた。 解決。

3章:画面表示の練習とブートローダー

qemuでデバックする

```

(qemu) info registers

CPU#0 RAX=0000000000000000 RBX=0000000000000001 RCX=000000003fb7b1c0 RDX=0000000000000002 RSI=0000000000000400 RDI=000000003fea9300 RBP=0000000000000030 RSP=000000003fea8870 R8 =000000003fea8678 R9 =000000003f20011e R10=0000000000000000 R11=000000000000ffff

``` これはほんの一部だが私の知っているMIPSとは大きくレジスタの種類が違う。なぜだろう。

実はこれは、x86コンピュータだからである。

これらは、設計思想の違いである。 CISCとRISCがあり、代表例が、IntelとARMである。

CISC = Complex Instruction Set Computer RISC = Reduced Instruction Set Computer

CISC(先に存在)

RISC(後から登場)

次にメインメモリの中を見てみる。 メインメモリがCPUの外で、レジスタはCPUの中である。

(qemu) x /4xb 0x067ae4c4 00000000067ae4c4: 0x00 0x00 0x00 0x00 0x067ae4c4番地のメモリの中身を取り出すという意味。 /4xbはフォーマット。何も入っていないみたいだ。

(qemu) x /16xg 0x3fea8870 000000003fea8870: 0x0000000000000000 0x000000003fea8a00 000000003fea8880: 0x0000000000000900 0x000000000000002f 000000003fea8890: 0x0000000000000006 0x000000003e695682 000000003fea88a0: 0x00000000ffc00000 0x0000000000000400 000000003fea88b0: 0x0000000000000001 0x0000000000000030 000000003fea88c0: 0x000000003f226a20 0x0000000000004000 000000003fea88d0: 0x000000003fea8a00 0x0000000000000900 000000003fea88e0: 0x00000000000005ba 0x0000000000000030 スタックポインタ以降の中身を見れた。中身がある。 何が書かれているか逆アセンブルしてみる。

(qemu) x /2i 0x3fea8880 0x3fea8880: 00 09 addb %cl, (%rcx) 0x3fea8882: 00 00 addb %al, (%rax) 足し算している。ちゃんと中身が見れてHappy

こんな感じでデバックしよう。

汎用レジスタとメインメモリ レジスタ:クソ早いが、ちっちゃい メインメモリ:クソ遅いが、でっかい

レジスタ:0.5ns程度で読み書き、128B程度しかない メモリ:100ns程度で読み書き、16GBもある。

どれだけレジスタを効率よく使うかが高速化につながる。

一覧に戻る