Mercurial > selfmade-os
diff mem.c @ 1:42ba76f77035 default tip
the kernel with output and mem alloc
author | meillo@marmaro.de |
---|---|
date | Sun, 01 Nov 2009 23:50:51 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mem.c Sun Nov 01 23:50:51 2009 +0100 @@ -0,0 +1,74 @@ +#include "mem.h" +#include "io.h" + + +void +initmem(unsigned int memstart) +{ + unsigned int* p; + int step = 2*1024*1024; + unsigned int* zero = 0x0; + + + minmem = (unsigned char*)memstart; + + /* disable cache */ + __asm__ __volatile__ ( + "movl %cr0, %eax\n\t" + "movl $0x60000000, %ebx\n\t" + "orl %ebx, %eax\n\t" + "movl %eax, %cr0" + ); + + /* test mem size */ + p = (unsigned int*) ((unsigned int)minmem/sizeof(char)); + do { + p += step; + *p = 0xf0f0f0f0; + } while (*p == 0xf0f0f0f0); + maxmem = (unsigned char*)p; + + /* test mem mirroring */ + p = 0; + *p = 0; + p++; + while (p < (unsigned int*)minmem) { + p = (unsigned int*) ((unsigned int)p * 2); + } + while (p < (unsigned int*)maxmem) { + *p = 0xf0f0f0f0; + if (*zero == 0xf0f0f0f0) { + maxmem = (unsigned char*)p; + break; + } + p = (unsigned int*) ((unsigned int)p * 2); + } + + /* enable cache again */ + __asm__ __volatile__ ( + "movl %cr0, %eax\n\t" + "movl $0x60000000, %ebx \n\t" + "negl %ebx\n\t" + "andl %ebx, %eax\n\t" + "movl %eax, %cr0" + ); + + /* min, max */ + printf("mem: start=%p end=%p size=%p\n", minmem, maxmem, (void*)(maxmem-minmem)); + + /* init heap */ + newp = minmem; +} + + +void* +malloc(unsigned int size) +{ + if (newp + size > maxmem) { + printf("Fatal error: memory exhausted!\n"); + while (1) { + } + } + newp += size; + return newp - size; +}