■
CPUのプロテクトモード移行が成功したのでコードをassemblerからcへ移行。またmakefileも用意。今回はGASとリンカスクリプトを使ってるのでメモリ配置がわかりやすい。catを使ったfirst,second,c部分の結合も無くなったし。
makefile
BASEDIR = /home/sode/prog/sodex SRC = ${BASEDIR}/src BIN = ${BASEDIR}/bin LIST = ${BASEDIR}/list INCLUDE = ${SRC}/include AS = /usr/bin/as CC = /usr/bin/gcc LD = /usr/bin/ld CFLAGS = -c -nostdlib -fno-exceptions -ffreestanding -fno-builtin -Wall \ -I ${INCLUDE} LFLAGS = -T ${SRC}/boot.ld -Map ${LIST}/boot.map --oformat binary KERNEL = boot.bin ACIENT = boota.o MIDDLE = bootm.o COBJS = cstart.o \ kernel.o CSRC = cstart.c \ kernel.c HEADER = kernel.h ${KERNEL} : ${ACIENT} ${MIDDLE} ${COBJS} ${LD} ${LFLAGS} ${ACIENT} ${MIDDLE} ${COBJS} -o $@ ${ACIENT} : ${SRC}/bootacient.S ${AS} bootacient.S -o $@ -a > ${LIST}/boota.lst ${MIDDLE} : ${SRC}/bootmiddle.S ${AS} bootmiddle.S -o $@ -a > ${LIST}/bootm.lst .c.o: ${CC} ${CFLAGS} $< ${SRC}/cstart.c : ${INCLUDE}/kernel.h ${SRC}/kernel.c : ${INCLUDE}/kernel.h clean : rm *.o; rm *.bin
bootmiddle.S
kernelはGDTの0x08セレクタのオフセット0x1000(物理メモリ 0x1000)に置かれているのでljmpで移動。(bootacient.Sにてbootmiddle.Sより後のコードを0x1000の位置にコピーしている)
.code32 .text first_code32: movl $0x10, %eax movw %ax, %ds movw %ax, %es movl $0x18, %eax movw %ax, %ss movl $0x9c000, %esp ljmp $_KERNEL_CS, 0x1000
cstart.c
#include "kernel.h" void cstart() { startKernel(); }
kernel.c
#include "kernel.h" void startKernel() { //test char *p = (char*)0xb8000; p[0] = 'S'; for(;;); }
次はA20の有効化とビデオメモリ(0xb8000)を使った表示系の整備かな。