diff options
author | Alexis211 <alexis211@gmail.com> | 2009-08-22 21:44:32 +0200 |
---|---|---|
committer | Alexis211 <alexis211@gmail.com> | 2009-08-22 21:44:32 +0200 |
commit | 2582a11c37ccc22d64974b20b0793e5ba873fe1f (patch) | |
tree | 485565c0950f0355290690d3396bcb4c22774fd0 /Source/Kernel/MemoryManager/PhysMem.ns.cpp | |
parent | 74e721676ddd5d996ccf2e1d35da57320f658609 (diff) | |
download | Melon-2582a11c37ccc22d64974b20b0793e5ba873fe1f.tar.gz Melon-2582a11c37ccc22d64974b20b0793e5ba873fe1f.zip |
Lots of stuff added : heap, timer, device managment, ...
Diffstat (limited to 'Source/Kernel/MemoryManager/PhysMem.ns.cpp')
-rw-r--r-- | Source/Kernel/MemoryManager/PhysMem.ns.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/Source/Kernel/MemoryManager/PhysMem.ns.cpp b/Source/Kernel/MemoryManager/PhysMem.ns.cpp new file mode 100644 index 0000000..a9bfd35 --- /dev/null +++ b/Source/Kernel/MemoryManager/PhysMem.ns.cpp @@ -0,0 +1,79 @@ +#include "PhysMem.ns.h" +#include <Library/Bitset.class.h> +#include <VTManager/VirtualTerminal.class.h> + +PageDirectory* kernelPageDirectory; + +namespace PhysMem { + +u32int nframes; +Bitset *frames; + +void initPaging(u32int mem_size) { + nframes = mem_size / 0x1000; + + frames = new Bitset(nframes); + + kernelPageDirectory = new (Mem::kalloc(sizeof(PageDirectory), true)) PageDirectory(); + + u32int i = 0xC0000000; + while (i < Mem::placementAddress) { + page_t *p2 = kernelPageDirectory->getPage(i, true); + allocFrame(p2, true, false); + /* /DEBUG_HEX(i); DEBUG(" =>"); + DEBUG_HEX(p2->frame); DEBUG("."); */ + i += 0x1000; + } + //Also map thoses pages at begning of virtual memory + for (u32int i = 0; i < (Mem::placementAddress - 0xC0000000) / 0x100000; i++) { + kernelPageDirectory->tablesPhysical[i] = kernelPageDirectory->tablesPhysical[768 + i]; + kernelPageDirectory->tables[i] = kernelPageDirectory->tables[768 + i]; + } + DEBUG_HEX((u32int)kernelPageDirectory->physicalAddr); DEBUG(" is page dir phys addr."); + //asm volatile("hlt"); + + kernelPageDirectory->switchTo(); + DEBUG("Paging enabled !"); + + Mem::pagingEnabled = true; +} + +void removeTemporaryPages() { + for (u32int i = 0; i < (Mem::placementAddress - 0xC0000000) / 0x100000; i++) { + kernelPageDirectory->tablesPhysical[i] = 0; + kernelPageDirectory->tables[i] = 0; + } +} + +void allocFrame(page_t *page, bool is_user, bool is_writable) { + if (page->frame != 0) { + return; + } else { + u32int idx = frames->firstFreeBit(); + if (idx == (u32int) - 1) PANIC("No more free frames !"); + frames->setBit(idx); + page->present = 1; + page->user = (is_user ? 1 : 0); + page->rw = (is_writable ? 1 : 0); + page->frame = idx; + } +} + +void freeFrame(page_t *page) { + if (page->frame == 0) { + return; + } else { + frames->clearBit(page->frame / 0x1000); + page->frame = 0; + } +} + +u32int free() { + return nframes - frames->usedBits(); +} + +u32int total() { + return nframes; +} + +} |