diff --git a/src/kernel/arch_i386/memory.c b/src/kernel/arch_i386/memory.c index 6d1c63d..9acaba3 100644 --- a/src/kernel/arch_i386/memory.c +++ b/src/kernel/arch_i386/memory.c @@ -16,6 +16,7 @@ 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))){ + pm_map[i] |= (1 << j); return (i << 3 | j) << 12; } } @@ -92,6 +93,7 @@ void unmap(void *vaddr){ return; } uint32_t *pt = (uint32_t *)(0xffc00000 + (pd_index * 0x400)); + pt[pt_index] = 0; // uint32_t paddr = pt[pt_index]; // paddr ^= (paddr & 0xfff); // pm_free(paddr); @@ -126,23 +128,41 @@ uint32_t get_pflags(void *vaddr){ void *get_new_page(uint32_t flags){ uint32_t i = 0; uint32_t paddr = pm_alloc(); - while(get_paddr(paddr + (i * 4096))){ + while(get_paddr((void*)paddr + (i * 4096))){ i++; } - map(paddr+(i*4096), paddr, flags); + map((void *)paddr+(i*4096), (void *)paddr, flags); } void *kmalloc(uint32_t size_pgs){ - + uint32_t i = 1 << 10; //4mb/4096 (start search at 1mb line) + while(i < (1 << 20)){ + uint8_t found = 1; + for(uint32_t j = 0; j < size_pgs; j++){ + if(get_paddr((void *)((i + j) << 12))){ + found = 0; + break; + } + } + if(!found){ + i++; + continue; + } + for(uint32_t j = 0; j < size_pgs; j++){ + uint32_t flags = PT_PRESENT | PT_SYS | (PT_LINK_L * (j != 0)) | (PT_LINK_N * (j < (size_pgs - 1))); + map((void *)((i + j)<<12), (void*)pm_alloc(), flags); + } + return (void*)(i << 12); + } } void *kfree(void *vaddr){ uint32_t addr = (uint32_t)vaddr; addr &= ~0xfff; - while(get_pflags(addr)&PT_LINK_L) addr -= 0x1000; - while(get_pflags(addr)&PT_LINK_N){ - uint32_t paddr = get_paddr(addr); + while(get_pflags((void *)addr)&PT_LINK_L) addr -= 0x1000; + do{ + uint32_t paddr = get_paddr((void *)addr); pm_free(paddr); - unmap(addr); + unmap((void *)addr); addr += 0x1000; - } + }while(get_pflags((void *)addr)&PT_LINK_N); return 0; } \ No newline at end of file diff --git a/src/kernel/shared/memory.h b/src/kernel/shared/memory.h index e0aced1..b871bd4 100644 --- a/src/kernel/shared/memory.h +++ b/src/kernel/shared/memory.h @@ -14,7 +14,7 @@ #define PD_PAT 0x1000 #define PD_LINK_N 0x0200 #define PD_LINK_L 0x0400 -#define PD_ALLOC 0x0800 +#define PD_SYS 0x0800 #define PT_PRESENT 0X0001 #define PT_USER_RW 0x0002 @@ -27,7 +27,7 @@ #define PT_GLOBAL 0x0100 #define PT_LINK_N 0x0200 #define PT_LINK_L 0x0400 -#define PT_ALLOC 0x0800 +#define PT_SYS 0x0800 #define BIOS_MMAP_USABLE 1 #define BIOS_MMAP_RESERVED 2 @@ -79,4 +79,7 @@ inline void *get_cr3(){ asm volatile("mov %%cr3, %%eax;mov %0, %%eax": "=r"(cr3)); return cr3; } -int pm_init(kernel_info_t *kernel_info); \ No newline at end of file +int pm_init(kernel_info_t *kernel_info); + +void *kmalloc(uint32_t size_pgs);//allocates in multiples of 4096 +void *kfree(void *vaddr); \ No newline at end of file