diff --git a/Makefile b/Makefile index 1969454..da1419f 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ CC = ${HOME}/opt/cross/bin/i686-elf-gcc CPP = ${HOME}/opt/cross/bin/i686-elf-g++ CFLAGS = -ffreestanding -O2 -Wall -Wextra -OFILES = $(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/io.o $(BUILD_DIR)/MMU.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/string.o +OFILES = $(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o $(BUILD_DIR)/io.o $(BUILD_DIR)/PageDirectory.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/string.o SRC_DIR = src BUILD_DIR = build @@ -71,8 +71,8 @@ $(BUILD_DIR)/crtn.o: $(BUILD_DIR)/io.o: $(CPP) -c $(SRC_DIR)/kernel/io.cpp -o $(BUILD_DIR)/io.o $(CFLAGS) -fno-exceptions -fno-rtti -$(BUILD_DIR)/MMU.o: - $(CPP) -c $(SRC_DIR)/kernel/MMU.cpp -o $(BUILD_DIR)/MMU.o $(CFLAGS) -fno-exceptions -fno-rtti +$(BUILD_DIR)/PageDirectory.o: + $(CPP) -c $(SRC_DIR)/kernel/memory/PageDirectory.cpp -o $(BUILD_DIR)/PageDirectory.o $(CFLAGS) -fno-exceptions -fno-rtti $(BUILD_DIR)/idt.o: $(CPP) -c $(SRC_DIR)/kernel/arch/i386/idt/idt.cpp -o $(BUILD_DIR)/idt.o $(CFLAGS) -fno-exceptions -fno-rtti diff --git a/src/kernel/bootcheck.h b/src/kernel/bootcheck.h index 3aef2ed..890c4f8 100644 --- a/src/kernel/bootcheck.h +++ b/src/kernel/bootcheck.h @@ -1,5 +1,5 @@ #pragma once -#include "multiboot.h" +#include "bootloader/multiboot.h" #define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit))) extern "C" { diff --git a/src/kernel/multiboot.h b/src/kernel/bootloader/multiboot.h similarity index 100% rename from src/kernel/multiboot.h rename to src/kernel/bootloader/multiboot.h diff --git a/src/kernel/kernel.h b/src/kernel/kernel.h index 1c968f1..445e8fa 100644 --- a/src/kernel/kernel.h +++ b/src/kernel/kernel.h @@ -1,16 +1,13 @@ #pragma once extern "C" { - #include "arch/i386/tty/kterm.h" - #include "pmm.h" } #include "../libc/include/string.h" -#include "multiboot.h" +#include "./bootloader/multiboot.h" #include "bootcheck.h" #include "arch/i386/idt/idt.h" -#include "MMU.h" #include "io.h" #include "time.h" #include "cpu.h" diff --git a/src/kernel/MMU.cpp b/src/kernel/memory/PageDirectory.cpp similarity index 95% rename from src/kernel/MMU.cpp rename to src/kernel/memory/PageDirectory.cpp index 58b3023..ca7a6d5 100644 --- a/src/kernel/MMU.cpp +++ b/src/kernel/memory/PageDirectory.cpp @@ -1,9 +1,9 @@ -#include "MMU.h" +#include "PageDirectory.h" #include -void MMU::enable(){ +void PageDirectory::enable(){ //set each entry to not present int i; diff --git a/src/kernel/MMU.h b/src/kernel/memory/PageDirectory.h similarity index 96% rename from src/kernel/MMU.h rename to src/kernel/memory/PageDirectory.h index 69be7a3..a2863d3 100644 --- a/src/kernel/MMU.h +++ b/src/kernel/memory/PageDirectory.h @@ -18,7 +18,7 @@ struct page_table_entry{}; -class MMU { +class PageDirectory { public: void enable (); diff --git a/src/kernel/memory/PageFramAllocator.cpp b/src/kernel/memory/PageFramAllocator.cpp new file mode 100644 index 0000000..b690689 --- /dev/null +++ b/src/kernel/memory/PageFramAllocator.cpp @@ -0,0 +1 @@ +#include "PageFrameAllocator.h" diff --git a/src/kernel/memory/PageFrameAllocator.h b/src/kernel/memory/PageFrameAllocator.h new file mode 100644 index 0000000..56d4871 --- /dev/null +++ b/src/kernel/memory/PageFrameAllocator.h @@ -0,0 +1,8 @@ +#pragma once +#include + + + +extern void *kernel_begin; +extern void *kernel_end; + diff --git a/src/kernel/arch/i386/MMU/SlabAllocator.h b/src/kernel/memory/SlabAllocator.h similarity index 100% rename from src/kernel/arch/i386/MMU/SlabAllocator.h rename to src/kernel/memory/SlabAllocator.h diff --git a/src/kernel/pmm.cpp b/src/kernel/pmm.cpp deleted file mode 100644 index 4b9d66f..0000000 --- a/src/kernel/pmm.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "pmm.h" diff --git a/src/kernel/pmm.h b/src/kernel/pmm.h deleted file mode 100644 index 7f3265c..0000000 --- a/src/kernel/pmm.h +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once -#include -// Lets assume we have 2 gigabytes of memory -// NOTE: We should really detect how much memory we have -#define KiloByte 1024 // bytes -#define MegaByte 1048576 // bytes -#define GigaByte 1073741824 // bytes -#define MemorySize 2147483648 // bytes - -const uint32_t bitmapSize = MemorySize / 8; - -extern void *kernel_begin; -extern void *kernel_end; -struct __attribute__((packed)) PMSegment { - void* address; - uint32_t size; - PMSegment* Next; -}; - - -static PMSegment pmStart; -static uint32_t AvailablePhysicalMemory; -static uint32_t AllocatedMemorySize; - -void initPhysicalMemoryManager(){ - AvailablePhysicalMemory = MemorySize; - AllocatedMemorySize = 0; - - // Map the kernel - PMSegment KernelSegment = PMSegment(); - printf("end of kernel: 0x%x\n", &kernel_end); - printf("start of kernel: 0x%x\n", &kernel_begin); - printf("pointer to kernel: 0x%x\n", &KernelSegment); - - pmStart = KernelSegment; - KernelSegment.address = kernel_begin; - KernelSegment.size = &kernel_end - &kernel_begin; - AllocatedMemorySize += KernelSegment.size; - KernelSegment.Next = 0; - - // make sure We allocate space for ourselves - /*PMSegment start = PMSegment(); - start.address = KernelSegment.address + KernelSegment.size ; - start.size = (MemorySize / sizeof(PMSegment) ) + sizeof (uint32_t) * 2; - */ - - //KernelSegment.Next = &start; - //AllocatedMemorySize += start.size; -} - -void printMemorySegments() -{ - printf("Memory Segments:\n"); - printf( "Start Segment: [addr: 0x%x, size: 0x%x, Next: 0x%x]\n" ,pmStart.address, pmStart.size, pmStart.Next); - printf("----------------------------\n"); -} - - -void pmem_free (void* address){ - - PMSegment* before = 0; - PMSegment* current = &pmStart; - - printf("Address of pmStart : 0x%x\n", pmStart); - printf("Looking for segment with address: 0x%x \n", address ); - printf("Address of pmStart(a.k.a current) : 0x%x \n", current); - while( current ) - { - //printf("address of current segment 0x%x\n", current->address ); - if ( current->address == address ) { - // this is the address we want to free - printf("Segment found!! Segment address: 0x%x \n", current->address); - if ( current->Next && before ){ - before->Next = current->Next; - }else{ - before->Next = 0; - } - // TODO: Clean memory [ Something like memset to zeroes] - printf("Removing segment of size: 0x%x\n", current->size); - AllocatedMemorySize -= current->size; - break; - } - - before = current; - current = current->Next; - - } - -} - -void* pmem_alloc ( uint32_t size ){ - // Get the last segment - PMSegment* lastSegment = &pmStart; - - while (lastSegment ) { - if( lastSegment->Next == 0){ - break; - } - lastSegment = lastSegment->Next; - } - - printf("LastSegment is for address: 0x%x\n", lastSegment->address); - - - // So now we have the last segment available - PMSegment newSegment = PMSegment(); - newSegment.address = (PMSegment*)((uint32_t)lastSegment->address + lastSegment->size +1); - - printf("NewSegment for Address: 0x%x\n", newSegment.address); - - newSegment.size = size; - - lastSegment->Next = &newSegment; - - if ( AllocatedMemorySize + newSegment.size > AvailablePhysicalMemory){ - // No segment available of this size - /// ERROR!! - return 0; - } - AllocatedMemorySize += newSegment.size; - - return newSegment.address; - - -} \ No newline at end of file