summaryrefslogtreecommitdiff
path: root/Source/Kernel/MemoryManager/PhysMem.ns.cpp
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2009-08-22 21:44:32 +0200
committerAlexis211 <alexis211@gmail.com>2009-08-22 21:44:32 +0200
commit2582a11c37ccc22d64974b20b0793e5ba873fe1f (patch)
tree485565c0950f0355290690d3396bcb4c22774fd0 /Source/Kernel/MemoryManager/PhysMem.ns.cpp
parent74e721676ddd5d996ccf2e1d35da57320f658609 (diff)
downloadMelon-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.cpp79
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;
+}
+
+}