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(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;
}

View File

@ -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);
int pm_init(kernel_info_t *kernel_info);
void *kmalloc(uint32_t size_pgs);//allocates in multiples of 4096
void *kfree(void *vaddr);