diff options
| -rw-r--r-- | Makefile | 9 | ||||
| -rw-r--r-- | kernel/kernel.c | 11 | ||||
| -rw-r--r-- | kernel/spinlock.c | 1 | ||||
| -rw-r--r-- | kernel/task.c | 21 | ||||
| -rw-r--r-- | kernel/vmem.c | 129 | ||||
| -rw-r--r-- | lib/string/string.c | 9 | ||||
| -rw-r--r-- | lib/string/string.h | 1 |
7 files changed, 149 insertions, 32 deletions
@@ -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); |
