ウォンツテック

そでやまのーと

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)を使った表示系の整備かな。