(memory): alignment checks, clean up, and tests
This commit is contained in:
parent
a8e1bbc3a8
commit
3c7b927abf
2 changed files with 26 additions and 2 deletions
|
|
@ -31,12 +31,34 @@ void page_init()
|
||||||
page_free((void *)addr);
|
page_free((void *)addr);
|
||||||
}
|
}
|
||||||
kputs("OK");
|
kputs("OK");
|
||||||
|
|
||||||
|
// test_memory_integrity();
|
||||||
|
// test_memory_alignment();
|
||||||
|
// test_memory_stress();
|
||||||
|
// page_free((void *)23);
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_aligned_to(size_t value, size_t size)
|
||||||
|
{
|
||||||
|
return value % size == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t align_up(size_t value, size_t size)
|
||||||
|
{
|
||||||
|
return (value + size - 1) & ~(size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t align_down(size_t value, size_t size)
|
||||||
|
{
|
||||||
|
return value & ~(size - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void page_free(void *addr)
|
void page_free(void *addr)
|
||||||
{
|
{
|
||||||
if (addr == NULL)
|
if (addr == NULL)
|
||||||
return;
|
return;
|
||||||
|
if (!is_aligned_to((size_t)addr, PAGE_SIZE))
|
||||||
|
kpanic("page_free: address not aligned to PAGE_SIZE: %p", addr);
|
||||||
|
|
||||||
struct Page *p = (struct Page *)addr;
|
struct Page *p = (struct Page *)addr;
|
||||||
p->next = free_list;
|
p->next = free_list;
|
||||||
|
|
@ -63,8 +85,7 @@ void *kmalloc(size_t size)
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// Align size to 8 bytes
|
size = align_up(size, 8);
|
||||||
size = (size + 7) & ~7;
|
|
||||||
|
|
||||||
if (heap_free_list == NULL)
|
if (heap_free_list == NULL)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,9 @@ typedef struct HeapHeader
|
||||||
} HeapHeader;
|
} HeapHeader;
|
||||||
|
|
||||||
void zero_bss();
|
void zero_bss();
|
||||||
|
int is_aligned_to(size_t value, size_t size);
|
||||||
|
size_t align_up(size_t value, size_t size);
|
||||||
|
size_t align_down(size_t value, size_t size);
|
||||||
void page_init();
|
void page_init();
|
||||||
void page_free(void *addr);
|
void page_free(void *addr);
|
||||||
void *page_alloc();
|
void *page_alloc();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue