6.828: Operating System Engineering (5)
実は 6.828/lab 配下の GNUMakefile には boot とか kernel とか kernel.img を作るルールは書いてなくて最初困りました。ただ、昨晩見つけてた obj/.deps みたく上の方で include されている以下のファイルを確認したらありました。
- boot/Makefrag
- kern/Makefrag
むむ
昨晩見た Bootloader のソレは一体何だ、と言いつつソースを見てみたんですが、どう考えてもあれば Kernel が起動する前のソレだということに思い至り、make した qemu のコンパイルスイッチ確認したら -g がありました。
多分あれば qemu の中の BIOS なんですよね。別途 ココ のソレを見つつ再度確認してみます。
もう少し
disk image をナニしているのは kern/Makefrag に記述があります。
# How to build the kernel disk image $(OBJDIR)/kern/kernel.img: $(OBJDIR)/kern/kernel $(OBJDIR)/boot/boot @echo + mk $@ $(V)dd if=/dev/zero of=$(OBJDIR)/kern/kernel.img~ count=10000 2>/dev/null $(V)dd if=$(OBJDIR)/boot/boot of=$(OBJDIR)/kern/kernel.img~ conv=notrunc 2>/dev/null $(V)dd if=$(OBJDIR)/kern/kernel of=$(OBJDIR)/kern/kernel.img~ seek=1 conv=notrunc 2>/dev/null $(V)mv $(OBJDIR)/kern/kernel.img~ $(OBJDIR)/kern/kernel.img
- dd の conv=notrunc は追記モード
- 先頭セクタに boot/boot をコピーして以降に kern/kernel を書いている
とは言え、先頭セクタの根拠が無いな、と言いつつ boot/Makefrag 見てみると以下な記述がありますね。
$(OBJDIR)/boot/boot: $(BOOT_OBJS) @echo + ld boot/boot $(V)$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o $@.out $^ $(V)$(OBJDUMP) -S $@.out >$@.asm $(V)$(OBJCOPY) -S -O binary $@.out $@ $(V)perl boot/sign.pl $(OBJDIR)/boot/boot
最後の sign.pl が boot のサイズを調整しているはず。ls -l してみたら以下。
$ ls obj/boot/boot -l -rwxr-xr-x 1 rms rms 512 2011-06-22 23:05 obj/boot/boot $
ソース的にもイメージできる、という意味では結構簡単です。
別途になりますが
- boot の LD なオプションについて確認
- boot/main.c のコメント確認しつつ確認
- 起点はどこかな、と思ったら boot.asm が出力されている?
ちなみに boot.asm の先頭部分が以下。
obj/boot/boot.out: file format elf32-i386 Disassembly of section .text: 00007c00 <start>: .set CR0_PE_ON, 0x1 # protected mode enable flag .globl start start: .code16 # Assemble for 16-bit mode cli # Disable interrupts 7c00: fa cli cld # String operations increment 7c01: fc cld
start な部分は boot.S のソレですね。てか 7c00 から始まるのか。あら? 7c00 な根拠って何だっけ。
とりあえづ
上記諸々は帰宅後調べます。そろそろ帰る。