Vhex-kernel/src/kernel/memory/initialize.c

84 lines
2.5 KiB
C

#include <kernel/memory.h>
#include <kernel/devices/earlyterm.h>
#include <kernel/util/kmem.h>
// Internal data.
struct memory_info pmemory;
__attribute__((constructor(101)))
void memory_init(void)
{
extern uint32_t ram_start;
extern uint32_t srom;
// Initialize RAM informations
// TODO determine RAM's size
pmemory.ram.end = (void *)0x88080000;
pmemory.ram.start = (void *)(((uintptr_t)&ram_start + 3) >> 2 << 2);
pmemory.ram.size = pmemory.ram.end - pmemory.ram.start;
// Generate cache part
pmemory.cache.delta = NULL;
pmemory.cache.pages.number = 0;
pmemory.cache.pages.size = PM_PAGE_SIZE;
pmemory.cache.pages.list = pmemory.ram.start;
pmemory.cache.pages.base_addr = pmemory.ram.end;
while ((void *)&pmemory.cache.pages.list[pmemory.cache.pages.number] <
pmemory.cache.pages.base_addr - PM_PAGE_SIZE)
{
pmemory.cache.pages.base_addr -= PM_PAGE_SIZE;
pmemory.cache.pages.number += 1;
}
// Initialize kernel heap
pmemory.kheap = NULL;
// Debug
/* earlyterm_write("kernel = %do -> %dko\n", &srom, (uint32_t)&srom / 1024);
earlyterm_write("ram start = %p\n", pmemory.ram.start);
earlyterm_write("ram end = %p\n", pmemory.ram.end);
earlyterm_write("ram size = %do -> %dko\n", pmemory.ram.size, pmemory.ram.size / 1024);
earlyterm_write("page size = %do -> %#xo\n", pmemory.cache.pages.size, pmemory.cache.pages.size);
earlyterm_write("page num = %d\n", pmemory.cache.pages.number);
earlyterm_write("real RAM = %d -> %dko\n", pmemory.cache.pages.number * PM_PAGE_SIZE, (pmemory.cache.pages.number * PM_PAGE_SIZE) / 1024);
*/
// Initialize cache page list
for (int i = 0 ; i < pmemory.cache.pages.number ; i = i + 1)
{
pmemory.cache.pages.list[i].status = PAGE_UNUSED;
pmemory.cache.pages.list[i].next = NULL;
}
// TEST part
/* void *test0 = kmem_alloc(16);
void *test1 = kmem_alloc(128);
void *test2 = kmem_alloc(80);
earlyterm_write("test0 = %p\n", test0);
earlyterm_write("test1 = %p\n", test1);
earlyterm_write("test2 = %p\n", test2);
kmem_free(test1);
//kmem_debug();
//DBG_WAIT;
test1 = kmem_realloc(NULL, 16);
//earlyterm_write("test1 = %p\n", test1);
//kmem_debug();
//DBG_WAIT;
test1 = kmem_realloc(test1, 32);
earlyterm_write("test1 = %p\n", test1);
kmem_debug();
DBG_WAIT;
//test1 = kmem_realloc(test1, 10);
//earlyterm_write("test1 = %p\n", test1);
//kmem_debug();
//DBG_WAIT;
test1 = kmem_realloc(test1, 128);
earlyterm_write("test1 = %p\n", test1);
kmem_debug();
DBG_WAIT;
test1 = kmem_realloc(test1, 200);
earlyterm_write("test1 = %p\n", test1);
kmem_debug();
DBG_WAIT;
while (1);*/
}