Started Page Frame Allocator
This commit is contained in:
22
kernel/src/Bitmap.cpp
Normal file
22
kernel/src/Bitmap.cpp
Normal file
@@ -0,0 +1,22 @@
|
||||
#include "Bitmap.h"
|
||||
|
||||
bool Bitmap::operator[](uint64_t index){
|
||||
uint64_t byteIndex = index / 8;
|
||||
uint8_t bitIndex = index % 8;
|
||||
uint8_t bitIndexer = 0b10000000 >> bitIndex;
|
||||
if ((Buffer[byteIndex] & bitIndexer) > 0){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
|
||||
void Bitmap::Set(uint64_t index, bool value){
|
||||
uint64_t byteIndex = index / 8;
|
||||
uint8_t bitIndex = index % 8;
|
||||
uint8_t bitIndexer = 0b10000000 >> bitIndex;
|
||||
Buffer[byteIndex] &= ~bitIndexer;
|
||||
if (value) {
|
||||
Buffer[byteIndex] |= bitIndexer;
|
||||
}
|
||||
}
|
||||
11
kernel/src/Bitmap.h
Normal file
11
kernel/src/Bitmap.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
class Bitmap{
|
||||
public:
|
||||
size_t Size;
|
||||
uint8_t* Buffer;
|
||||
bool operator[](uint64_t index);
|
||||
void Set(uint64_t index, bool value);
|
||||
};
|
||||
44
kernel/src/PageFrameAllocator.cpp
Normal file
44
kernel/src/PageFrameAllocator.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
#include "PageFrameAllocator.h"
|
||||
|
||||
uint64_t freeMemory;
|
||||
uint64_t reservedMemory;
|
||||
uint64_t usedMemory;
|
||||
bool Initialized = false;
|
||||
|
||||
void PageFrameAllocator::ReadEFIMemoryMap(EFI_MEMORY_DESCRIPTOR* mMap, size_t mMapSize, size_t mMapDescSize){
|
||||
if (Initialized) return;
|
||||
|
||||
Initialized = true;
|
||||
|
||||
uint64_t mMapEntries = mMapSize / mMapDescSize;
|
||||
|
||||
void* largestFreeMemSeg = NULL;
|
||||
size_t largestFreeMemSegSize = 0
|
||||
|
||||
for (int i = 0; i < mMapEntries; i++){
|
||||
EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)mMap + (i * mMapDescSize));
|
||||
if (desc->type == 7){
|
||||
if (desc -> numPages * 4096 > largestFreeMemSegSize); {
|
||||
largestFreeMemSeg = desc-> physAddr;
|
||||
largestFreeMemSegSize = desc -> numPages * 4096;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t memorySize = GetMemorySize(mMap, mMapEntries, mMapDescSize)
|
||||
freeMemory = memorySize;
|
||||
uint64_t bitmap = memorySize / 4096 / 8 + 1
|
||||
|
||||
InitBitmap(bitmapSize, largestFreeMemSeg)
|
||||
|
||||
//lock pages of bitmap
|
||||
//reserve pages of unsable/reserverd memory
|
||||
}
|
||||
|
||||
void PageFrameAllocator::InitBitmap(size_t bitmap, void* bufferAddress){
|
||||
PageBitmap.Size = bitmapSize;
|
||||
PageBitmap.Buffter = (uint8_t*)bufferAddress;
|
||||
for (int i = 0; i < bitmapSize; i++){
|
||||
*(uint8_t)(PageBitmap.Buffer + t) = 0;
|
||||
}
|
||||
}
|
||||
14
kernel/src/PageFrameAllocator.h
Normal file
14
kernel/src/PageFrameAllocator.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
#include "efiMemory.h"
|
||||
#include <stdint.h>
|
||||
#include "Bitmap.h"
|
||||
#include "memory.h"
|
||||
|
||||
class pageFrameAllocator {
|
||||
public:
|
||||
void ReadEFIMemoryMap(EFI_MEMORY_DESCRIPTOR* mMap, size_t mMapSize, size_t mMapDescSize);
|
||||
|
||||
private:
|
||||
void InitBitmap(size_t bitmap, void* bufferAddress);
|
||||
}
|
||||
@@ -3,12 +3,13 @@
|
||||
#include "BasicRenderer.h"
|
||||
#include "cstr.h"
|
||||
#include "efiMemory.h"
|
||||
|
||||
#include "memory.h"
|
||||
#include "Bitmap.h"
|
||||
|
||||
struct BootInfo {
|
||||
Framebuffer* framebuffer;
|
||||
PSF1_FONT* psf1_Font;
|
||||
void* mMap;
|
||||
EFI_MEMORY_DESCRIPTOR* mMap;
|
||||
uint64_t mMapSize;
|
||||
uint64_t mMapDescriptorSize;
|
||||
};
|
||||
@@ -18,20 +19,25 @@ struct BootInfo {
|
||||
extern "C" void __stack_chk_fail(void) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t testBuffer[20];
|
||||
extern "C" void _start(BootInfo* bootInfo) {
|
||||
BasicRenderer newRenderer = BasicRenderer(bootInfo->framebuffer, bootInfo->psf1_Font);
|
||||
|
||||
// display information of memory map
|
||||
uint64_t mMapEntries = bootInfo->mMapSize / bootInfo->mMapDescriptorSize;
|
||||
for (int i = 0; i < mMapEntries; i++) {
|
||||
EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)bootInfo->mMap + (i * bootInfo->mMapDescriptorSize));
|
||||
newRenderer.Print(0xFFFFFFFF, EFI_MEMORY_TYPE_STRINGS[desc->type]);
|
||||
newRenderer.Print(0xFFFFFFFF, " ");
|
||||
newRenderer.Print(0xFFFF00FF, to_string(desc->numPages * 4096 / 1024));
|
||||
newRenderer.Print(0xFFFF00FF, " KB");
|
||||
newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18};
|
||||
}
|
||||
|
||||
|
||||
//newRenderer.Print(0xFFFFFFFF, to_string(GetMemorySize(bootInfo->mMap, mMapEntries, bootInfo ->mMapDescriptorSize)));
|
||||
|
||||
|
||||
// for (int i = 0; i < mMapEntries; i++) {
|
||||
// EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)bootInfo ->mMap (i * bootinfo->mMapDescriptorSize));
|
||||
// newRenderer.Print(0xFFFFFFFF, EFI_MEMORY_TYPE_STRINGS[desc->type]);
|
||||
// newRenderer.Print(0xFFFFFFFF, " ");
|
||||
// newRenderer.Print(0xFFFF00FF, to_string(desc->numPages * 4096 / 1024));
|
||||
// newRenderer.Print(0xFFFF00FF, " KB");
|
||||
// newRenderer.cursorPosition = {0, newRenderer.cursorPosition.y + 18};
|
||||
// }
|
||||
|
||||
return;
|
||||
}
|
||||
17
kernel/src/memory.cpp
Normal file
17
kernel/src/memory.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
#include "memory.h"
|
||||
|
||||
uint64_t GetMemorySize(EFI_MEMORY_DESCRIPTOR* mMap, uint64_t mMapEntries, uint64_t mMapDescriptorSize){
|
||||
|
||||
static uint64_t memorySizeBytes = 0;
|
||||
if (memorySizeBytes > 0) return memorySizeBytes;
|
||||
|
||||
for (int i = 0; i < mMapEntries; i++){
|
||||
EFI_MEMORY_DESCRIPTOR* desc = (EFI_MEMORY_DESCRIPTOR*)((uint64_t)mMap + (i * mMapDescriptorSize));
|
||||
memorySizeBytes += desc->numPages * 4096;
|
||||
}
|
||||
|
||||
|
||||
return memorySizeBytes;
|
||||
|
||||
|
||||
}
|
||||
6
kernel/src/memory.h
Normal file
6
kernel/src/memory.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include "efiMemory.h"
|
||||
|
||||
uint64_t GetMemorySize(EFI_MEMORY_DESCRIPTOR* mMap, uint64_t mMapEntries, uint64_t mMapDescSize);
|
||||
Reference in New Issue
Block a user