summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile9
-rw-r--r--kernel/kernel.c11
-rw-r--r--kernel/spinlock.c1
-rw-r--r--kernel/task.c21
-rw-r--r--kernel/vmem.c129
-rw-r--r--lib/string/string.c9
-rw-r--r--lib/string/string.h1
7 files changed, 149 insertions, 32 deletions
diff --git a/Makefile b/Makefile
index 1953ff3..796728f 100644
--- a/Makefile
+++ b/Makefile
@@ -14,6 +14,7 @@
############ some constants ############
+
#submodules
SUBDIRS=boot1 boot2 font userspace
@@ -29,7 +30,7 @@ CC=i686-foolos-gcc
############ compiler flags ############
CFLAGS=
#CFLAGS+=-fstack-protector-all
-#CFLAGS+=-w
+CFLAGS+=-w
CFLAGS+=-ffreestanding
CFLATS+=-Wall
CFLAGS+=-Wextra
@@ -50,7 +51,11 @@ LDFLAGS=
LDFLAGS+=-nostdlib
LDFLAGS+=-lgcc
-
+#verbosity
+#V = 0
+#CC = @echo "Compiling $<..."; i686-foolos-gcc
+#CC_1 = $(CCC)
+#CC = $(CC_$(V))
############ source and object files and their deps ############
diff --git a/kernel/kernel.c b/kernel/kernel.c
index b03e3cd..72af85d 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -67,7 +67,7 @@ void kernel_main(uint32_t initial_stack, int mp)
//
// Activate Virtual Memory (paging)
// 0x8048000 is where user programms start!
- //vmem_init();
+ vmem_init();
//
// init output to screen
@@ -83,7 +83,10 @@ void kernel_main(uint32_t initial_stack, int mp)
//
int_init(0x08);
- //while(1);
+ vmem_set_dir(vmem_new_space_dir());
+
+
+ while(1);
/* char *mem=0x88047000;
@@ -107,8 +110,8 @@ void kernel_main(uint32_t initial_stack, int mp)
*/
- task_init();
- while(1);
+// task_init();
+// while(1);
// load and run foolshell
// we will come back into the kernel only on interrupts...
diff --git a/kernel/spinlock.c b/kernel/spinlock.c
index 945d8ee..11ea069 100644
--- a/kernel/spinlock.c
+++ b/kernel/spinlock.c
@@ -33,3 +33,4 @@ void lock_release(spinlock i)
asm("movb $0,%0"::"m"(*addr));
}
+
diff --git a/kernel/task.c b/kernel/task.c
index 2b964ee..a7f5bc2 100644
--- a/kernel/task.c
+++ b/kernel/task.c
@@ -92,16 +92,11 @@ uint32_t task_switch_next(uint32_t oldesp)
// task testing //
-
-volatile int c1,c2;
-
volatile void test1()
{
while(1)
{
- c1++;
syscall_write(1,">",1);
- sleep(1);
}
}
@@ -109,9 +104,18 @@ volatile void test2()
{
while(1)
{
- c2++;
- syscall_write(1,"<",1);
- sleep(1);
+ for(int i='a';i<='z';i++)
+ {
+ syscall_write(1,&i,1);
+ }
+ }
+
+}
+volatile void test3()
+{
+ while(1)
+ {
+ syscall_write(1," ",1);
}
}
@@ -119,6 +123,7 @@ void task_init()
{
task_create(0,test1);
task_create(1,test2);
+ task_create(2,test3);
current_task=-1;
}
diff --git a/kernel/vmem.c b/kernel/vmem.c
index f9d6050..3d62e97 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -83,6 +83,13 @@ typedef struct pdirectory_struct {
pd_entry m_entries[PAGES_PER_DIR];
}pdirectory;
+#define MAX_PAGEDIRS 10
+pdirectory *page_dirs[MAX_PAGEDIRS];
+int last_page_dir=0;
+int current_dir=0;
+
+////
+
void pt_entry_add_attrib (pt_entry* e, uint32_t attrib)
{
*e|=attrib;
@@ -98,6 +105,13 @@ void pt_entry_set_frame (pt_entry* e , physical_addr addr)
*e|=I86_PTE_FRAME&addr;
}
+physical_addr pt_entry_get_frame (pt_entry* e)
+{
+ // *e = (*e & ~I86_PTE_FRAME) | addr;
+
+ return *e&I86_PTE_FRAME;
+
+}
bool pt_entry_is_present (pt_entry e)
{
return e&I86_PTE_PRESENT;
@@ -158,6 +172,7 @@ void pd_entry_enable_global (pd_entry e)
}
*/
+
uint8_t vmmngr_alloc_page (pt_entry* e)
{
@@ -208,6 +223,30 @@ void show_cr()
}
+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;
+
+}
+
+
void vmem_init()
{
//log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase);
@@ -227,7 +266,6 @@ void vmem_init()
{
ptable* table = (ptable*) pmmngr_alloc_block ();
-
if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
// log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table: 0x%X",table);
@@ -256,10 +294,7 @@ void vmem_init()
}
- // programm space starts at 0x8048000 and let us reserve 4mb per programm!
- // lets start to build the directory for one single programm
-// uint32_t phys_addr=0;
-
+ // programm space (for init)
virt_addr=0x8048000;
for(int j=0;j<5;j++)
{
@@ -269,12 +304,11 @@ void vmem_init()
for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
{
- phys_addr=pmmngr_alloc_block(); // get free space from the memory manager
+ phys_addr=pmmngr_alloc_block(); // get free space from the memory manager
if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce for frame");
int frame=phys_addr;
-
//! create a new page
pt_entry page=0;
pt_entry_add_attrib (&page, I86_PTE_PRESENT);
@@ -295,28 +329,87 @@ void vmem_init()
}
- x86_set_pdbr(dir);
+ page_dirs[last_page_dir++]=dir;
+
+ x86_set_pdbr(dir);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"enabling paging...");
-
- show_cr();
-
x86_paging_enable();
- //vesa_set_physbase(vesa_mapped);
-
- show_cr();
-
}
-void set_vmem1()
+void vmem_set_dir(int dir)
{
-
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"set pagedir to %d",dir);
+ x86_set_pdbr(page_dirs[dir]);
+ current_dir=dir;
}
-void set_vmem2()
+
+int vmem_new_space_dir()
{
+ uint32_t vaddr=vmem_alloc_block_at(0xF0000000);
+ return 0;
+ pdirectory* dir = vaddr;
+ if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory");
+
+ for(int i=0;i<1024;i++)dir->m_entries [i]=0;
+ // first clone the kernel space!
+ for(int i=0;i<3;i++)
+ {
+ dir->m_entries[i]=page_dirs[0]->m_entries[i];
+
+
+ }
+ return 0;
+
+ // programm space starts at 0x8048000 and let us reserve 4mb per programm!
+ // lets start to build the directory for one single programm
+ // uint32_t phys_addr=0;
+ /*
+ uint32_t virt_addr=0x8048000;
+ uint32_t phys_addr;
+ for(int j=0;j<5;j++)
+ {
+
+ ptable* table = (ptable*) pmmngr_alloc_block ();
+ if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
+
+ for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
+ {
+ phys_addr=pmmngr_alloc_block(); // get free space from the memory manager
+ memcpy(phys_addr,virt_addr,4096); // duplicate current contents of this space!
+ //
+ if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce for frame");
+
+ int frame=phys_addr;
+
+
+ //! 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, frame);
+
+ //! ...and add it to the page table
+ table->m_entries [PAGE_TABLE_INDEX (virt) ] = page;
+ }
+
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
+ *entry=0;
+ pd_entry_add_attrib (entry, I86_PDE_PRESENT);
+ pd_entry_add_attrib (entry, I86_PDE_WRITABLE);
+ pd_entry_set_frame (entry, (physical_addr)table);
+
+ virt_addr+=1024*4096;
+
+ }
+ */
+ page_dirs[last_page_dir]=dir;
+ return last_page_dir++;
}
+
+
diff --git a/lib/string/string.c b/lib/string/string.c
index d5c27f7..a43210a 100644
--- a/lib/string/string.c
+++ b/lib/string/string.c
@@ -18,3 +18,12 @@ bool strcmp(char *str1, char *str2, int length)
}
}
+
+void* memcpy(void* restrict dstptr, const void* restrict srcptr, int size)
+{
+ unsigned char* dst = (unsigned char*) dstptr;
+ const unsigned char* src = (const unsigned char*) srcptr;
+ for ( int i = 0; i < size; i++ )
+ dst[i] = src[i];
+ return dstptr;
+}
diff --git a/lib/string/string.h b/lib/string/string.h
index 23c9010..5caf0c2 100644
--- a/lib/string/string.h
+++ b/lib/string/string.h
@@ -1,2 +1,3 @@
#include "lib/bool/bool.h"
bool strcmp(char *str1, char *str2, int length);
+void* memcpy(void* restrict dstptr, const void* restrict srcptr, int size);