Operating System Development (OSD) - boot
Адрес оригинального проекта - OSD
Начнем с простого - с загрузчика . Загрузчик написан под GRUB .
На первом этапе не будем даже переключаться в защищенный режим,
а лишь загрузим ядро с минимальным набором библиотечных функций.
Дерево проекта :
../include
../lib
kstart.s
main.c
video.c
В каталоге /include лежат хидеры библиотечных функций.
В каталоге /lib лежат сами функции.
В проекте 2 makefile - один в главном каталоге , второй - в подкаталоге lib.
Главный makefile :
LDSCRIPT=krnl.ld
AS =as
CC =gcc -g -Wall -W -O2 -nostdinc -fno-builtin
LD =ld -g -T $(LDSCRIPT) -nostdlib
LIBC =lib/libc.a
OBJS =kstart.o main.o video.o
all: kernel.img
.s.o:
$(AS) -o$@ $<
.c.o:
$(CC) -c -o$@ $<
kstart.o: kstart.s $(MAKEDEP)
main.o: main.c $(MAKEDEP)
video.o: video.c $(MAKEDEP)
$(LIBC):
make -C lib $(MAKEFILE)
kernel.img: $(OBJS) $(LDSCRIPT) $(LIBC) $(MAKEDEP)
$(LD) -o$@ $(OBJS) $(LIBC)
objdump --source $@ >krnl.lst
nm $@ | sort >krnl.sym
strip $@
clean:
rm *.o *.img *.sym *.lst
rm lib/*.o lib/*.a
При создании образа kernel.img очень полезная команда objdump --source $@ >krnl.lst
дизассемблирует его.
Главный makefile использует библиотеку libc.a , которая генерится с помощью второго
makefile :
CC =gcc -g -Wall -W -O2 -nostdinc -fno-builtin
STDIO =doprintf.o
STRING =memsetw.o memcpy.o strlen.o
X86 =inportb.o outportb.o
OBJS =$(STDIO) $(STRING) $(X86)
all: libc.a
clean:
rm -f libc.a $(OBJS)
.c.o:
$(CC) -c -o$@ $<
doprintf.o: doprintf.c
memsetw.o: memsetw.c
memcpy.o: memcpy.c
strlen.o: strlen.c
inportb.o: inportb.c
outportb.o: outportb.c
libc.a: $(OBJS) $(MAKEDEP)
ar rcs libc.a $(OBJS)
При загрузке на экран будут выведены несколько тестовых сообщений :
int main(void)
{
int score = 4, years;
init_video();
kprintf("Hello from www.iakovlev.org !\n");
years = -7;
kprintf("%u score and %i years ago...\n", score, -years);
kprintf("-1L == 0x%lX == octal %lo\n", -1L, -1L);
kprintf("<%-08s> and <%08s> justified strings\n", "left", "right");
kprintf("Goodbye. Use reset button to end\n");
/* return to KSTART.ASM, which will freeze */
return 0;
}
Архив исходников лежит тут
|