Tiberiu Chibici
913e65b856
==================================================== + Changed 'align 0x4' line above multiboot header in loader.asm to 'align 4' + Removed -e option for echo in build.sh + Modified build.sh for linux + Fixed triple fault when enabling paging + Fixed page faults at memory manager initialization + Fixed 'mem' console function + Added more info about page fault at crash screen + Added Panic() macro + Added verbose mode for memory manager [ BAD] BUILD 0.1.0.390 DATE 8/27/2011 AT 10:54 PM ==================================================== + Added stdlib routines, separated in different files + Rewritten physical memory manager + Added virtual mem manager + Added memory allocation/freeing + Added memory library + Added temporary allocation (at end of kernel), until paging is started - Removed functionality from debug console function 'mem' - Removed system.h, the one remaining function now in stdio.h
76 lines
1.9 KiB
C
76 lines
1.9 KiB
C
/*
|
|
* memory-vi.c
|
|
*
|
|
* Created on: Aug 23, 2011
|
|
* Author: Tiberiu
|
|
*/
|
|
#include <memory-add.h>
|
|
#include <stdio.h>
|
|
/*******************************
|
|
* Data *
|
|
*******************************/
|
|
PageDirectory* CurrentDirectory;
|
|
PageDirectory* KernelDirectory;
|
|
|
|
/*******************************
|
|
* Useful routines *
|
|
*******************************/
|
|
void PagingInitialize(uint32 kernel_used)
|
|
{
|
|
LogMem("Virtual memory manager initialization started. End of kernel = 0x%x\n", kernel_used);
|
|
PageDirectory* kernelPd = (PageDirectory*) kmalloc_a(sizeof(PageDirectory));
|
|
memset(kernelPd, 0, sizeof(PageDirectory));
|
|
|
|
CurrentDirectory = kernelPd;
|
|
KernelDirectory = kernelPd;
|
|
|
|
uint32 i;
|
|
for (i = 0; i < kernel_used; i+=0x1000)
|
|
MemPhAllocFrame(PagingGetPage(i, 1, kernelPd), 0, 0);
|
|
|
|
LogMem("Identity mapped first 0x%x bytes.\n", kernel_used);
|
|
|
|
for (i = KERNEL_HEAP_START; i < KERNEL_HEAP_END; i+=0x1000)
|
|
MemPhAllocFrame(PagingGetPage(i, 1, kernelPd), 1, 1);
|
|
|
|
LogMem("Mapped kernel space.\n");
|
|
|
|
PagingSwitchPageDirectory (kernelPd);
|
|
}
|
|
|
|
void PagingSwitchPageDirectory (PageDirectory* dir)
|
|
{
|
|
CurrentDirectory = dir;
|
|
asm volatile ("mov %0, %%cr3":: "r"(&dir->TablesPhysical));
|
|
LogMem("Switched page directory to 0x%x.\n", (uint32)(&dir->TablesPhysical));
|
|
|
|
uint32 cr0;
|
|
asm volatile ("mov %%cr0, %0": "=r"(cr0));
|
|
cr0 |= 0x80000000;
|
|
asm volatile ("mov %0, %%cr0":: "r"(cr0));
|
|
|
|
LogMem("Enabled paging.\n");
|
|
}
|
|
|
|
Page* PagingGetPage(uint32 addr, uint8 make, PageDirectory* dir)
|
|
{
|
|
addr >>= 12;
|
|
|
|
uint32 tableIndex = addr >> 10;
|
|
|
|
if (dir->Tables[tableIndex])
|
|
return &dir->Tables[tableIndex]->Pages[addr&0x3ff];
|
|
|
|
else if (make)
|
|
{
|
|
uint32 temp;
|
|
dir->Tables[tableIndex] = (PageTable*)kmalloc_ap(sizeof(PageTable), &temp);
|
|
memset (dir->Tables[tableIndex], 0, 0x1000);
|
|
dir->TablesPhysical[tableIndex] = temp | 0x7;
|
|
return &dir->Tables[tableIndex]->Pages[addr&0x3ff];
|
|
}
|
|
|
|
else return 0;
|
|
}
|
|
|