starting work on page tables

This commit is contained in:
2026-01-28 19:34:59 +11:00
parent 3b8bd6f0da
commit 823b13234e
15 changed files with 66 additions and 23 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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) {

View File

@@ -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);
};

View File

@@ -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;
}

View File

@@ -1,9 +1,9 @@
#pragma once
#include "efiMemory.h"
#include "../efiMemory.h"
#include <stdint.h>
#include "Bitmap.h"
#include "memory.h"
#include "../Bitmap.h"
#include "../memory.h"
class PageFrameAllocator {
public:

View File

@@ -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;
}

View File

@@ -0,0 +1,11 @@
#pragma once
#include <stdint.h>
class PageMapIndexer {
public:
PageMapIndexer(uint64_t virtualAddress);
uint64_t PDP_i;
uint64_t PD_i;
uint64_t PT_i;
uint64_t P_i;
};

View File

@@ -0,0 +1,21 @@
#pragma once
#include <stdint.h>
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)));