diff options
| -rw-r--r-- | kernel/console.c | 11 | ||||
| -rw-r--r-- | kernel/console.h | 9 | ||||
| -rw-r--r-- | kernel/kernel.c | 20 | ||||
| -rw-r--r-- | kernel/mem.c | 4 | ||||
| -rw-r--r-- | kernel/syscalls.c | 40 | ||||
| -rw-r--r-- | kernel/task.c | 2 | ||||
| -rw-r--r-- | kernel/vmem.c | 38 | ||||
| -rw-r--r-- | lib/logger/log.c | 8 | ||||
| -rw-r--r-- | video/console.c | 14 | ||||
| -rw-r--r-- | video/console.h | 4 |
10 files changed, 109 insertions, 41 deletions
diff --git a/kernel/console.c b/kernel/console.c index 564806f..cdd2fc1 100644 --- a/kernel/console.c +++ b/kernel/console.c @@ -10,10 +10,15 @@ #include "video/console.h" void console_init(){scr_clear();} -void console_put_char(char c){scr_put_char(c,SCR_LGREEN);} -void console_put_char_red(char c){scr_put_char(c,SCR_WHITE);} void console_del_char(){scr_backspace();} -void console_put_str(char *s){scr_put_string(s);} +void console_put_char_gray(char c){scr_put_char(c,SCR_GRAY2);} +void console_put_char_white(char c){scr_put_char(c,SCR_WHITE);} +void console_put_char_green(char c){scr_put_char(c,SCR_GREEN);} +void console_put_char_red(char c){scr_put_char(c,SCR_RED);} +void console_put_str_gray(char *s){scr_put_string(s,SCR_GRAY2);} +void console_put_str_white(char *s){scr_put_string(s,SCR_WHITE);} +void console_put_str_green(char *s){scr_put_string(s,SCR_GREEN);} +void console_put_str_red(char *s){scr_put_string(s,SCR_RED);} #else diff --git a/kernel/console.h b/kernel/console.h index a344c90..8d19f77 100644 --- a/kernel/console.h +++ b/kernel/console.h @@ -3,9 +3,14 @@ void console_init(); -void console_put_char(char); +void console_put_char_white(char); void console_put_char_red(char); -void console_put_str(char *); +void console_put_char_green(char); +void console_put_char_gray(char); +void console_put_str_white(char *); +void console_put_str_red(char *); +void console_put_str_green(char *); +void console_put_str_gray(char *); void console_del_char(); diff --git a/kernel/kernel.c b/kernel/kernel.c index 773ebad..ed632c3 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -66,8 +66,8 @@ void kernel_main(uint32_t initial_stack, int mp) // // Activate Virtual Memory (paging) - // - //vmem_init(); + // 0x8048000 is where user programms start! + vmem_init(); // // init output to screen @@ -83,8 +83,14 @@ void kernel_main(uint32_t initial_stack, int mp) // int_init(0x08); - - + //while(1); + + +/* char *mem=0x88047000; + *mem='x'; + + while(1); + */ // // Gather Info about other processors. (APs) @@ -106,8 +112,10 @@ void kernel_main(uint32_t initial_stack, int mp) // load and run foolshell // we will come back into the kernel only on interrupts... - asm("mov $0x05bff,%esp"); // set stack pointer - syscall_execve("/bin/foolshell",0,0); + + static char *argv[]={"/bin/foolshell",NULL}; + static char *env[]={"PATH=/bin","PWD=/home/miguel","PS1=$ ",NULL}; + syscall_execve("/bin/foolshell",argv,env); // diff --git a/kernel/mem.c b/kernel/mem.c index ec99732..68a08d2 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -127,7 +127,7 @@ void* pmmngr_alloc_block () mem_free_blocks--; uint32_t addr = frame * PMMNGR_BLOCK_SIZE; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"alloc block (%d) 0x%08X)",frame,addr); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"alloc block (%d) 0x%08X)",frame,addr); return (void*)addr; } @@ -167,7 +167,7 @@ void pmmngr_free_block (void* p) mem_free_blocks++; } - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"free block (%d) 0x%08X)",frame,addr); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"free block (%d) 0x%08X)",frame,addr); } diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 5939cff..765316b 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -106,7 +106,7 @@ int syscall_write(int file, char *buf, int len) for(int i=0;i<len;i++) { //PutConsoleChar(buf[i],0b1111111111000000); - console_put_char(buf[i]); + console_put_char_green(buf[i]); } return len; } @@ -152,7 +152,7 @@ int syscall_read(int file, char *buf, int len) *buf=c; buf++; l++; - if(c!=0x04)console_put_char_red(c); + if(c!=0x04)console_put_char_white(c); if(c=='\n')return l; if(c==0x04) { @@ -190,7 +190,7 @@ int syscall_execve(char *name, char **argv, char **env) int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,name); if(inode_nr<1)return -1; - +/* char arg1[100]; char arg2[100]; char arg3[100]; @@ -257,15 +257,19 @@ int syscall_execve(char *name, char **argv, char **env) } - +*/ //TODO: load ELF binary and move this to own compilation unit //load binary + uint32_t vaddr=0x08048000; + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"loading"); ext2_check(EXT2_RAM_ADDRESS); - ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,0x800000,0x100000); + 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."); Elf32_Ehdr *elf; - elf=0x800000; + elf=vaddr; if(elf->e_ident[0]!=0x7f||elf->e_ident[1]!='E'||elf->e_ident[2]!='L'||elf->e_ident[3]!='F') panic(FOOLOS_MODULE_NAME,"ELF mismatch!?"); @@ -300,7 +304,7 @@ int syscall_execve(char *name, char **argv, char **env) // iterate over section headers for(int phidx=0;phidx<elf->e_phnum;phidx++) { - Elf32_Phdr *phdr=0x800000+elf->e_phoff+phidx*elf->e_phentsize; + Elf32_Phdr *phdr=vaddr+elf->e_phoff+phidx*elf->e_phentsize; if(phidx==0) { @@ -325,7 +329,7 @@ int syscall_execve(char *name, char **argv, char **env) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"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=0x800000+phdr->p_offset; + uint32_t *data=vaddr+phdr->p_offset; for(uint32_t *addr=phdr->p_vaddr; addr<=phdr->p_vaddr+phdr->p_filesz; addr++) { *addr=*data; @@ -344,18 +348,24 @@ int syscall_execve(char *name, char **argv, char **env) } - + int i=0; do{ - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envvar %d : 0x%08X : %s" ,i,environ[i],environ[i]); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env[i],env[i]); i++; - }while(environ[i]!=NULL); - + }while(env[i]!=NULL); - asm("mov $0xf00000,%esp"); // set stack pointer - asm("push %0" :: "r" (argvcopy)); + int argc=0; + do{ + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg %d : 0x%08X : %s" ,argc,argv[argc],argv[argc]); + argc++; + }while(argv[argc]!=NULL); + + asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start. + + asm("push %0" :: "r" (argv)); asm("push %0" :: "r" (argc)); - asm("push %0" :: "r" (environ)); + asm("push %0" :: "r" (env)); // push addr and return to it asm("push %0"::"r"(elf->e_entry)); diff --git a/kernel/task.c b/kernel/task.c index 7e39a30..08301cf 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -28,7 +28,7 @@ void task_test1() char c; if(ringbuffer_get(&c)) { - console_put_char(c); + console_put_char_white(c); } } diff --git a/kernel/vmem.c b/kernel/vmem.c index c22f764..f9d6050 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -256,6 +256,44 @@ 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; + + virt_addr=0x8048000; + 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 + 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; + + } x86_set_pdbr(dir); diff --git a/lib/logger/log.c b/lib/logger/log.c index d58d2d6..8d69fc3 100644 --- a/lib/logger/log.c +++ b/lib/logger/log.c @@ -40,7 +40,7 @@ void log(char *module_name, int log_level, char *format_string, ...) va_end(va); tfp_sprintf(buf_log,"%s %s: %s\n",buf_time,module_name,buf_info); - console_put_str(buf_log); + console_put_str_gray(buf_log); for(int i=0;buf_log[i]!=0;i++) { @@ -57,7 +57,7 @@ void panic(char *module_name, char *message) { char buf_log[256]; tfp_sprintf(buf_log,"KERNEL PANIC !! %s: %s\n",module_name,message); - console_put_str(buf_log); + console_put_str_red(buf_log); while(1); // halt } @@ -70,10 +70,10 @@ void log_log() char buf_log[256]; tfp_sprintf(buf_log,"[ 0.00000] log: buffer state: first=%d, last=%d, buf_size=%d\n",first,last,LOG_BUF_SIZE); - console_put_str(buf_log); + console_put_str_gray(buf_log); for(int i=first;i!=last;i++) { - console_put_char(buffer[i]); + console_put_char_gray(buffer[i]); } } diff --git a/video/console.c b/video/console.c index 743aaac..4a04cf1 100644 --- a/video/console.c +++ b/video/console.c @@ -66,12 +66,13 @@ void scr_clear() posx=posy=0; } - +/* void scr_put_string_nl(char *str) { scr_put_string(str); scr_nextline(); } +*/ void scr_nextline() { @@ -127,7 +128,7 @@ void scr_put_char(char ch,char col) } - +/* void scr_put_hex(uint16_t val) { @@ -142,9 +143,11 @@ void scr_put_hex(uint16_t val) } -} +} +*/ +/* void scr_put_hex32(uint32_t val) { scr_put_string("["); @@ -153,12 +156,13 @@ void scr_put_hex32(uint32_t val) scr_put_hex(val&0xffff); scr_put_string("]"); } +*/ -void scr_put_string(char *str) +void scr_put_string(char *str, char col) { while(*str!=0) { - scr_put_char(*(str++),SCR_WHITE); + scr_put_char(*(str++),col); } } diff --git a/video/console.h b/video/console.h index 71c3c72..e9eff29 100644 --- a/video/console.h +++ b/video/console.h @@ -38,8 +38,6 @@ void scr_clear(); void scr_nextline(); void scr_backspace(); void scr_put_char(char ch,char col); -void scr_put_string(char *str); -void scr_put_string_nl(char *str); -void scr_put_hex(uint16_t val); +void scr_put_string(char *str, char col); #endif |
