Nucleus
Barry Object manager and heap in kernel library 08afe80 (3 years, 2 months ago)
diff --git a/memory/fault.c b/memory/fault.c
index 80dc5e0..d8accb6 100644
--- a/memory/fault.c
+++ b/memory/fault.c
@@ -13,9 +13,10 @@
#include <nucleus/lib.h>
#include <nucleus/memory.h>
#include <nucleus/task.h>
-#include "paging.h"
#include "namespace.h"
+extern page_t zeroFrame;
+
VMRegion *find_region(uintptr_t addr);
void copy_page_frame(page_t src, page_t dest);
@@ -179,13 +180,15 @@ page_fault_handler(struct InterruptFrame *frame)
uint8_t write = frame->err & (1 << 1);
uint8_t user = frame->err & (1 << 2);
+ ASSERT(current && current->vm);
+
/* Iterate VM Regions */
VMRegion *region = find_region(addr);
/* Not in a region */
if (__builtin_expect(!region, 0)) {
page_t pg = get_page(addr);
- panic("[CPU#%d] Page Fault [%d:%d] (%#.8x -> %#.8x [tbl:%d, pg:%d][%#.8x], %s, %s, %s)",
- cpu->id, current->tgid, current->tid, frame->eip,
+ panic("Page Fault [%d:%d] (%#.8x -> %#.8x [tbl:%d, pg:%d][%#.8x], %s, %s, %s)",
+ current->tgid, current->tid, frame->eip,
addr, (addr >> 12) / 1024, (addr >> 12) % 1024, pg,
present ? "present" : "not present",
write ? "write" : "read",
@@ -202,21 +205,3 @@ page_fault_handler(struct InterruptFrame *frame)
if (!present && !write)
return not_present_read(region, addr);
}
-
-/* Early (pre-VFS/tasking) page fault handler */
-void
-early_page_fault_handler(struct InterruptFrame *frame)
-{
- uintptr_t addr;
- asm volatile("mov %%cr2, %0" : "=r" (addr));
- uint8_t present = frame->err & (1 << 0);
- uint8_t write = frame->err & (1 << 1);
- uint8_t user = frame->err & (1 << 2);
- if (!PAGE_ADDR(addr))
- panic("Null dereference @ %#.8x -> %#.8x", frame->eip, addr);
- ASSERT(!present);
- kprintf("Allocating frame for %#.8x [%#.8x] CPU#%d",
- addr, frame->eip, cpu->id);
- /* Allocate a page */
- set_page(addr, alloc_frame() | PTE_PRESENT | PTE_WRITE | PTE_GLOBAL);
-}
diff --git a/memory/heap.c b/memory/heap.c
deleted file mode 100644
index a0e696a..0000000
--- a/memory/heap.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * This file contains the functions related to the kernel's heap. It uses a
- * simple method of allocating and freeing blocks from a pool in the kernel's
- * memory space. This heap will be present in every virtual address space, so
- * can be used to store any kernel data structures.
- */
-
-#include <stddef.h>
-#include <stdint.h>
-#include <nucleus/kernel.h>
-#include <nucleus/lib.h>
-
-#define KHEAP_START 0x200000 /* 2MB */
-#define KHEAP_END 0x800000 /* 2MB */
-#define BLOCK_SIZE 16
-
-/* Structure for a memory block header */
-struct Header {
- struct Header *next, *prev;
- size_t size;
- char magic[4];
-};
-
-/* Allocate a region of the heap */
-void *
-kmalloc(size_t size)
-{
- size_t blockSize, gapSize;
- uintptr_t blockEnd;
- struct Header *prev, *head, *next = NULL;
- head = prev = (void *) KHEAP_START;
-
- /* Minimum allocation */
- if (size % BLOCK_SIZE)
- size += BLOCK_SIZE - (size % BLOCK_SIZE);
-
- /* Block does not exist, create heap */
- if (head->prev != head) {
- head->prev = head;
- head->next = NULL;
- goto found;
- }
-
- /* Find gap */
- while (head) {
- next = head->next;
- blockSize = sizeof(struct Header) + head->size;
- blockEnd = (uintptr_t) head + blockSize;
- if (next)
- gapSize = (size_t) next - blockEnd;
- else
- gapSize = (size_t) KHEAP_END - blockEnd;
- prev = head;
-
- /* Fit in gap */
- if (gapSize >= size + sizeof(struct Header)) {
- head = (void *) blockEnd;
- head->next = next;
- head->prev = prev;
- prev->next = head;
- if (next)
- next->prev = head;
- goto found;
- }
-
- head = head->next;
- }
-
- panic("Kernel heap exhausted");
-
-found:
- /* Found block */
- head->size = size;
- memcpy(head->magic, "HEAP", 4);
- memset(head + 1, 0, size);
- return (void *) (head + 1);
-}
-
-/* Free an allocated region of the heap */
-void
-kfree(void *addr)
-{
- struct Header *prev, *head, *next;
- head = (struct Header *) addr - 1;
-
- ASSERT(!memcmp(head->magic, "HEAP", 4));
- prev = head->prev;
- next = head->next;
- memset(head, 0, sizeof(struct Header));
-
- if (prev != head)
- prev->next = next;
- if (next)
- next->prev = prev;
-}
diff --git a/memory/page.c b/memory/page.c
index 986b4d9..8c61aa6 100644
--- a/memory/page.c
+++ b/memory/page.c
@@ -6,9 +6,10 @@
#include <nucleus/memory.h>
#include <nucleus/object.h>
-#include "paging.h"
#include "namespace.h"
+extern page_t zeroFrame;
+
static void page_delete(Object *);
/* Page object type */
diff --git a/memory/paging.c b/memory/paging.c
index c88eee1..e9a8a83 100644
--- a/memory/paging.c
+++ b/memory/paging.c
@@ -8,9 +8,9 @@
#include <stdint.h>
#include <nucleus/lib.h>
#include <nucleus/memory.h>
-#include "paging.h"
void copy_page_frame(uintptr_t src, uintptr_t dest);
+void page_fault_handler(struct InterruptFrame *frame);
page_t zeroFrame;
static page_dir_t kernelDir;
@@ -151,7 +151,7 @@ init_paging(void)
*/
/* Use kernel directory */
- register_exception(14, early_page_fault_handler);
+ register_exception(14, page_fault_handler);
cpu_load_paging();
/* Allocate a kernel stack */
diff --git a/memory/paging.h b/memory/paging.h
deleted file mode 100644
index eb7c75f..0000000
--- a/memory/paging.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef MEMORY_PAGING_H
-#define MEMORY_PAGING_H
-
-#include <stdint.h>
-#include <nucleus/cpu.h>
-#include <nucleus/memory.h>
-
-extern page_t zeroFrame;
-
-void early_page_fault_handler(struct InterruptFrame *frame);
-
-#endif