GSoC 2012 week2:擬似BIOSの雛形を作る

PC起動時のCPUの開始アドレスはいくつかな、と思ったのだがthe processor to always begin executing code at address "FFFF:0000"とか書いてあるので、リニアアドレスで言うと0xFFFF0からスタートするようだ。

擬似BIOSを作るには、まずここにリアルモードで動く小さなプログラムをロードしてVMCALL命令を実行してみるのがよさそうだと考えた。

Makefile
all:
	cc -m32 -c pseudobios.S -o pseudobios.o
	ld -melf_i386_fbsd -T ldscript.lds pseudobios.o -o pseudobios.elf
	objcopy -I elf32-i386-freebsd -O binary pseudobios.elf pseudobios.bin
clean:
	rm *.o *.elf *.bin
ldscript.lds
OUTPUT_FORMAT("elf32-i386")
OUTPUT_ARCH("i386")
SECTIONS
{
	.text 0xffff0 :
	{
		*(.text)
		*(.rodata)
	} = 0
	.data :
	{
		*(.data)
	}
	.sbss :
	{
		*(.sbss)
		*(.scommon)
	}
	.bss :
	{
		*(.bss)
		*(COMMON)
	}
}
pseudobios.S
	.code16gcc
	vmcall

…で、これをロードしないといけないのだけれども。
bhyveloadのローダを改造してBIOSのバイナリをゲストのメモリ空間にmemcpyするのが手っ取り早そうかな。