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 } |