Draft: lab 5 failed
This commit is contained in:
@@ -37,7 +37,7 @@ void *simple_alloc(size_t size)
|
||||
size = (size_t)ALIGN8(size);
|
||||
|
||||
if ((uint64_t)_heap_top + size >= (uint64_t)&__heap_end)
|
||||
exit(ERR_NO_MEM);
|
||||
panic(ERR_NO_MEM);
|
||||
|
||||
void *ret = _heap_top;
|
||||
_heap_top = (void *)((uint64_t)_heap_top + size);
|
||||
@@ -49,17 +49,19 @@ void *simple_alloc(size_t size)
|
||||
|
||||
void *mman_alloc(size_t unit)
|
||||
{
|
||||
LOG("mman_alloc called"); DEBUG_MEM(unit);
|
||||
unit = (size_t)ALIGN8(unit);
|
||||
if (unit > (KMALLOC_MAX_ALLOCATOR_SIZE << 3))
|
||||
return allocate_page(((unit - 1) >> 12) + 1);
|
||||
|
||||
kmalloc_allocator_t *pool = &mman_kmalloc_pool[unit >> 3];
|
||||
if (!pool->left) {
|
||||
void *page = allocate_page(1), *ptr = page + sizeof(kmalloc_header_t);
|
||||
if (!pool->page_begin || !pool->left) {
|
||||
void *page = allocate_page(1);
|
||||
|
||||
*(kmalloc_header_t *)page = (kmalloc_header_t){
|
||||
.unit = unit,
|
||||
.left = (PAGE_SIZE - sizeof(kmalloc_header_t)) / unit,
|
||||
.begin = page + sizeof(kmalloc_header_t),
|
||||
.begin = (void *)((uint64_t)page + sizeof(kmalloc_header_t)),
|
||||
.page_prev = (kmalloc_header_t *)0x0,
|
||||
.page_next = (kmalloc_header_t *)0x0,
|
||||
};
|
||||
@@ -67,20 +69,31 @@ void *mman_alloc(size_t unit)
|
||||
.left = ((kmalloc_header_t *)page)->left,
|
||||
.page_begin = (kmalloc_header_t *)page,
|
||||
};
|
||||
LOG(page); LOG(sizeof(kmalloc_header_t)); DEBUG_MEM(pool->page_begin->begin);
|
||||
|
||||
for (; ptr + unit <= page + PAGE_SIZE; ptr += unit)
|
||||
*(void **)ptr = ptr + unit;
|
||||
uint64_t ptr = (uint64_t)page + sizeof(kmalloc_header_t);
|
||||
for (; ptr + unit <= (uint64_t)page + PAGE_SIZE; ptr += unit)
|
||||
*(uint64_t *)ptr = ptr + unit;
|
||||
}
|
||||
|
||||
void *ret = pool->page_begin->begin;
|
||||
LOG(pool); LOG(pool->page_begin); DEBUG_MEM(pool->left);
|
||||
LOG(pool->page_begin->left); DEBUG_MEM(pool->page_begin->begin);
|
||||
pool->page_begin->begin = *(void **)pool->page_begin->begin;
|
||||
|
||||
--pool->left;
|
||||
--pool->page_begin->left;
|
||||
if (!pool->page_begin->left)
|
||||
pool->page_begin = *(void **)pool->page_begin->page_next;
|
||||
pool->left--;
|
||||
pool->page_begin->left--;
|
||||
if (!pool->left)
|
||||
pool->page_begin = 0x0;
|
||||
while (pool->page_begin && !pool->page_begin->left) {
|
||||
pool->page_begin = pool->page_begin->page_next;
|
||||
if (pool->page_begin)
|
||||
pool->page_begin->page_prev = 0x0;
|
||||
}
|
||||
|
||||
LOG("mman_alloc"); LOG((uint64_t)unit); DEBUG_MEM(ret);
|
||||
LOG(pool->page_begin); LOG(pool->page_begin->left);
|
||||
DEBUG_MEM(pool->page_begin->begin);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -91,6 +104,8 @@ void mman_free(void *ptr)
|
||||
return;
|
||||
}
|
||||
|
||||
return; // early return for debugging
|
||||
|
||||
size_t unit = PAGE_HEADER(ptr)->unit;
|
||||
kmalloc_allocator_t *pool = &mman_kmalloc_pool[unit >> 3];
|
||||
if (!PAGE_HEADER(ptr)->left) {
|
||||
|
||||
Reference in New Issue
Block a user