GRUB で起動するカーネルを書く

マジックナンバーとかよくわかっていない。とりあえず、http://www.osdev.org/wiki/Bare_bones の通りにやったらいけた。
なんというかまぁ、適当。注意は -fleading-underscore くらいのものか。

.global _loader

.set    ALIGN,          1<<0
.set    MEMINFO,        1<<1
.set    FLAGS,          ALIGN | MEMINFO
.set    MAGIC,          0x1BADB002
.set    CHECKSUM,       -(MAGIC + FLAGS)

.align  4
.long   MAGIC
.long   FLAGS
.long   CHECKSUM

.set    STACKSIZE, 0x40000
.comm   stack, STACKSIZE, 32

_loader:
        mov     $(stack + STACKSIZE), %esp
        push    %eax
        push    %ebx

        call    _kmain
        hlt
#define UNUSED __attribute__((unused))

void kmain(void *mbd UNUSED, unsigned int magic UNUSED)
{
    unsigned char *videoram = (unsigned char *) 0xb8000;
    videoram[0] = 65;
    videoram[1] = 0x07;
}
AS = as
CC = gcc
LD = ld
CFLAGS = -Wall -Wextra -Werror -nostdlib -nostartfiles \
    -nodefaultlibs -fleading-underscore

all: kernel.bin

kernel.bin: kernel.o loader.o linker.ld
	$(LD) -T linker.ld -o $@ kernel.o loader.o

あとは、昨日の日記に書いたように GRUB の入ったフロッピーイメージを作って、

% e2cp kernel.bin fd.img:/boot

で出来上がり。QEMU あたりで起動したら

> root (fd0)
> kernel /boon/kernel.bin
> boot

とかそんなので。