Seitenleiste

Inhaltsverzeichnis

Benötigte Werkzeuge

Wichtig
Ich beschreibe hier nicht allgemein, welche Programme man verwenden kann und wie man sie zu verwenden hat. Wer Hilfe hierbei braucht sollte mich im Forum kontaktieren!

Außerdem wird hier nur prinzipiell die Einrichtung des Arbeitsplatzes unter Linux (Ubuntu Hardy) beschrieben.

Die Versionsnummern sind ermittelt worden, als dieser Artikel geschrieben wurde. Ich update regelmäßig, verwende also die normalerweise neuste, stabile Version.

gcc

Natürlich braucht man einen Compiler, wenn man ein Programm schreiben möchte. Und ein Betriebssystem ist im Grunde ein Programm.
Und welcher Compiler bietet sich da besser an als der gcc…

Meine Version:

gcc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)

Um den gcc zu installieren (falls er das nicht schon ist) einfach

  sudo apt-get install gcc

in die Kommandozeile eingeben.

Hier noch die Parameter, die ich zum kompilieren meines Kernels verwendet habe:

gcc -m32 -fno-builtin -fno-leading-underscore -fno-strict-aliasing -fno-stack-protector -Wall -O0 -c -g -I ./inc/ *.c

Das Includeverzeichnis (Option „-I“) muss natürlich angepasst werden.
Wichtig ist auch der Parameter -fno-builtin. Dies bedeutet, dass keine Standardbibliotheken verwendet werden. Standardbibliotheken haben wir in der Umgebung, in der unser Kernel laufen wird, nicht. Also können wir sie nicht verwenden.

nasm

Der Assembler nasm ist auch mit von der Partie. Mit ihm werden wir unseren Assemblercode (es wird nicht allzuviel sein, versprochen) compilieren.
Die Installation unter Linux geht mit

sudo apt-get install nasm

schnell und einfach.

Ich benutze folgende Version:

NASM version 0.99.06-20071101 compiled on Sep 16 2008

nasm rufe ich folgendermaßen auf:

nasm -f elf assmcode.asm

ld

Ein Linker ist auch von Nöten, um die einzelnen Binärdateien zusammenzufügen.
Ich verwende dazu den Linker ld.

GNU ld (GNU Binutils for Ubuntu) 2.18.0.20080103
Copyright 2007 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.

Den Linker rufe ich wie folgt auf:

ld -m elf_i386 -Map linker-output-map.txt -T linkerscript.ld -o basic-kernel.bin

Eine kurze Erklärung hierzu:
Das Ausgabeformat ist elf_i368, es wird eine Linkmap mit dem Namen linker-output-map.txt ausgegeben. Außerdem verwenden wir ein Linkerskript mit dem Namen linkerscript.ld.
Die Ausgabe (der fertig gelinkte Kernel) heißt basic-kernel.bin.

Das verwendete Linkerskript sieht folgendermaßen aus:

ENTRY(start)
OUTPUT_FORMAT(elf32-i386)

SECTIONS
{
    . = 0x100000;
    __kernel_start = .;
    .text :
{
        *(.text)
}

    .data :
{
        *(.data)
        *(.rodata)
}

    .bss :
{
        *(.bss)
}
    __kernel_end = .;
    end = .;
}

Es gibt dem Linker Informationen darüber, wie unser Kernel zusammengelinkt werden soll. Außerdem werden zwei Pointer (__kernel_start und __kernel_end) definiert. Sie werden uns später noch nützlich sein.

make

Auf make möchte ich nur ganz kurz eingehen. Ich kann nicht die Funktions- und Bedienweise von make erklären, das würde das Tutorial sprengen.
Ich möchte nur das make-File, das ich zum Kompilieren verwende zeigen. Es darf gerne verwendet werden.
Bestehen Probleme in der Verwendung, dann bitte ich um eine Email an mich.

# Makefile
CC = gcc
CCFLAGS = -m32 -fno-builtin -fno-leading-underscore -fno-strict-aliasing -fno-stack-protector -Wall -O0 -c -g -I ./inc/
 
NM = nasm
NMFLAGS = -f elf
 
LD = ld
LDFLAGS = -m elf_i386 -Map linker-output-map.txt -T linkerscript.ld -o basic-kernel.bin
 
ASMDATS = basic-kernel-asm.asm isr-irq-asm.asm
##################################################
Standard: *.c *.asm ./inc/*.h
	$(CC) $(CCFLAGS) *.c
	for i in $(ASMDATS); do $(NM) $(NMFLAGS) $$i; done
	$(LD) $(LDFLAGS) *.o
 
clean:
	rm -rf *.o
 
floppy-update: *.bin
	sudo mount -o loop ./bochs/floppy.img /mnt/floppy/
	sudo cp basic-kernel.bin /mnt/floppy/
	sudo umount /mnt/floppy/
 
clean-all:
	rm -rf *.o
	rm -rf *kernel.bin
	rm -rf *output-map.txt

Einzelheiten dazu werde ich nun nicht erklären.
Die beiden Assembler-Code-Dateien werden wir im Verlauf des Tutorials erstellen. Solange sie nicht existieren, wird nasm sich über eine nicht existente Quelle beschweren. Sollte das Probleme verursachen, dann einfach die noch nicht existierenden Dateien herausstreichen.


<Zurück> | <Index> | <Weiter>