selfmade-os

annotate mem.c @ 1:42ba76f77035

the kernel with output and mem alloc
author meillo@marmaro.de
date Sun, 01 Nov 2009 23:50:51 +0100
parents
children
rev   line source
meillo@1 1 #include "mem.h"
meillo@1 2 #include "io.h"
meillo@1 3
meillo@1 4
meillo@1 5 void
meillo@1 6 initmem(unsigned int memstart)
meillo@1 7 {
meillo@1 8 unsigned int* p;
meillo@1 9 int step = 2*1024*1024;
meillo@1 10 unsigned int* zero = 0x0;
meillo@1 11
meillo@1 12
meillo@1 13 minmem = (unsigned char*)memstart;
meillo@1 14
meillo@1 15 /* disable cache */
meillo@1 16 __asm__ __volatile__ (
meillo@1 17 "movl %cr0, %eax\n\t"
meillo@1 18 "movl $0x60000000, %ebx\n\t"
meillo@1 19 "orl %ebx, %eax\n\t"
meillo@1 20 "movl %eax, %cr0"
meillo@1 21 );
meillo@1 22
meillo@1 23 /* test mem size */
meillo@1 24 p = (unsigned int*) ((unsigned int)minmem/sizeof(char));
meillo@1 25 do {
meillo@1 26 p += step;
meillo@1 27 *p = 0xf0f0f0f0;
meillo@1 28 } while (*p == 0xf0f0f0f0);
meillo@1 29 maxmem = (unsigned char*)p;
meillo@1 30
meillo@1 31 /* test mem mirroring */
meillo@1 32 p = 0;
meillo@1 33 *p = 0;
meillo@1 34 p++;
meillo@1 35 while (p < (unsigned int*)minmem) {
meillo@1 36 p = (unsigned int*) ((unsigned int)p * 2);
meillo@1 37 }
meillo@1 38 while (p < (unsigned int*)maxmem) {
meillo@1 39 *p = 0xf0f0f0f0;
meillo@1 40 if (*zero == 0xf0f0f0f0) {
meillo@1 41 maxmem = (unsigned char*)p;
meillo@1 42 break;
meillo@1 43 }
meillo@1 44 p = (unsigned int*) ((unsigned int)p * 2);
meillo@1 45 }
meillo@1 46
meillo@1 47 /* enable cache again */
meillo@1 48 __asm__ __volatile__ (
meillo@1 49 "movl %cr0, %eax\n\t"
meillo@1 50 "movl $0x60000000, %ebx \n\t"
meillo@1 51 "negl %ebx\n\t"
meillo@1 52 "andl %ebx, %eax\n\t"
meillo@1 53 "movl %eax, %cr0"
meillo@1 54 );
meillo@1 55
meillo@1 56 /* min, max */
meillo@1 57 printf("mem: start=%p end=%p size=%p\n", minmem, maxmem, (void*)(maxmem-minmem));
meillo@1 58
meillo@1 59 /* init heap */
meillo@1 60 newp = minmem;
meillo@1 61 }
meillo@1 62
meillo@1 63
meillo@1 64 void*
meillo@1 65 malloc(unsigned int size)
meillo@1 66 {
meillo@1 67 if (newp + size > maxmem) {
meillo@1 68 printf("Fatal error: memory exhausted!\n");
meillo@1 69 while (1) {
meillo@1 70 }
meillo@1 71 }
meillo@1 72 newp += size;
meillo@1 73 return newp - size;
meillo@1 74 }