mirror of
https://github.com/BoredDevNL/BoredOS.git
synced 2026-05-15 10:48:38 +00:00
Memory patch
This commit is contained in:
parent
6ee8582391
commit
c3bb963d63
18 changed files with 57 additions and 15 deletions
BIN
brewos.iso
BIN
brewos.iso
Binary file not shown.
BIN
build/about.o
BIN
build/about.o
Binary file not shown.
BIN
build/brewos.elf
BIN
build/brewos.elf
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/cmd.o
BIN
build/cmd.o
Binary file not shown.
Binary file not shown.
BIN
build/editor.o
BIN
build/editor.o
Binary file not shown.
BIN
build/explorer.o
BIN
build/explorer.o
Binary file not shown.
BIN
build/main.o
BIN
build/main.o
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/notepad.o
BIN
build/notepad.o
Binary file not shown.
BIN
build/ps2.o
BIN
build/ps2.o
Binary file not shown.
Binary file not shown.
|
|
@ -19,9 +19,16 @@ static volatile struct limine_framebuffer_request framebuffer_request = {
|
||||||
.revision = 1
|
.revision = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
__attribute__((used, section(".requests")))
|
||||||
|
static volatile struct limine_memmap_request memmap_request = {
|
||||||
|
.id = LIMINE_MEMMAP_REQUEST,
|
||||||
|
.revision = 0
|
||||||
|
};
|
||||||
|
|
||||||
__attribute__((used, section(".requests_start")))
|
__attribute__((used, section(".requests_start")))
|
||||||
static volatile struct limine_request *const requests_start_marker[] = {
|
static volatile struct limine_request *const requests_start_marker[] = {
|
||||||
(struct limine_request *)&framebuffer_request,
|
(struct limine_request *)&framebuffer_request,
|
||||||
|
(struct limine_request *)&memmap_request,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -60,8 +67,28 @@ void kmain(void) {
|
||||||
// Load IDT and Enable Interrupts
|
// Load IDT and Enable Interrupts
|
||||||
idt_load();
|
idt_load();
|
||||||
|
|
||||||
// 2.5 Memory Manager Init
|
// 2.5 Memory Manager Init - Calculate available RAM from Limine
|
||||||
memory_manager_init();
|
size_t total_usable_memory = 0;
|
||||||
|
if (memmap_request.response != NULL) {
|
||||||
|
for (uint64_t i = 0; i < memmap_request.response->entry_count; i++) {
|
||||||
|
struct limine_memmap_entry *entry = memmap_request.response->entries[i];
|
||||||
|
|
||||||
|
// Count usable memory regions
|
||||||
|
if (entry->type == LIMINE_MEMMAP_USABLE) {
|
||||||
|
total_usable_memory += entry->length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize memory manager with available memory (cap at 2GB for practical reasons)
|
||||||
|
size_t pool_size = total_usable_memory > (2 * 1024 * 1024 * 1024) ?
|
||||||
|
(2 * 1024 * 1024 * 1024) : total_usable_memory;
|
||||||
|
|
||||||
|
if (pool_size == 0) {
|
||||||
|
pool_size = 512 * 1024 * 1024; // Fallback to 512MB if detection fails
|
||||||
|
}
|
||||||
|
|
||||||
|
memory_manager_init_with_size(pool_size);
|
||||||
|
|
||||||
// 3. PS/2 Init (Mouse/Keyboard)
|
// 3. PS/2 Init (Mouse/Keyboard)
|
||||||
asm("cli");
|
asm("cli");
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,8 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
// --- Internal State ---
|
// --- Internal State ---
|
||||||
static uint8_t memory_pool[MEMORY_POOL_SIZE] __attribute__((aligned(4096)));
|
static uint8_t *memory_pool = NULL; // Dynamically allocated
|
||||||
|
static size_t memory_pool_size = DEFAULT_POOL_SIZE; // Track actual pool size
|
||||||
static MemBlock block_list[MAX_ALLOCATIONS];
|
static MemBlock block_list[MAX_ALLOCATIONS];
|
||||||
static int block_count = 0;
|
static int block_count = 0;
|
||||||
static size_t total_allocated = 0;
|
static size_t total_allocated = 0;
|
||||||
|
|
@ -45,7 +46,7 @@ static uint32_t get_timestamp(void) {
|
||||||
static void* find_free_space(size_t size) {
|
static void* find_free_space(size_t size) {
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
|
|
||||||
while (offset + size <= MEMORY_POOL_SIZE) {
|
while (offset + size <= memory_pool_size) {
|
||||||
bool space_free = true;
|
bool space_free = true;
|
||||||
|
|
||||||
// Check if this range is free
|
// Check if this range is free
|
||||||
|
|
@ -95,7 +96,7 @@ static size_t calculate_fragmentation(void) {
|
||||||
|
|
||||||
// Count gaps between allocated blocks
|
// Count gaps between allocated blocks
|
||||||
size_t total_gaps = 0;
|
size_t total_gaps = 0;
|
||||||
void *pool_end = (uint8_t *)memory_pool + MEMORY_POOL_SIZE;
|
void *pool_end = (uint8_t *)memory_pool + memory_pool_size;
|
||||||
|
|
||||||
void *current_end = memory_pool;
|
void *current_end = memory_pool;
|
||||||
|
|
||||||
|
|
@ -115,9 +116,18 @@ static size_t calculate_fragmentation(void) {
|
||||||
|
|
||||||
// --- Public API ---
|
// --- Public API ---
|
||||||
|
|
||||||
void memory_manager_init(void) {
|
void memory_manager_init_with_size(size_t pool_size) {
|
||||||
if (initialized) return;
|
if (initialized) return;
|
||||||
|
|
||||||
|
memory_pool_size = pool_size;
|
||||||
|
|
||||||
|
// Initialize memory pool - in a real kernel, this would be passed a physical address
|
||||||
|
// For now, we use a simple tracking mechanism where allocations are tracked virtually
|
||||||
|
// The caller is responsible for ensuring the pool_size is valid
|
||||||
|
if (memory_pool == NULL) {
|
||||||
|
memory_pool = (uint8_t *)0x100000000; // Start from 4GB boundary as virtual tracking
|
||||||
|
}
|
||||||
|
|
||||||
// Clear metadata
|
// Clear metadata
|
||||||
mem_memset(block_list, 0, sizeof(block_list));
|
mem_memset(block_list, 0, sizeof(block_list));
|
||||||
block_count = 0;
|
block_count = 0;
|
||||||
|
|
@ -127,7 +137,7 @@ void memory_manager_init(void) {
|
||||||
|
|
||||||
// Create initial free block representing entire pool
|
// Create initial free block representing entire pool
|
||||||
block_list[0].address = memory_pool;
|
block_list[0].address = memory_pool;
|
||||||
block_list[0].size = MEMORY_POOL_SIZE;
|
block_list[0].size = memory_pool_size;
|
||||||
block_list[0].allocated = false;
|
block_list[0].allocated = false;
|
||||||
block_list[0].allocation_id = 0;
|
block_list[0].allocation_id = 0;
|
||||||
block_count = 1;
|
block_count = 1;
|
||||||
|
|
@ -135,17 +145,21 @@ void memory_manager_init(void) {
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void memory_manager_init(void) {
|
||||||
|
memory_manager_init_with_size(DEFAULT_POOL_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
void* kmalloc(size_t size) {
|
void* kmalloc(size_t size) {
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
memory_manager_init();
|
memory_manager_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size == 0 || size > MEMORY_POOL_SIZE) {
|
if (size == 0 || size > memory_pool_size) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we can allocate
|
// Check if we can allocate
|
||||||
if (total_allocated + size > MEMORY_POOL_SIZE) {
|
if (total_allocated + size > memory_pool_size) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -245,13 +259,13 @@ void* krealloc(void *ptr, size_t new_size) {
|
||||||
MemStats memory_get_stats(void) {
|
MemStats memory_get_stats(void) {
|
||||||
MemStats stats;
|
MemStats stats;
|
||||||
|
|
||||||
stats.total_memory = MEMORY_POOL_SIZE;
|
stats.total_memory = memory_pool_size;
|
||||||
stats.used_memory = total_allocated;
|
stats.used_memory = total_allocated;
|
||||||
stats.available_memory = MEMORY_POOL_SIZE - total_allocated;
|
stats.available_memory = memory_pool_size - total_allocated;
|
||||||
stats.allocated_blocks = 0;
|
stats.allocated_blocks = 0;
|
||||||
stats.free_blocks = 0;
|
stats.free_blocks = 0;
|
||||||
stats.largest_free_block = 0;
|
stats.largest_free_block = 0;
|
||||||
stats.smallest_free_block = MEMORY_POOL_SIZE;
|
stats.smallest_free_block = memory_pool_size;
|
||||||
stats.peak_memory_used = peak_allocated;
|
stats.peak_memory_used = peak_allocated;
|
||||||
|
|
||||||
// Count and analyze blocks
|
// Count and analyze blocks
|
||||||
|
|
@ -417,7 +431,7 @@ bool memory_is_valid_ptr(void *ptr) {
|
||||||
if (ptr == NULL) return false;
|
if (ptr == NULL) return false;
|
||||||
|
|
||||||
void *pool_start = memory_pool;
|
void *pool_start = memory_pool;
|
||||||
void *pool_end = (uint8_t *)memory_pool + MEMORY_POOL_SIZE;
|
void *pool_end = (uint8_t *)memory_pool + memory_pool_size;
|
||||||
|
|
||||||
if (ptr < pool_start || ptr >= pool_end) {
|
if (ptr < pool_start || ptr >= pool_end) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
// Memory Manager Configuration
|
// Memory Manager Configuration
|
||||||
#define MEMORY_POOL_SIZE (4 * 1024 * 1024) // 4MB pool
|
#define DEFAULT_POOL_SIZE (512 * 1024 * 1024) // 512MB default (can be overridden)
|
||||||
#define MAX_ALLOCATIONS 1024
|
#define MAX_ALLOCATIONS 4096 // Increased for larger pools
|
||||||
#define MAX_FRAGMENTATION_SLOTS 2048
|
#define MAX_FRAGMENTATION_SLOTS 2048
|
||||||
|
|
||||||
// Allocation block metadata
|
// Allocation block metadata
|
||||||
|
|
@ -34,6 +34,7 @@ typedef struct {
|
||||||
|
|
||||||
// Public API
|
// Public API
|
||||||
void memory_manager_init(void);
|
void memory_manager_init(void);
|
||||||
|
void memory_manager_init_with_size(size_t pool_size);
|
||||||
|
|
||||||
// Allocation/Deallocation
|
// Allocation/Deallocation
|
||||||
void* kmalloc(size_t size);
|
void* kmalloc(size_t size);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue