kernel malloc and free (page granularity)

This commit is contained in:
notsomeidiot123 2024-11-16 15:30:27 -05:00
parent 2473d53669
commit cb06f5e198
2 changed files with 34 additions and 11 deletions

View File

@ -16,6 +16,7 @@ uint32_t pm_alloc(){
for(uint32_t i = 0; i < mmap_count; i++){ for(uint32_t i = 0; i < mmap_count; i++){
for(int j = 0; j < 8; j++){ for(int j = 0; j < 8; j++){
if(!(pm_map[i] & (1 << j))){ if(!(pm_map[i] & (1 << j))){
pm_map[i] |= (1 << j);
return (i << 3 | j) << 12; return (i << 3 | j) << 12;
} }
} }
@ -92,6 +93,7 @@ void unmap(void *vaddr){
return; return;
} }
uint32_t *pt = (uint32_t *)(0xffc00000 + (pd_index * 0x400)); uint32_t *pt = (uint32_t *)(0xffc00000 + (pd_index * 0x400));
pt[pt_index] = 0;
// uint32_t paddr = pt[pt_index]; // uint32_t paddr = pt[pt_index];
// paddr ^= (paddr & 0xfff); // paddr ^= (paddr & 0xfff);
// pm_free(paddr); // pm_free(paddr);
@ -126,23 +128,41 @@ uint32_t get_pflags(void *vaddr){
void *get_new_page(uint32_t flags){ void *get_new_page(uint32_t flags){
uint32_t i = 0; uint32_t i = 0;
uint32_t paddr = pm_alloc(); uint32_t paddr = pm_alloc();
while(get_paddr(paddr + (i * 4096))){ while(get_paddr((void*)paddr + (i * 4096))){
i++; i++;
} }
map(paddr+(i*4096), paddr, flags); map((void *)paddr+(i*4096), (void *)paddr, flags);
} }
void *kmalloc(uint32_t size_pgs){ 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){ void *kfree(void *vaddr){
uint32_t addr = (uint32_t)vaddr; uint32_t addr = (uint32_t)vaddr;
addr &= ~0xfff; addr &= ~0xfff;
while(get_pflags(addr)&PT_LINK_L) addr -= 0x1000; while(get_pflags((void *)addr)&PT_LINK_L) addr -= 0x1000;
while(get_pflags(addr)&PT_LINK_N){ do{
uint32_t paddr = get_paddr(addr); uint32_t paddr = get_paddr((void *)addr);
pm_free(paddr); pm_free(paddr);
unmap(addr); unmap((void *)addr);
addr += 0x1000; addr += 0x1000;
} }while(get_pflags((void *)addr)&PT_LINK_N);
return 0; return 0;
} }

View File

@ -14,7 +14,7 @@
#define PD_PAT 0x1000 #define PD_PAT 0x1000
#define PD_LINK_N 0x0200 #define PD_LINK_N 0x0200
#define PD_LINK_L 0x0400 #define PD_LINK_L 0x0400
#define PD_ALLOC 0x0800 #define PD_SYS 0x0800
#define PT_PRESENT 0X0001 #define PT_PRESENT 0X0001
#define PT_USER_RW 0x0002 #define PT_USER_RW 0x0002
@ -27,7 +27,7 @@
#define PT_GLOBAL 0x0100 #define PT_GLOBAL 0x0100
#define PT_LINK_N 0x0200 #define PT_LINK_N 0x0200
#define PT_LINK_L 0x0400 #define PT_LINK_L 0x0400
#define PT_ALLOC 0x0800 #define PT_SYS 0x0800
#define BIOS_MMAP_USABLE 1 #define BIOS_MMAP_USABLE 1
#define BIOS_MMAP_RESERVED 2 #define BIOS_MMAP_RESERVED 2
@ -79,4 +79,7 @@ inline void *get_cr3(){
asm volatile("mov %%cr3, %%eax;mov %0, %%eax": "=r"(cr3)); asm volatile("mov %%cr3, %%eax;mov %0, %%eax": "=r"(cr3));
return cr3; return cr3;
} }
int pm_init(kernel_info_t *kernel_info); int pm_init(kernel_info_t *kernel_info);
void *kmalloc(uint32_t size_pgs);//allocates in multiples of 4096
void *kfree(void *vaddr);