// mm.c // 09/01/03 Josh Holtrop // 0x368000 is first available byte (this is right after the kernel @ 1mb and the initrd @ 2mb, 1440kb. pageblock *first_pageblock = (pageblock *) 0; dword mm_totalmem = 0x100000; //assume 1mb void mm_init() { dword *memmap_entries = (dword *) 0x9040A; memmap_entry *maps = (memmap_entry *) 0x92000; dword a; for (a=0;a<(*memmap_entries);a++) { if (maps[a].attributes == 1) // (1) mem free to OS { mm_totalmem += maps[a].limit.lowdword; if ((maps[a].base.lowdword + maps[a].limit.lowdword) > (FREERAM_START+8192)) //goes past where we start freeram { if (maps[a].base.lowdword < FREERAM_START) { maps[a].limit.lowdword = maps[a].limit.lowdword - (FREERAM_START - maps[a].base.lowdword); maps[a].base.lowdword = FREERAM_START; //block at least 4kb, starts >= FREERAM_START } if (first_pageblock == 0) //no pageblock page set up yet, so set it up here { first_pageblock = (pageblock *) maps[a].base.lowdword; maps[a].base.lowdword += 4096; maps[a].limit.lowdword -= 4096; mm_init_pageblockpage(first_pageblock); first_pageblock->base = maps[a].base.lowdword; first_pageblock->length = maps[a].limit.lowdword / 4096; first_pageblock->flags = MM_PB_AVAIL; } else //first_pageblock already set up, add on segment { pageblock *pb = first_pageblock; for (;;) { if (pb->flags == MM_PB_NP) break; else pb++; } pb->base = maps[a].base.lowdword; pb->length = maps[a].limit.lowdword / 4096; pb->flags = MM_PB_AVAIL; } } } } if (first_pageblock == 0) { printf("ERROR! NO INITIAL PAGE BLOCK COULD BE CREATED."); asm("cli"); asm("hlt"); } } void mm_init_pageblockpage(pageblock *pbp) { pageblock *pb = pbp; int a; for (a=0; a<512; a++) { pb->base = 0; pb->length = 0; pb->flags = MM_PB_NP; if (a<511) pb->link = (dword)++pb + sizeof(pageblock); else pb->link = 0; } } void *mm_palloc(dword numpages) { } int mm_pfree(void *ptr) { }