From cfdb33fc7750707911a6d4ef6a698af05d4f2698 Mon Sep 17 00:00:00 2001 From: notsomeidiot123 Date: Wed, 30 Oct 2024 13:39:33 -0400 Subject: [PATCH] Added or completed: map(), unmap() pm_reserve(), pm_alloc(), pm_free(), pm_init(), get_paddr() --- .gitignore | 3 +- src/kernel/arch_i386/memory.c | 85 +++++++++++++++++++++++++++++++++-- src/kernel/drivers/serial.c | 9 ++++ src/kernel/shared/kstdlib.h | 6 ++- src/kernel/shared/memory.h | 1 + 5 files changed, 97 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 6a4e642..c210e0b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ diskwrite *.elf *.dump intlog.* -*.img \ No newline at end of file +*.img +.gitignore \ No newline at end of file diff --git a/src/kernel/arch_i386/memory.c b/src/kernel/arch_i386/memory.c index 4a89f8b..9f79f13 100644 --- a/src/kernel/arch_i386/memory.c +++ b/src/kernel/arch_i386/memory.c @@ -1,12 +1,58 @@ #include #include "../shared/memory.h" #include "../shared/kstdlib.h" -uint8_t pm_map[0x20000]; -int pm_alloc(){ - +#define mmap_count 0x200000 + +uint8_t pm_map[mmap_count]; + +uint32_t total_memory; +uint32_t total_memory_usable; +uint32_t last_allocated; + + +uint32_t pm_alloc(){ + for(uint32_t i = 0; i < mmap_count; i++){ + for(int j = 0; j < 8; j++){ + if(!(pm_map[i] & (1 << j))){ + return (i << 3 | j) << 12; + } + } + } } +void pm_free(uint32_t address){ + pm_map[address >> 15] &= ~(1 << ((address>>12) & 7)); +} +void pm_reserve(uint32_t address){ + pm_map[address >> 15] |= 1 << ((address>>12) & 7); +} + int pm_init(kernel_info_t *kernel_info){ + mmap_entry_t *mmap = (mmap_entry_t*)(kernel_info->mmap_ptr); + // printf("mmap count: %d", kernel_info->mmap_entry_count); + for(uint32_t i = 0; i < mmap_count; i++){ + pm_map[i] = 0; + } + for(uint32_t i = 0; i < kernel_info->mmap_entry_count; i++){ + for(uint32_t j = 0; j < (mmap[i].entry_length >> 12); j++){ + // printf("j = %d\nIndex:%x\n", j, (mmap[i].entry_base >> 12) + (j & 3)); + if(mmap[i].type != BIOS_MMAP_USABLE){ + pm_map[(mmap[i].entry_base >> 12) + (j >> 3)] |= 1 << (j & 7); + } + else{ + // uint8_t tmp = pm_map[(mmap[i].entry_base >> 12 ) + (j >> 3)]; + // tmp &= ~(1 << (j & 3)); + pm_map[(mmap[i].entry_base >> 12) + (j >> 3)] &= ~(1 << (j & 7)); + } + // if(j % 8 == 7){ + // printf("%d, %x, %d\n", j >> 3, pm_map[(mmap[i].entry_base >> 12 ) + (j >> 3)], mmap[i].type); + // } + } + + } + for(uint32_t i = 0; i < 512; i++){ + pm_reserve(i * 4096); + } } void map(void *vaddr, void *paddr, uint32_t flags){ @@ -15,6 +61,37 @@ void map(void *vaddr, void *paddr, uint32_t flags){ uint32_t *pd = (uint32_t*)0xfffff000; if(!pd[pd_index]){ - pd[pd_index] = pm_alloc(); + pd[pd_index] = pm_alloc() | 1; } + uint32_t *pt = (uint32_t *)(0xffc00000 + (pd_index * 0x400)); + pt[pt_index] = (uint32_t)paddr | flags; + asm volatile("invlpg (%0) " : : "b"(vaddr) : "memory"); } +void unmap(void *vaddr){ + uint32_t pd_index = (uint32_t)vaddr >> 22; + uint32_t pt_index = (uint32_t)vaddr >> 12 & 0x3ff; + + uint32_t *pd = (uint32_t *)0xfffff000; + if(!pd[pd_index]){ + return; + } + uint32_t *pt = (uint32_t *)(0xffc00000 + (pd_index * 0x400)); + uint32_t paddr = pt[pt_index]; + paddr ^= (paddr & 0xfff); + pm_free(paddr); + asm volatile("invlpg (%0) " : : "b"(vaddr) : "memory"); +} +void map_4mb(void *vaddr, void *paddr, uint32_t flags){ + //just wanted to get the prototype out +} +uint32_t get_paddr(void *addr){ + uint32_t vaddr = (uint32_t)addr; + uint32_t pd_index = vaddr >> 22; + uint32_t pt_index = vaddr >> 12 & 0x3ff; + uint32_t *pd = (uint32_t *)0xfffff000; + if(!pd[pd_index]){ + return 0; + } + uint32_t *pt = (uint32_t *)(0xffc00000 + (0x400 * pd_index)); + return pt[pt_index]; +} \ No newline at end of file diff --git a/src/kernel/drivers/serial.c b/src/kernel/drivers/serial.c index c67ff1b..c2d12d5 100644 --- a/src/kernel/drivers/serial.c +++ b/src/kernel/drivers/serial.c @@ -57,6 +57,15 @@ void printf(char *string, ...){ itoa(num, numb, 10); debug_puts(numb); continue; + case 'x': + // debug_puts(":3"); + string += 2; + int32_t hex = va_arg(vars, int32_t); + char hnumb[12]; + itoa(hex, hnumb, 16); + strpad(hnumb, '0', 8); + debug_puts(hnumb); + continue; } } outb(com_ports[0], *string); diff --git a/src/kernel/shared/kstdlib.h b/src/kernel/shared/kstdlib.h index b2bb6a1..add36d6 100644 --- a/src/kernel/shared/kstdlib.h +++ b/src/kernel/shared/kstdlib.h @@ -1,6 +1,8 @@ -#include "memory.h" +#pragma once +// #include "memory.h" +#include "../drivers/serial.h" typedef struct kernel_info{ - memory_map_entry *mmap_ptr; + void *mmap_ptr; uint16_t mmap_entry_count; uint8_t padding; uint8_t pixel_depth; diff --git a/src/kernel/shared/memory.h b/src/kernel/shared/memory.h index e1cef09..0c768cb 100644 --- a/src/kernel/shared/memory.h +++ b/src/kernel/shared/memory.h @@ -1,5 +1,6 @@ #pragma once #include +#include "kstdlib.h" #define PD_PRESENT 0x0001 #define PD_USER_RW 0x0002