Draft: lab 5 failed

This commit is contained in:
2025-05-03 20:45:34 +08:00
parent 981cae803b
commit e73f90395d
39 changed files with 588 additions and 429 deletions

View File

@@ -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) {