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(先に存在)
- 1970年代、メモリが高価だった時代
- 「1命令で複雑なことができれば、プログラムサイズが小さくなる」という発想
- 例:
MOVSB(メモリコピー)、LOOP(ループ制御)など
RISC(後から登場)
- 1980年代、「命令をシンプルにした方が高速化できる」という研究から
- CISCに対抗して「Reduced(縮小した)」と命名
- 例: MIPSの
add,lw,swなど基本命令のみ
次にメインメモリの中を見てみる。 メインメモリが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もある。
どれだけレジスタを効率よく使うかが高速化につながる。