106 lines
2.1 KiB
C
106 lines
2.1 KiB
C
// 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)
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|