Initial release.
This commit is contained in:
commit
cd5d85f99c
5 changed files with 86 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
*.o
|
||||
*.ker
|
27
prototypes/base/Makefile
Normal file
27
prototypes/base/Makefile
Normal file
|
@ -0,0 +1,27 @@
|
|||
|
||||
AS=clang
|
||||
CC=clang
|
||||
CXX=clang++
|
||||
LD=ld
|
||||
|
||||
FLAGS = -ffreestanding -m32
|
||||
ASFLAGS = $(FLAGS)
|
||||
CFLAGS = $(FLAGS)
|
||||
CXXFLAGS = $(FLAGS)
|
||||
|
||||
SRCS = $(shell find -name '*.[cS]')
|
||||
OBJS = $(addsuffix .o, $(notdir $(basename $(SRCS))))
|
||||
|
||||
all: kernel-base.ker
|
||||
|
||||
kernel-base.ker: $(OBJS)
|
||||
$(LD) -melf_i386 -Ttext=0x1000000 -o kernel-base.ker $(addprefix obj/, $^)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(ASFLAGS) -c -o obj/$@ $<
|
||||
|
||||
%.o: %.S
|
||||
$(AS) $(CFLAGS) -c -o obj/$@ $<
|
||||
|
||||
%.o: %.cpp
|
||||
$(CPP) $(CXXFLAGS) -c -o obj/$@ $<
|
30
prototypes/base/entrypoint.S
Normal file
30
prototypes/base/entrypoint.S
Normal file
|
@ -0,0 +1,30 @@
|
|||
.section .text
|
||||
|
||||
// Init ist eine Funktion aus init.c
|
||||
.extern init
|
||||
|
||||
// _start muss global sein, damit der Linker es findet und als Einsprungspunkt
|
||||
// benutzen kann (alle Labels, die nicht global sind, sind nur in dieser Datei
|
||||
// sichtbar)
|
||||
.global _start
|
||||
_start:
|
||||
// Stack initialisieren
|
||||
mov $kernel_stack, %esp
|
||||
|
||||
// C-Code aufrufen
|
||||
call init
|
||||
|
||||
// Falls wir jemals aus init zurueckkommen sollten, sperren wir die Interrupts und
|
||||
// halten einfach den Prozessor an. (man braucht ihn ja nicht unnötig heißlaufen lassen.)
|
||||
_stop:
|
||||
cli
|
||||
hlt
|
||||
|
||||
// Sollte es doch weitergehen, probieren wir erneut die CPU schlafen zu lassen
|
||||
jmp _stop
|
||||
|
||||
// 8 kB Stack fuer den Kernel. Das Label steht hinter dem freien Speicher,
|
||||
// weil der Stack nach unten waechst
|
||||
.section .bss
|
||||
.space 8192
|
||||
kernel_stack:
|
16
prototypes/base/init.c
Normal file
16
prototypes/base/init.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
void init(void)
|
||||
{
|
||||
const char hw[] = "Hello World!";
|
||||
int i;
|
||||
char* video = (char*) 0xb8000;
|
||||
|
||||
// C-Strings haben ein Nullbyte als Abschluss
|
||||
for (i = 0; hw[i] != '\0'; i++) {
|
||||
|
||||
// Zeichen i in den Videospeicher kopieren
|
||||
video[i * 2] = hw[i];
|
||||
|
||||
// 0x07 = Hellgrau auf Schwarz
|
||||
video[i * 2 + 1] = 0x07;
|
||||
}
|
||||
}
|
11
prototypes/base/multiboot.S
Normal file
11
prototypes/base/multiboot.S
Normal file
|
@ -0,0 +1,11 @@
|
|||
.section .text
|
||||
|
||||
#define MB_MAGIC 0x1badb002
|
||||
#define MB_FLAGS 0x0
|
||||
#define MB_CHECKSUM -(MB_MAGIC + MB_FLAGS)
|
||||
|
||||
// Der Multiboot-Header
|
||||
.align 4
|
||||
.int MB_MAGIC
|
||||
.int MB_FLAGS
|
||||
.int MB_CHECKSUM
|
Loading…
Reference in a new issue