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 な根拠って何だっけ。

とりあえづ

上記諸々は帰宅後調べます。そろそろ帰る。