diff --git a/OVMFbin/OVMF_VARS-pure-efi.fd b/OVMFbin/OVMF_VARS-pure-efi.fd index e1e2fa3..f7a0a6b 100644 Binary files a/OVMFbin/OVMF_VARS-pure-efi.fd and b/OVMFbin/OVMF_VARS-pure-efi.fd differ diff --git a/kernel/Makefile b/kernel/Makefile index aade3a8..63d9893 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -59,4 +59,4 @@ buildimg: mcopy -i $(BUILDDIR)/$(OSNAME).img $(BUILDDIR)/zap-light18.psf :: run: - qemu-system-x86_64 -drive file=$(BUILDDIR)/$(OSNAME).img -m 64M -cpu qemu64 -drive if=pflash,format=raw,unit=0,file="$(OVMFDIR)/OVMF_CODE-pure-efi.fd",readonly=on -drive if=pflash,format=raw,unit=1,file="$(OVMFDIR)/OVMF_VARS-pure-efi.fd" -net none + qemu-system-x86_64 -drive file=$(BUILDDIR)/$(OSNAME).img -m 256M -cpu qemu64 -drive if=pflash,format=raw,unit=0,file="$(OVMFDIR)/OVMF_CODE-pure-efi.fd",readonly=on -drive if=pflash,format=raw,unit=1,file="$(OVMFDIR)/OVMF_VARS-pure-efi.fd" -net none diff --git a/kernel/bin/CustomOS.img b/kernel/bin/CustomOS.img index b1a0cba..0f767c5 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 0fcb592..f4eb75f 100755 Binary files a/kernel/bin/kernel.elf and b/kernel/bin/kernel.elf differ diff --git a/kernel/lib/Bitmap.o b/kernel/lib/Bitmap.o index dc62cad..dd11b57 100644 Binary files a/kernel/lib/Bitmap.o and b/kernel/lib/Bitmap.o differ diff --git a/kernel/lib/kernel.o b/kernel/lib/kernel.o index d0cd876..7cf5c3a 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 index 8e51d5b..e6f966d 100644 Binary files a/kernel/lib/paging/PageFrameAllocator.o and b/kernel/lib/paging/PageFrameAllocator.o differ diff --git a/kernel/src/Bitmap.cpp b/kernel/src/Bitmap.cpp index 2165f2f..753b6e3 100644 --- a/kernel/src/Bitmap.cpp +++ b/kernel/src/Bitmap.cpp @@ -1,6 +1,8 @@ #include "Bitmap.h" bool Bitmap::operator[](uint64_t index){ + if (index > Size * 8) return false; + uint64_t byteIndex = index / 8; uint8_t bitIndex = index % 8; uint8_t bitIndexer = 0b10000000 >> bitIndex; @@ -11,7 +13,9 @@ bool Bitmap::operator[](uint64_t index){ } -void Bitmap::Set(uint64_t index, bool value){ +bool Bitmap::Set(uint64_t index, bool value){ + if (index > Size * 8) return false; + uint64_t byteIndex = index / 8; uint8_t bitIndex = index % 8; uint8_t bitIndexer = 0b10000000 >> bitIndex; @@ -19,4 +23,6 @@ void Bitmap::Set(uint64_t index, bool value){ if (value) { Buffer[byteIndex] |= bitIndexer; } + + return true; } \ No newline at end of file diff --git a/kernel/src/Bitmap.h b/kernel/src/Bitmap.h index fc5512b..45056b9 100644 --- a/kernel/src/Bitmap.h +++ b/kernel/src/Bitmap.h @@ -7,5 +7,5 @@ class Bitmap { size_t Size; uint8_t* Buffer; bool operator[](uint64_t index); - void Set(uint64_t index, bool value); + bool Set(uint64_t index, bool value); }; \ No newline at end of file diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index d0cbcf6..e934860 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -28,8 +28,14 @@ extern uint64_t _KernelStart; extern uint64_t _KernelEnd; extern "C" void _start(BootInfo* bootInfo) { + + + BasicRenderer newRenderer = BasicRenderer(bootInfo->framebuffer, bootInfo->psf1_Font); + newRenderer.Print("Setting up memory map..."); + newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + // display information of memory map uint64_t mMapEntries = bootInfo->mMapSize / bootInfo->mMapDescriptorSize; @@ -53,14 +59,23 @@ extern "C" void _start(BootInfo* bootInfo) { uint64_t fbBase = (uint64_t)bootInfo->framebuffer->BaseAddress; uint64_t fbSize = (uint64_t)bootInfo->framebuffer->BufferSize + 0x1000; - + GlobalAllocator.LockPages((void*)fbBase, fbSize / 0x1000 + 1); for (uint64_t t = fbBase; t < fbBase + fbSize; t += 4096) { pageTableManager.MapMemory((void*)t, (void*)t); } asm("mov %0, %%cr3" :: "r" (PML4)); + memset(bootInfo->framebuffer->BaseAddress, 0, bootInfo->framebuffer->BufferSize); - newRenderer.Print("WE'RE USING THE NEW PAGE MAP!!!!"); + newRenderer.Print("Page map set up!"); + pageTableManager.MapMemory((void*)0x600000000, (void*)0x80000); + + uint64_t* test = (uint64_t*)0x600000000; + *test = 26; + + newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18}; + newRenderer.Print("this should be \"26\": "); + newRenderer.Print(to_string(*test)); return; } \ No newline at end of file diff --git a/kernel/src/paging/PageFrameAllocator.cpp b/kernel/src/paging/PageFrameAllocator.cpp index 674b377..1bf43f8 100644 --- a/kernel/src/paging/PageFrameAllocator.cpp +++ b/kernel/src/paging/PageFrameAllocator.cpp @@ -57,9 +57,10 @@ void PageFrameAllocator::FreePage(void* address) { if (PageBitmap[index] == false) return; // page is already free // free page in bitmap - PageBitmap.Set(index, false); - freeMemory += 4096; - usedMemory -= 4096; + if (PageBitmap.Set(index, false)) { + freeMemory += 4096; + usedMemory -= 4096; + } } void PageFrameAllocator::FreePages(void* address, uint64_t pageCount) { @@ -73,9 +74,10 @@ void PageFrameAllocator::LockPage(void* address) { if (PageBitmap[index] == true) return; // page is already locked // lock page in bitmap - PageBitmap.Set(index, true); - freeMemory -= 4096; - usedMemory += 4096; + if (PageBitmap.Set(index, true)) { + freeMemory -= 4096; + usedMemory += 4096; + } } void PageFrameAllocator::LockPages(void* address, uint64_t pageCount) { @@ -89,9 +91,10 @@ void PageFrameAllocator::UnreservePage(void* address) { if (PageBitmap[index] == false) return; // page is already free // free page in bitmap - PageBitmap.Set(index, false); - freeMemory += 4096; - reservedMemory -= 4096; + if (PageBitmap.Set(index, false)) { + freeMemory += 4096; + reservedMemory -= 4096; + } } void PageFrameAllocator::UnreservePages(void* address, uint64_t pageCount) { @@ -105,9 +108,10 @@ void PageFrameAllocator::ReservePage(void* address) { if (PageBitmap[index] == true) return; // page is already locked // lock page in bitmap - PageBitmap.Set(index, true); - freeMemory -= 4096; - reservedMemory += 4096; + if (PageBitmap.Set(index, true)) { + freeMemory -= 4096; + reservedMemory += 4096; + } } void PageFrameAllocator::ReservePages(void* address, uint64_t pageCount) {