summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--fs/elf.c10
-rw-r--r--fs/ext2.c17
-rw-r--r--kernel/config.h4
-rw-r--r--kernel/kernel.c9
-rw-r--r--kernel/mem.c5
-rw-r--r--kernel/syscalls.c23
-rw-r--r--kernel/task.c23
-rw-r--r--kernel/task.h2
-rw-r--r--kernel/vmem.c128
-rw-r--r--kernel/vmem.h38
-rw-r--r--lib/logger/log.h2
12 files changed, 120 insertions, 143 deletions
diff --git a/Makefile b/Makefile
index bd707ec..3587e4e 100644
--- a/Makefile
+++ b/Makefile
@@ -36,7 +36,7 @@ CFLAGS+=-ffreestanding
CFLATS+=-Wall
CFLAGS+=-Wextra
#CFLAGS+=-O3
-CFLAGS+=-O0
+#CFLAGS+=-O0
#CFLAGS+=-nostdlib
CFLAGS+=-std=gnu11
CFLAGS+=-I.
diff --git a/fs/elf.c b/fs/elf.c
index 57c9009..f5262dd 100644
--- a/fs/elf.c
+++ b/fs/elf.c
@@ -78,10 +78,10 @@ uint32_t load_elf(char *name, uint32_t *alloc)
//load binary
uint32_t vaddr=0x08048000;
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"loading");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"loading %s",name);
ext2_check(EXT2_RAM_ADDRESS);
ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,vaddr,0x100000); // load 1mb;
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"ELF File loaded to final destination.");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"ELF File loaded to final destination.");
Elf32_Ehdr *elf;
elf=vaddr;
@@ -121,7 +121,7 @@ uint32_t load_elf(char *name, uint32_t *alloc)
if(phidx==0)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"text: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"text: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz);
}
if(phidx==1)
@@ -138,8 +138,8 @@ uint32_t load_elf(char *name, uint32_t *alloc)
*/
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"data: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"data: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz);
// let's copy the rw- data block
uint32_t *data=vaddr+phdr->p_offset;
diff --git a/fs/ext2.c b/fs/ext2.c
index a530ce6..49b6f17 100644
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -118,9 +118,10 @@ int ext2_check(uint8_t *ram)
ext2_superblock_ext super_ext;
uint8_t *ptr=ram+1024;
ram_read(ptr,&super,sizeof(super),1);
- if(super.ext2_sig!=0xef53)log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"no ext2 signature found, where ram-image expected!");
- //check version and req features.
- //
+
+ if(super.ext2_sig!=0xef53){
+ panic(FOOLOS_MODULE_NAME,"no ext2 signature found, where ram-image expected!");
+ }
}
ext2_inode ext2_get_inode(uint8_t *ram,int inode_num)
@@ -133,7 +134,7 @@ ext2_inode ext2_get_inode(uint8_t *ram,int inode_num)
uint8_t *ptr=ram+1024;
ram_read(ptr,&super,sizeof(super),1);
- if(super.ext2_sig!=0xef53)log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"no ext2 signature found, where ram-image expected!");
+ if(super.ext2_sig!=0xef53)panic(FOOLOS_MODULE_NAME,"no ext2 signature found, where ram-image expected!");
int block_group=(inode_num-1)/super.inodes_per_group;
@@ -241,7 +242,7 @@ int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max)
}
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"Fool Check Sum: 0x%08X for %d bytes",sum,count);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"Fool Check Sum: 0x%08X for %d bytes",sum,count);
}
@@ -259,7 +260,7 @@ int ext2_filename_to_inode_traverse(uint8_t *ram, char *path,int inode_start)
if(*path==0)final=true;
else(*path=0);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"looking for %s '%s' in inode: %d",final?"file":"dir",first,inode_start);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"looking for %s '%s' in inode: %d",final?"file":"dir",first,inode_start);
fs_dirent dirs[15];
int count= ext2_read_dir(ram, inode_start,dirs,15); // get dir
@@ -268,7 +269,7 @@ int ext2_filename_to_inode_traverse(uint8_t *ram, char *path,int inode_start)
{
if(true==strcmp(first,dirs[i].name,0))
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"found: %s (%s)",first,dirs[i].type==FS_FILE_TYPE_DIR?"dir":"file");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"found: %s (%s)",first,dirs[i].type==FS_FILE_TYPE_DIR?"dir":"file");
if(final)return dirs[i].inode;
return ext2_filename_to_inode_traverse(ram,last+1,dirs[i].inode);
}
@@ -299,7 +300,7 @@ int ext2_filename_to_inode(uint8_t *ram, char *path)
int ext2_read_dir(uint8_t *ram, int inode_nr,fs_dirent *dirs,int max)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"read_dir : max: %d",max);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"read_dir : max: %d",max);
ext2_inode inode=ext2_get_inode(ram,inode_nr);
char buf[256];
diff --git a/kernel/config.h b/kernel/config.h
index fb68dec..17b5f27 100644
--- a/kernel/config.h
+++ b/kernel/config.h
@@ -8,11 +8,11 @@
#define FOOLOS_CONFIG_H
#define FOOLOS_CONSOLE_AUTOBREAK // add newline automatically at end of line
-#define FOOLOS_LOG_OFF // do not log anything
+//#define FOOLOS_LOG_OFF // do not log anything
#define FOOLOS_CONSOLE // otherwise VESA will be used!
#define MEM_PRINT_MEMORYMAP
#define LOG_BUF_SIZE 4069
-#define LOG_SYSCALLS
+//#define LOG_SYSCALLS
#endif
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 8adbf37..64c87c0 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -45,7 +45,7 @@ void kernel_main(uint32_t initial_stack, int mp)
//
// Activate Virtual Memory (paging)
// 0x8048000 is where user programms start!
- vmem_init();
+ pdirectory *dir=vmem_init();
//
// init output to screen
@@ -93,12 +93,7 @@ void kernel_main(uint32_t initial_stack, int mp)
// Initialize Multitasking
//
- task_init(); //; this will never return!
-
-
-
-
-
+ task_init(dir); //; this will never return!
}
diff --git a/kernel/mem.c b/kernel/mem.c
index 68a08d2..bd0d143 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -29,6 +29,11 @@ char *memmap_type_to_string[]=
"Bad Memory"
};
+uint32_t mem_get_free_blocks_count()
+{
+ return mem_free_blocks;
+}
+
// bit funcs!
void mmap_set(int bit)
{
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 44b04bd..ed895b2 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -9,7 +9,6 @@
#include "kernel/config.h"
#include <sys/stat.h>
-static uint32_t alloc; // TODO: implement on a per process basis!
int syscall_unhandled(int nr)
{
@@ -122,35 +121,45 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max)
int syscall_execve(char *name, char **argv1, char **env1)
{
- char *argv[]={"/bin/foolshell",NULL};
- char *env[]={"PATH=/bin","PWD=/home/miguel","PS1=$ ",NULL};
#ifdef LOG_SYSCALLS
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv,env);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv1,env1);
#endif
+ uint32_t alloc;
uint32_t entry=load_elf(name,&alloc);
+
if(!entry)
{
+ #ifdef LOG_SYSCALLS
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve: bailing out!");
+ #endif
return -1; // errror loading
}
+ asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start.
+
+ char *argv[]={"/bin/foolshell",NULL};
+ char *env[]={"PATH=/bin","TERM=xterm","PWD=/home/miguel","PS1=$ ",NULL};
int i=0;
do{
+ #ifdef LOG_SYSCALLS
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env[i],env[i]);
+ #endif
i++;
}while(env[i]!=NULL);
int argc=0;
do{
+ #ifdef LOG_SYSCALLS
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg %d : 0x%08X : %s" ,argc,argv[argc],argv[argc]);
+ #endif
argc++;
}while(argv[argc]!=NULL);
- asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start.
-
+ task_set_brk(alloc);
+
asm("push %0" :: "r" (argv));
asm("push %0" :: "r" (argc));
asm("push %0" :: "r" (env));
@@ -202,8 +211,10 @@ int syscall_isatty(int file,int none1,int none2)
// TODO: per process basis!
uint32_t syscall_sbrk(int incr, int none1, int none2)
{
+ uint32_t alloc=task_get_brk();
uint32_t oldalloc=alloc;
alloc+=incr;
+ task_set_brk(alloc);
#ifdef LOG_SYSCALLS
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sbrk (incr=%d) = 0x%08X", incr,oldalloc);
diff --git a/kernel/task.c b/kernel/task.c
index ac54dbe..586340b 100644
--- a/kernel/task.c
+++ b/kernel/task.c
@@ -9,6 +9,7 @@
#include "console.h"
#include "x86.h"
+#include "vmem.h"
#include "syscalls.h"
#include "fs/fs.h"
#include "fs/ext2.h"
@@ -24,9 +25,10 @@ static volatile struct task_list_struct
int parent;
bool active;
uint32_t esp; // stack pointer of the task;
- uint32_t vmem; // number of virtual memory table to switch to
+ pdirectory *vmem; // number of virtual memory table to switch to
bool waiting;
bool skipwait;
+ uint32_t brk;
}volatile task_list[MAX_TASKS];
@@ -44,6 +46,7 @@ int add_task(uint32_t esp, uint32_t vmem)
task_list[i].active=true;
task_list[i].waiting=false;
task_list[i].skipwait=false;
+ task_list[i].brk=task_list[current_task].brk;
return i;
}
@@ -97,6 +100,7 @@ uint32_t task_exit(uint32_t oldesp)
int parent_pid=task_list[current_task].parent;
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] exit ", current_task);
+
if(task_list[parent_pid].active)
{
if(task_list[parent_pid].waiting)
@@ -113,6 +117,8 @@ uint32_t task_exit(uint32_t oldesp)
}
+ vmem_free_dir(task_list[current_task].vmem);
+
return my_scheduler(oldesp);
}
@@ -134,18 +140,18 @@ uint32_t task_wait(uint32_t oldesp)
uint32_t task_fork(uint32_t oldesp)
{
int pid=add_task(oldesp,vmem_new_space_dir(task_list[current_task].vmem));
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] forked -> [%d]", current_task, pid);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] forked -> [%d] (free blocks remaining: %d )", current_task, pid,mem_get_free_blocks_count());
return pid;
}
// init task (root of all other tasks / processes) //
-void task_init()
+void task_init(pdirectory *dir)
{
// this is our main task on slot 0
task_list[0].parent=0;
task_list[0].active=true;
task_list[0].waiting=false;
- task_list[0].vmem=0;
+ task_list[0].vmem=dir;
task_list[0].esp = 0; // will be set by next task_switch_next() call.
current_task=0;
@@ -160,4 +166,13 @@ int task_get_current_pid()
return current_task;
}
+uint32_t task_get_brk()
+{
+ return task_list[current_task].brk;
+}
+void task_set_brk(uint32_t brk)
+{
+ task_list[current_task].brk=brk;
+}
+
diff --git a/kernel/task.h b/kernel/task.h
index 27e0484..c934d6d 100644
--- a/kernel/task.h
+++ b/kernel/task.h
@@ -1 +1 @@
-void task_init();
+void task_init(pdirectory *dir);
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 0cea40b..3acb806 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -1,12 +1,14 @@
// http://www.brokenthorn.com/Resources/OSDev18.html
+//
+#include <stdlib.h>
#include "kernel.h"
#include "x86.h"
#include "mem.h"
+#include "vmem.h"
#include "lib/logger/log.h" // logger facilities
#define FOOLOS_MODULE_NAME "vmem"
-
// TODO : why is the frame not 0xfffff??
enum PAGE_PTE_FLAGS
{
@@ -40,12 +42,6 @@ enum PAGE_PDE_FLAGS
I86_PDE_FRAME = 0xFFFFF000 //1111111111111111111000000000000
};
-//! page table entry
-typedef uint32_t pt_entry;
-
-//! a page directery entry
-typedef uint32_t pd_entry;
-
////
//! virtual address
@@ -53,41 +49,6 @@ typedef uint32_t virtual_addr;
typedef uint32_t physical_addr;
typedef uint8_t bool;
-
-//! i86 architecture defines 1024 entries per table--do not change
-#define PAGES_PER_TABLE 1024
-#define PAGES_PER_DIR 1024
-
-#define PAGE_DIRECTORY_INDEX(x) (((x) >> 22) & 0x3ff)
-#define PAGE_TABLE_INDEX(x) (((x) >> 12) & 0x3ff)
-#define PAGE_GET_PHYSICAL_ADDRESS(x) (*x & ~0xfff)
-
-//! page table represents 4mb address space
-#define PTABLE_ADDR_SPACE_SIZE 0x400000
-
-//! directory table represents 4gb address space
-#define DTABLE_ADDR_SPACE_SIZE 0x100000000
-
-//! page sizes are 4k
-#define PAGE_SIZE 4096
-
-//! page table
-typedef struct ptable_struct {
-
- pt_entry m_entries[PAGES_PER_TABLE];
-}ptable ;
-
-//! page directory
-typedef struct pdirectory_struct {
-
- pd_entry m_entries[PAGES_PER_DIR];
-}pdirectory;
-
-#define MAX_PAGEDIRS 10
-pdirectory *page_dirs[MAX_PAGEDIRS];
-int next_page_dir=0;
-int current_dir=0;
-
////
void pt_entry_add_attrib (pt_entry* e, uint32_t attrib)
@@ -210,57 +171,17 @@ pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr)
return 0;
}
-
-// TODO !? http://www.brokenthorn.com/Resources/OSDev18.html
-/*
-void vmmngr_map_page (void* phys, void* virt)
+void vmem_free_dir(pdirectory *dir)
{
-
}
-
-void show_cr()
-{
-
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr0: 0x%08x",x86_get_cr0());
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr1: 0x%08x",x86_get_cr1());
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr2: 0x%08x",x86_get_cr2());
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr3: 0x%08x",x86_get_cr3());
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr4: 0x%08x",x86_get_cr4());
-
-}
-
-uint32_t vmem_alloc_block_at(uint32_t virt_addr)
-{
-
- uint32_t phys_addr=pmmngr_alloc_block(); // get free space from the memory manager
- if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce");
- pdirectory* dir = page_dirs[current_dir];
- pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
- if(entry==0)panic(FOOLOS_MODULE_NAME,"no table present at requested addr :(");
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"found entry at %08X",entry);
-
- //! create a new page
- pt_entry page=0;
- pt_entry_add_attrib (&page, I86_PTE_PRESENT);
- pt_entry_add_attrib (&page, I86_PTE_WRITABLE);
- pt_entry_set_frame (&page, phys_addr);
-
- //! ...and add it to the page table
- ptable *table=pt_entry_get_frame(entry);
- table->m_entries [PAGE_TABLE_INDEX (virt_addr) ] = page;
- return phys_addr;
-
-}
-*/
-
// vmem init and also copies all the shit for FORK
-volatile int vmem_new_space_dir(int copy_dir)
+pdirectory* vmem_new_space_dir(pdirectory *copy_dir)
{
x86_paging_disable();
pdirectory* dir = (pdirectory*) pmmngr_alloc_block ();
if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory");
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"pdirectory: 0x%X",dir);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"new pdirectory: 0x%X",dir);
for(int i=0;i<1024;i++)dir->m_entries [i]=0;
@@ -275,7 +196,7 @@ volatile int vmem_new_space_dir(int copy_dir)
ptable* table;
// create new tables on init
- if(next_page_dir==0)
+ if(copy_dir==NULL)
{
// alloc space for our new table
table = (ptable*) pmmngr_alloc_block ();
@@ -305,7 +226,7 @@ volatile int vmem_new_space_dir(int copy_dir)
else
{
dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]=
- page_dirs[0]->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
+ copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)];
}
@@ -319,12 +240,12 @@ volatile int vmem_new_space_dir(int copy_dir)
{
ptable* table = (ptable*) pmmngr_alloc_block ();
- pd_entry *oldentry= &(page_dirs[copy_dir]->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]);
+ pd_entry *oldentry= &(copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]);
ptable* oldtable=pd_entry_get_frame(oldentry);
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"oldtable at: 0x%08X",oldtable);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"oldtable at: 0x%08X",oldtable);
if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"alloc table: %08X",table);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"alloc table: %08X",table);
for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
{
@@ -332,7 +253,7 @@ volatile int vmem_new_space_dir(int copy_dir)
if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce for frame");
// if this is not init , copy contents from current space!
- if(next_page_dir!=0)
+ if(copy_dir!=NULL)
{
uint32_t addr_old=pt_entry_get_frame(&oldtable->m_entries[PAGE_TABLE_INDEX(virt)]);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"physical memcpy(0x%08X,0x%08X,4096)",phys_addr, addr_old);
@@ -363,33 +284,24 @@ volatile int vmem_new_space_dir(int copy_dir)
}
- page_dirs[next_page_dir]=dir;
- if(next_page_dir!=0)x86_paging_enable();
- return next_page_dir++;
+ if(copy_dir!=NULL)x86_paging_enable();
+ return dir;
}
-void vmem_set_dir(int dir)
+void vmem_set_dir(pdirectory *dir)
{
- x86_set_pdbr(page_dirs[dir]);
- current_dir=dir;
+ x86_set_pdbr(dir);
}
-void vmem_init()
+pdirectory* vmem_init()
{
- //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging");
- vmem_set_dir(vmem_new_space_dir(0));
+ pdirectory *dir=vmem_new_space_dir(0);
+ vmem_set_dir(dir);
x86_paging_enable();
-
+ return dir;
}
-
-
-
-
-
-
-
diff --git a/kernel/vmem.h b/kernel/vmem.h
index 5d35a30..7c7ffd0 100644
--- a/kernel/vmem.h
+++ b/kernel/vmem.h
@@ -1 +1,37 @@
-void vmem_init();
+//! i86 architecture defines 1024 entries per table--do not change
+#define PAGES_PER_TABLE 1024
+#define PAGES_PER_DIR 1024
+
+#define PAGE_DIRECTORY_INDEX(x) (((x) >> 22) & 0x3ff)
+#define PAGE_TABLE_INDEX(x) (((x) >> 12) & 0x3ff)
+#define PAGE_GET_PHYSICAL_ADDRESS(x) (*x & ~0xfff)
+
+//! page table represents 4mb address space
+#define PTABLE_ADDR_SPACE_SIZE 0x400000
+
+//! directory table represents 4gb address space
+#define DTABLE_ADDR_SPACE_SIZE 0x100000000
+
+//! page sizes are 4k
+#define PAGE_SIZE 4096
+
+//! page table entry
+typedef uint32_t pt_entry;
+
+//! a page directery entry
+typedef uint32_t pd_entry;
+
+
+//! page table
+typedef struct ptable_struct {
+
+ pt_entry m_entries[PAGES_PER_TABLE];
+}ptable ;
+
+//! page directory
+typedef struct pdirectory_struct {
+
+ pd_entry m_entries[PAGES_PER_DIR];
+}pdirectory;
+
+pdirectory* vmem_init();
diff --git a/lib/logger/log.h b/lib/logger/log.h
index bbe4c64..da27340 100644
--- a/lib/logger/log.h
+++ b/lib/logger/log.h
@@ -1,6 +1,8 @@
#ifndef FOOLOS_LOG_H
#define FOOLOS_LOG_H
+#define FOOLOS_LOG_ERROR 5
+#define FOOLOS_LOG_WARNING 4
#define FOOLOS_LOG_INFO 3
#define FOOLOS_LOG_DEBUG 2
#define FOOLOS_LOG_FINE 1