summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-27 00:29:45 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-27 00:29:45 +0100
commit0e402637492f34a4d0e1302fbe34344e19bc4813 (patch)
tree6c42e23b23f5bb703d27700e96444224e2eb87e2
parent7393db6692c861bc66164c0dd9b83f23a554775b (diff)
Progs at vmem=0x8048000 and Improved Console Ouput
-rw-r--r--kernel/console.c11
-rw-r--r--kernel/console.h9
-rw-r--r--kernel/kernel.c20
-rw-r--r--kernel/mem.c4
-rw-r--r--kernel/syscalls.c40
-rw-r--r--kernel/task.c2
-rw-r--r--kernel/vmem.c38
-rw-r--r--lib/logger/log.c8
-rw-r--r--video/console.c14
-rw-r--r--video/console.h4
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