Add kmalloc

This commit is contained in:
pjht 2019-03-23 07:30:00 -05:00
parent 0f4cd96cbf
commit 5bca438d98
3 changed files with 108 additions and 0 deletions

92
cpu/i386/kmalloc.c Normal file
View File

@ -0,0 +1,92 @@
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
static char bitmap[1048576];
static void* data=(void*)0xFF400000;
static char get_bmap_bit(uint32_t index) {
uint32_t byte=index/8;
uint32_t bit=index%8;
char entry=bitmap[byte];
return (entry&(1<<bit))>0;
}
static void set_bmap_bit(uint32_t index) {
uint32_t byte=index/8;
uint32_t bit=index%8;
bitmap[byte]=bitmap[byte]|(1<<bit);
}
static void clear_bmap_bit(uint32_t index) {
uint32_t byte=index/8;
uint32_t bit=index%8;
bitmap[byte]=bitmap[byte]&(~(1<<bit));
}
void* kmalloc(uint32_t size) {
uint32_t num_4b_grps=(uint32_t)ceilf((float)size/4);
num_4b_grps+=2;
uint32_t bmap_index;
uint32_t remaining_blks;
for(uint32_t i=0;i<2097152;i++) {
if (bitmap[i]!=0xFF) {
char got_0=0;
remaining_blks=num_4b_grps;
uint32_t old_j;
for (uint32_t j=i*8;;j++) {
char bit=get_bmap_bit(j);
if (got_0) {
if (bit) {
if (remaining_blks==0) {
bmap_index=old_j;
break;
} else {
i+=j/8;
i--;
break;
}
} else {
remaining_blks--;
}
} else {
if (!bit) {
got_0=1;
old_j=j;
remaining_blks--;
}
}
if (remaining_blks==0) {
bmap_index=old_j;
break;
}
}
}
if (remaining_blks==0) {
break;
}
}
if (remaining_blks!=0) {
return NULL;
}
for (uint32_t i=0;i<num_4b_grps;i++) {
set_bmap_bit(bmap_index+i);
}
uint32_t data_offset=(bmap_index*8)+8;
uint32_t* info=(void*)(((uint32_t)data)+data_offset-8);
info[0]=num_4b_grps;
info[1]=bmap_index;
return (void*)(((uint32_t)data)+data_offset);
}
void kfree(void* mem) {
uint32_t* info=(uint32_t*)((uint32_t)mem-12);
uint32_t num_4b_grps=info[0];
uint32_t bmap_index=info[1];
for (uint32_t i=0;i<num_4b_grps;i++) {
clear_bmap_bit(bmap_index+i);
}
}

9
cpu/i386/kmalloc.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef KMALLOC_H
#define KMALLOC_H
#include <stddef.h>
void* kmalloc(size_t size);
void kfree(void* mem);
#endif

View File

@ -7,6 +7,7 @@
static uint32_t page_directory[1024] __attribute__((aligned(4096)));
static uint32_t kern_page_tables[NUM_KERN_DIRS*1024] __attribute__((aligned(4096)));
static uint32_t kmalloc_page_tables[1024] __attribute__((aligned(4096)));
static uint32_t smap_page_tables[2048] __attribute__((aligned(4096)));
static uint32_t* smap=(uint32_t*)0xFF800000;
@ -102,6 +103,7 @@ void* new_address_space() {
uint32_t entry_virt=(uint32_t)&(kern_page_tables[i*1024]);
smap[i+768]=(entry_virt-0xC0000000)|0x7;
}
smap[1021]=(((uint32_t)kmalloc_page_tables)-0xC0000000)|0x3;
for (uint32_t i=0;i<2;i++) {
uint32_t entry_virt=(uint32_t)&(smap_page_tables[i*1024]);
smap[i+1022]=(entry_virt-0xC0000000)|0x3;
@ -115,12 +117,16 @@ void load_address_space(uint32_t cr3) {
for (uint32_t i=1;i<2048;i++) {
smap_page_tables[i]=0;
}
load_page_directory((uint32_t*)cr3);
}
void paging_init() {
for (uint32_t i=0;i<NUM_KERN_DIRS*1024;i++) {
kern_page_tables[i]=(i<<12)|0x7;
}
for (uint32_t i=0;i<1024;i++) {
kmalloc_page_tables[i]=(uint32_t)pmem_alloc(1)|0x3;
}
smap_page_tables[0]=(((uint32_t)&(page_directory))-0xC0000000)|0x3;
for (uint32_t i=1;i<2048;i++) {
smap_page_tables[i]=0;
@ -129,6 +135,7 @@ void paging_init() {
uint32_t entry_virt=(uint32_t)&(kern_page_tables[i*1024]);
page_directory[i+768]=(entry_virt-0xC0000000)|0x7;
}
page_directory[1021]=(((uint32_t)kmalloc_page_tables)-0xC0000000)|0x3;
for (uint32_t i=0;i<2;i++) {
uint32_t entry_virt=(uint32_t)&(smap_page_tables[i*1024]);
page_directory[i+1022]=(entry_virt-0xC0000000)|0x3;