diff --git a/OVMFbin/OVMF_VARS-pure-efi.fd b/OVMFbin/OVMF_VARS-pure-efi.fd index 21c2b99..d40d20e 100644 Binary files a/OVMFbin/OVMF_VARS-pure-efi.fd and b/OVMFbin/OVMF_VARS-pure-efi.fd differ diff --git a/kernel/bin/CustomOS.img b/kernel/bin/CustomOS.img index cf75e47..4cbb54c 100644 Binary files a/kernel/bin/CustomOS.img and b/kernel/bin/CustomOS.img differ diff --git a/kernel/bin/kernel.elf b/kernel/bin/kernel.elf index 4c57006..9ec57c4 100755 Binary files a/kernel/bin/kernel.elf and b/kernel/bin/kernel.elf differ diff --git a/kernel/lib/BasicRenderer.o b/kernel/lib/BasicRenderer.o index 9b5879e..07584e0 100644 Binary files a/kernel/lib/BasicRenderer.o and b/kernel/lib/BasicRenderer.o differ diff --git a/kernel/lib/kernel.o b/kernel/lib/kernel.o index cafe99c..c49a104 100644 Binary files a/kernel/lib/kernel.o and b/kernel/lib/kernel.o differ diff --git a/kernel/lib/paging/PageFrameAllocator.o b/kernel/lib/paging/PageFrameAllocator.o new file mode 100644 index 0000000..c0e72b0 Binary files /dev/null and b/kernel/lib/paging/PageFrameAllocator.o differ diff --git a/kernel/lib/paging/PageMapIndexer.o b/kernel/lib/paging/PageMapIndexer.o new file mode 100644 index 0000000..04d5596 Binary files /dev/null and b/kernel/lib/paging/PageMapIndexer.o differ diff --git a/kernel/src/BasicRenderer.cpp b/kernel/src/BasicRenderer.cpp index 62dec2e..0b31cbd 100644 --- a/kernel/src/BasicRenderer.cpp +++ b/kernel/src/BasicRenderer.cpp @@ -3,17 +3,18 @@ BasicRenderer::BasicRenderer(Framebuffer* framebuffer, PSF1_FONT* psf1_Font) { targetFramebuffer = framebuffer; PSF1_Font = psf1_Font; + Colour = 0xFFFFFFFF; cursorPosition = {0,0}; } -void BasicRenderer::PutChar(unsigned int colour, char chr, unsigned int xOff, unsigned int yOff) { +void BasicRenderer::PutChar(char chr, unsigned int xOff, unsigned int yOff) { unsigned int* pixPtr = (unsigned int*)targetFramebuffer->BaseAddress; char* fontPtr = (char*)PSF1_Font->glyphBuffer + (chr * PSF1_Font->psf1_Header->charsize); for (unsigned long y = yOff; y < yOff + 18; y++) { for (unsigned long x = xOff; x < xOff+8; x++) { if ((*fontPtr & (0b10000000 >> (x - xOff))) > 0) { - *(unsigned int*)(pixPtr + x + (y * targetFramebuffer->PixelsPerScanline)) = colour; + *(unsigned int*)(pixPtr + x + (y * targetFramebuffer->PixelsPerScanline)) = Colour; } } @@ -22,12 +23,12 @@ void BasicRenderer::PutChar(unsigned int colour, char chr, unsigned int xOff, un } } -void BasicRenderer::Print(unsigned int colour, const char* str) { +void BasicRenderer::Print(const char* str) { unsigned int x = 0; char* chr = (char*)str; while (*chr != 0) { - PutChar(colour, *chr, cursorPosition.x, cursorPosition.y); + PutChar(*chr, cursorPosition.x, cursorPosition.y); cursorPosition.x+=8; if (cursorPosition.x + 8 > targetFramebuffer->Width) { diff --git a/kernel/src/BasicRenderer.h b/kernel/src/BasicRenderer.h index d5e90eb..e2c8dd3 100644 --- a/kernel/src/BasicRenderer.h +++ b/kernel/src/BasicRenderer.h @@ -9,6 +9,7 @@ class BasicRenderer { Point cursorPosition; Framebuffer* targetFramebuffer; PSF1_FONT* PSF1_Font; - void Print(unsigned int colour, const char* str); - void PutChar(unsigned int colour, char chr, unsigned int xOff, unsigned int yOff); + unsigned int Colour; + void Print(const char* str); + void PutChar(char chr, unsigned int xOff, unsigned int yOff); }; \ No newline at end of file diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index 2bc3832..10b1506 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -5,7 +5,8 @@ #include "efiMemory.h" #include "memory.h" #include "Bitmap.h" -#include "PageFrameAllocator.h" +#include "paging/PageFrameAllocator.h" +#include "paging/PageMapIndexer.h" struct BootInfo { Framebuffer* framebuffer; @@ -40,19 +41,15 @@ extern "C" void _start(BootInfo* bootInfo) { newAllocator.LockPages(&_KernelStart, kernelPages); - // print out ram info - newRenderer.Print(0xFFFFFFFF, "Free RAM: "); - newRenderer.Print(0xFF00FFFF, to_string(newAllocator.GetFreeRAM() / 1024)); - newRenderer.Print(0xFF00FFFF, " KB"); - newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; - newRenderer.Print(0xFFFFFFFF, "Used RAM: "); - newRenderer.Print(0xFF00FFFF, to_string(newAllocator.GetUsedRAM() / 1024)); - newRenderer.Print(0xFF00FFFF, " KB"); - newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; - newRenderer.Print(0xFFFFFFFF, "Reserved RAM: "); - newRenderer.Print(0xFF00FFFF, to_string(newAllocator.GetReservedRAM() / 1024)); - newRenderer.Print(0xFF00FFFF, " KB"); - newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + PageMapIndexer pageIndexer = PageMapIndexer(0x1000); + + newRenderer.Print(to_string(pageIndexer.P_i)); + newRenderer.Print(" - "); + newRenderer.Print(to_string(pageIndexer.PT_i)); + newRenderer.Print(" - "); + newRenderer.Print(to_string(pageIndexer.PD_i)); + newRenderer.Print(" - "); + newRenderer.Print(to_string(pageIndexer.PDP_i)); return; } \ No newline at end of file diff --git a/kernel/src/PageFrameAllocator.cpp b/kernel/src/paging/PageFrameAllocator.cpp similarity index 100% rename from kernel/src/PageFrameAllocator.cpp rename to kernel/src/paging/PageFrameAllocator.cpp diff --git a/kernel/src/PageFrameAllocator.h b/kernel/src/paging/PageFrameAllocator.h similarity index 90% rename from kernel/src/PageFrameAllocator.h rename to kernel/src/paging/PageFrameAllocator.h index 41fe2b0..7551b7a 100644 --- a/kernel/src/PageFrameAllocator.h +++ b/kernel/src/paging/PageFrameAllocator.h @@ -1,9 +1,9 @@ #pragma once -#include "efiMemory.h" +#include "../efiMemory.h" #include -#include "Bitmap.h" -#include "memory.h" +#include "../Bitmap.h" +#include "../memory.h" class PageFrameAllocator { public: diff --git a/kernel/src/paging/PageMapIndexer.cpp b/kernel/src/paging/PageMapIndexer.cpp new file mode 100644 index 0000000..92b6074 --- /dev/null +++ b/kernel/src/paging/PageMapIndexer.cpp @@ -0,0 +1,12 @@ +#include "PageMapIndexer.h" + +PageMapIndexer::PageMapIndexer(uint64_t virtualAddress) { + virtualAddress >>= 12; // 4096 aligned + P_i = virtualAddress & 0x1FF; + virtualAddress >>= 9; + PT_i = virtualAddress & 0x1FF; + virtualAddress >>= 9; + PD_i = virtualAddress & 0x1FF; + virtualAddress >>= 9; + PDP_i = virtualAddress & 0x1FF; +} \ No newline at end of file diff --git a/kernel/src/paging/PageMapIndexer.h b/kernel/src/paging/PageMapIndexer.h new file mode 100644 index 0000000..bd2e0ad --- /dev/null +++ b/kernel/src/paging/PageMapIndexer.h @@ -0,0 +1,11 @@ +#pragma once +#include + +class PageMapIndexer { + public: + PageMapIndexer(uint64_t virtualAddress); + uint64_t PDP_i; + uint64_t PD_i; + uint64_t PT_i; + uint64_t P_i; +}; \ No newline at end of file diff --git a/kernel/src/paging/paging.h b/kernel/src/paging/paging.h new file mode 100644 index 0000000..850d211 --- /dev/null +++ b/kernel/src/paging/paging.h @@ -0,0 +1,21 @@ +#pragma once +#include + +struct PageDirectoryEntry { + bool Present : 1; // memory exists and can be accessed + bool ReadWrite : 1; // + bool UserSuper : 1; // memory can only be accessed by supervisor or both user and supervisor + bool WriteThrough : 1; // + bool CacheDisabled : 1; // + bool Accessed : 1; // set when cpu accesses page + bool ignore0 : 1; // + bool LargerPages : 1; // + bool ignore1 : 1; // + uint8_t Available : 3; // + uint64_t Address : 52; // physical address + +}; + +struct PageTable { + PageDirectoryEntry entries[512]; +}__attribute__((aligned(0x1000))); \ No newline at end of file