Add allocator
diff --git a/src/kernel/paging.c b/src/kernel/paging.c
index 9da17dc..62636b3 100644
--- a/src/kernel/paging.c
+++ b/src/kernel/paging.c
@@ -1,51 +1,16 @@
 #include "paging.h"
+#include "alloc.h"
 #include "io.h"
 #include "kint.h"
 #include "log.h"
 #include "pic.h"
 
-extern uint end;
-static size_t alloc_base = (size_t)&end;
-
 /* frames bitset, 0 = free, 1 = used */
-static uint *frames;
+static uint frames[0xffffffff / 0x1000 / 32];
 static ulong num_frames;
 
 static uint first_page_table[1024] __attribute__((aligned(4096)));
-static uint page_directory[1024] __attribute__((aligned(4096)));
-
-void *_kmalloc(size_t size, bool align, void **phys)
-{
-	if (align && (alloc_base & 0xfff)) // if not yet aligned
-	{
-		alloc_base &= ~0xfff;
-		alloc_base += 0x1000;
-	}
-
-	if (phys)
-	{
-		*phys = (void *)alloc_base;
-	}
-
-	size_t addr = alloc_base;
-	alloc_base += size;
-	return (void *)addr;
-}
-
-void *kmalloc(size_t size)
-{
-	return _kmalloc(size, false, NULL);
-}
-
-void *kmalloc_a(size_t size)
-{
-	return _kmalloc(size, true, NULL);
-}
-
-void *kmalloc_ap(size_t size, void **p)
-{
-	return _kmalloc(size, true, p);
-}
+static uint kernel_page_directory[1024] __attribute__((aligned(4096)));
 
 /* frame utils */
 
@@ -94,15 +59,15 @@
 	kpanic("first_free_frame failed! no free frames");
 }
 
-void alloc_frame(uint *page, bool user, bool writable)
+void alloc_frame(uint *page_table_entry, bool user, bool writable)
 {
-	if (*page >> 12)
+	if (*page_table_entry >> 12)
 		return; /* frame already allocated */
 
 	uint frame = first_free_frame();
 	//	kprintf("first_free_frame found %d\n", frame);
 	set_frame(frame * 0x1000); /* mark as mapped */
-	*page = frame | 1 | writable << 1 | user << 2;
+	*page_table_entry = frame | 1 | writable << 1 | user << 2;
 }
 
 void free_frame(uint page)
@@ -136,9 +101,32 @@
 	return page_table;
 }
 
+void alloc_kernel_page(uint *virt)
+{
+	// Page number % pages per table
+	uint page = ((size_t)virt / 0x1000) % 1024;
+	uint *table = get_or_create_table(kernel_page_directory, (size_t)virt >> 22,
+									  false, false);
+
+	alloc_frame(&table[page], false, false);
+}
+
+void alloc_kernel_page_range(uint *from, uint *to)
+{
+	uint f = (size_t)from / 0x1000,
+		t = (size_t)to / 0x1000;
+
+	do
+	{
+		alloc_kernel_page((uint *)(size_t)t);
+		t += 0x1000; // next page
+	} while (f < t);
+}
+
 void map_page(uint *dir, size_t virt_start, bool user, bool rw)
 {
-	uint page = virt_start / 0x1000;
+	// Page number % pages per table
+	uint page = (virt_start / 0x1000) % 1024;
 	uint table = virt_start >> 22;
 	uint frame = first_free_frame();
 
@@ -158,11 +146,11 @@
 
 void init_paging()
 {
-	frames = kmalloc_a(0x1000);
-	memset(page_directory, 0, 1024 * 4);
-	map_4mb(page_directory, (size_t)KERNEL_VIRTUAL_BASE, 0, false, false);
+	memset(kernel_page_directory, 0, 1024 * 4);
+	map_4mb(kernel_page_directory, (size_t)KERNEL_VIRTUAL_BASE, 0, false,
+			false);
 
-	load_page_directory((uint)page_directory - 0xC0000000);
+	load_page_directory((uint)kernel_page_directory - 0xC0000000);
 	add_interrupt_handler(14, page_fault);
 }