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
とかそんなので。