diff --git a/kernel/Makefile b/kernel/Makefile index d43a46f..d3e2d21 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -20,12 +20,12 @@ WD := $(shell pwd) export HOS_TOPLEVEL := $(WD) LDSCRIPT := link.ld KERNEL := hos -export CPPFLAGS := -I$(WD)/include +export CPPFLAGS := -I$(HOS_TOPLEVEL) -I$(HOS_TOPLEVEL)/include export CFLAGS := -Wall -O2 export CXXFLAGS := -Wall -O2 -export LDFLAGS := -T $(LDSCRIPT) +export LDFLAGS := -T $(LDSCRIPT) -Map $(KERNEL).map -SUBDIRS := boot +SUBDIRS := boot mm SUBDIRS_clean := $(SUBDIRS:%=%.clean) .PHONY: all @@ -35,11 +35,11 @@ $(KERNEL).gz: $(KERNEL) gzip -c $< > $@ $(KERNEL): $(SUBDIRS) - $(LD) $(LDFLAGS) -o $@ $(foreach subdir,$(SUBDIRS),$(subdir)/$(subdir).o) + $(LD) $(LDFLAGS) -o $@ $(foreach subdir,$(SUBDIRS),$(subdir)/$(subdir)_all.o) .PHONY: $(SUBDIRS) $(SUBDIRS): - $(MAKE) -C $@ + $(MAKE) -C $@ SUBDIR=$@ .PHONY: clean clean: $(SUBDIRS_clean) diff --git a/kernel/boot/boot.asm b/kernel/boot/boot.asm index 9f70e37..bb889c4 100644 --- a/kernel/boot/boot.asm +++ b/kernel/boot/boot.asm @@ -9,16 +9,13 @@ %define VIRTUAL_OFFSET 0xE0000000 ; kernel virtual addr -%define TEMPORARY_STACK_PHYSICAL 0x01000000-4 ; top of first 16MB -%define TEMPORARY_STACK_VIRTUAL TEMPORARY_STACK_PHYSICAL + VIRTUAL_OFFSET - %define PAGE_SIZE 0x1000 ; 4KB pages ; Symbols from the linker extern _end, _bss ; Symbols from C -extern k_mbsave +extern k_mbsave, page_directory ;------------------------------------------------------- [section .text] @@ -66,7 +63,7 @@ segmented_start: mov es, cx mov gs, cx mov fs, cx - mov esp, TEMPORARY_STACK_VIRTUAL-4 ; set up temporary stack space + mov esp, page_directory+PAGE_SIZE-4 ; set up temporary stack space mov ax, 0x0700 + 'b' mov [VIRTUAL_OFFSET+0xB8000+160*8+1*2], ax diff --git a/kernel/include/hos_defines.h b/kernel/include/hos_defines.h new file mode 100644 index 0000000..01db016 --- /dev/null +++ b/kernel/include/hos_defines.h @@ -0,0 +1,7 @@ + +#ifndef HOS_DEFINES_H +#define HOS_DEFINES_H + +#define PAGE_SIZE 4096 + +#endif diff --git a/kernel/include/hos_types.h b/kernel/include/hos_types.h new file mode 100644 index 0000000..eead480 --- /dev/null +++ b/kernel/include/hos_types.h @@ -0,0 +1,14 @@ + +#ifndef HOS_TYPES_H +#define HOS_TYPES_H + +typedef unsigned char u8_t; +typedef signed char s8_t; +typedef unsigned short u16_t; +typedef signed short s16_t; +typedef unsigned int u32_t; +typedef signed int s32_t; +typedef unsigned long long u64_t; +typedef signed long long s64_t; + +#endif diff --git a/kernel/mm/Makefile b/kernel/mm/Makefile new file mode 100644 index 0000000..cae81d7 --- /dev/null +++ b/kernel/mm/Makefile @@ -0,0 +1,2 @@ + +include $(HOS_TOPLEVEL)/subdir.mak diff --git a/kernel/mm/mm.c b/kernel/mm/mm.c new file mode 100644 index 0000000..30000c5 --- /dev/null +++ b/kernel/mm/mm.c @@ -0,0 +1,4 @@ + +#include "mm.h" + +pagedirectory_t page_directory __attribute__ ((aligned (4096))); diff --git a/kernel/mm/mm.h b/kernel/mm/mm.h new file mode 100644 index 0000000..43420ba --- /dev/null +++ b/kernel/mm/mm.h @@ -0,0 +1,16 @@ + +#ifndef MM_H +#define MM_H MM_H + +#include "hos_types.h" +#include "hos_defines.h" + +typedef u32_t pagedirectory_entry_t; + +typedef pagedirectory_entry_t + pagedirectory_t[PAGE_SIZE / sizeof(pagedirectory_entry_t)]; + +extern pagedirectory_t page_directory; + +#endif + diff --git a/kernel/subdir.mak b/kernel/subdir.mak index f396122..dcded74 100644 --- a/kernel/subdir.mak +++ b/kernel/subdir.mak @@ -4,10 +4,11 @@ COBJS := $(patsubst %.c,%.o,$(wildcard *.c)) CXXOBJS := $(patsubst %.cc,%.o,$(wildcard *.cc)) CDEPS := $(COBJS:.o=.dep) CXXDEPS := $(CXXOBJS:.o=.dep) +OUTPUT_FILE := $(SUBDIR)_all.o -all: $(SUBDIR).o +all: $(OUTPUT_FILE) -$(SUBDIR).o: $(ASMOBJS) $(COBJS) $(CXXOBJS) +$(OUTPUT_FILE): $(ASMOBJS) $(COBJS) $(CXXOBJS) $(LD) -r -o $@ $^ %.o: %.asm