]> Zhao Yanbai Git Server - kernel.git/commitdiff
add simple shell
authorAceVest <zhaoyanbai@126.com>
Thu, 31 Jul 2014 16:37:24 +0000 (00:37 +0800)
committerAceVest <zhaoyanbai@126.com>
Thu, 31 Jul 2014 16:37:24 +0000 (00:37 +0800)
bin/shell.c
drivers/console.c
drivers/console.h
fs/ext2.c
kernel/exit.c
kernel/fork.c
kernel/sched.c
kernel/setup.c
kernel/wait.c

index 746ff2b123bf26ff9b57d4abc8c12a7214ef8e75..5b62fd5e73c6d041db276bf3bfe13b76f11457a7 100644 (file)
@@ -18,20 +18,40 @@ int sysdebug();
 int pause(unsigned long tick);
 int main()
 {
+
+    while(1)
+    {
+        printf("shell#");
+        char buf[256];
+        read(0, buf, 256);
+
+        int pid = fork();
+        if(pid > 0)
+        {
+            wait(pid);
+        }
+        else
+        {
+            execv(buf, 0);
+        }
+    }
+
+
+
     int pid = fork();
     printf("pid %u\n", pid);
     if(pid > 0)
     {
+        printf("parent. child pid %u\n", pid);
         while(1) {
-            printf("parent. child pid %u\n", pid);
             systest();
             sysdebug(0x44444444);
         }
     }
     else
     {
+        printf("child\n");
         while(1) {
-            printf("child\n");
             systest();
             sysdebug(0xAABBCCDD);
         }
index 045571dc16e1e5b9044e71fbc6125686aea4d2d7..f2f7ea30c3bef15b0710dc6929c7fab1ef81fe94 100644 (file)
@@ -82,10 +82,13 @@ void cnsl_init()
 
 int cnsl_kbd_write(char ch)
 {
+    if(ch == 0)
+        return 0;
+
     if(ch == '\b')
     {
         if(!empty(&cnsl.wr_q))
-            vga_putc(0, '\b', 0x2);
+            vga_putc(0, '\b', 0xF);
         erase(&cnsl.wr_q);
         erase(&cnsl.sc_q);
     }
@@ -93,7 +96,7 @@ int cnsl_kbd_write(char ch)
     {
         put(&cnsl.wr_q, ch);
         put(&cnsl.sc_q, ch);
-        vga_putc(0, ch, 0x2);
+        vga_putc(0, ch, 0xF);
     }
 
 
@@ -104,20 +107,6 @@ int cnsl_kbd_write(char ch)
             put(&cnsl.rd_q, ch);
         wake_up(&rdwq);
     }
-
-#if 0
-    printl(23, "rd: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
-    cnsl.rd_q.data[0],
-    cnsl.rd_q.data[1],
-    cnsl.rd_q.data[2],
-    cnsl.rd_q.data[3],
-    cnsl.rd_q.data[4],
-    cnsl.rd_q.data[5],
-    cnsl.rd_q.data[6],
-    cnsl.rd_q.data[7],
-    cnsl.rd_q.data[8],
-    cnsl.rd_q.data[9]);
-#endif
 }
 
 
@@ -143,7 +132,8 @@ int cnsl_read(char *buf, size_t count)
 
             if(r)
             {
-                buf[cnt++] = ch;
+                if(ch != '\n')
+                    buf[cnt++] = ch;
 
                 task->state = TASK_RUNNING;
                 del_wait_queue(&rdwq, &wait);
index 26ba40c44bc6c2daa4f219f3ec1a9aa17e27a017..a51fe67958ec3b101ba95ebcda85367ff74140c1 100644 (file)
@@ -11,7 +11,7 @@
 
 #include<wait.h>
 
-#define CNSL_QUEUE_SIZE 10
+#define CNSL_QUEUE_SIZE 1024
 
 typedef struct cnsl_queue
 {
index f29e731bb3af954b059fb11b564004f215ffe45f..06c060e8f527cc9bbc3c7a0b5562c073363fee63 100644 (file)
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -54,7 +54,7 @@ void ext2_read_inode(unsigned int ino, ext2_inode_t *inode)
     void *blk = ext2_alloc_block();
     assert(blk != 0);
 
-    printk("read_inode %u\n", ino);
+    printd("read_inode %u\n", ino);
 
     unsigned int in;    // inode number
     unsigned int gn;    // group number
@@ -75,7 +75,7 @@ void ext2_read_inode(unsigned int ino, ext2_inode_t *inode)
 
     memcpy(inode, blk+inoff, sizeof(ext2_inode_t));
 
-    printk(" inode size %u \n", inode->i_size);
+    printd(" inode size %u \n", inode->i_size);
 
     ext2_free_block(blk);
 }
@@ -115,12 +115,12 @@ void ext2_read_data(const ext2_inode_t *inode, unsigned int offset, size_t size,
     assert(inode->i_size > 0 && inode->i_size<=MAX_SUPT_FILE_SIZE);
     assert(offset+size <= inode->i_size);
     assert(offset % EXT2_BLOCK_SIZE == 0);  // for easy
-    printk("offset %x size %x  %x\n", offset, size, offset+size);
+    printd("offset %x size %x  %x\n", offset, size, offset+size);
     assert((offset+size) % EXT2_BLOCK_SIZE == 0);
 
     unsigned int blkid  = offset / EXT2_BLOCK_SIZE;
     unsigned int blkcnt = size   / EXT2_BLOCK_SIZE;
-    printk("id %u cnt %u\n", blkid, blkcnt);
+    printd("id %u cnt %u\n", blkid, blkcnt);
     BLKRW(inode->i_block[blkid], blkcnt, buf);
 }
 
@@ -191,7 +191,7 @@ unsigned int ext2_search_inpath(const char *path)
     while((len=get_filename_from_path(path, file)) != 0)
     {
         ino = ext2_search_indir(file, inode);
-        assert(ino != 0);
+        //assert(ino != 0);
 
         path += len;
 
@@ -257,7 +257,7 @@ void ext2_setup_fs()
     }
 
     ext2_read_inode(2, &ext2_root_inode);
-#if 1
+#if 0
     printk("root inode.i_size %u \n", ext2_root_inode.i_size);
     printk("root blocks %u \n", ext2_root_inode.i_blocks);
 
index fc1ce7333f9de17504426c3b3125e0def0016e25..9459879763bf7ad3da5991104bc476097fdf9dc6 100644 (file)
 
 #include <sched.h>
 #include <system.h>
+#include <wait.h>
 
 int sysc_exit(int status)
 {
-    // simple implement.
+    unsigned long flags;
+    irq_save(flags);
     current->state = TASK_EXITING;
 
     task_union *t = current;
-    
-    schedule();
+
+    irq_restore(flags);
 
     return 0;
 }
index 968b75fdaf5bc7bfcee38188472af393e9c817a7..8448f198a80056c73092efac6d00f45207f2d47c 100644 (file)
@@ -83,12 +83,6 @@ int do_fork(pt_regs_t *regs, unsigned long flags)
                 printk("----pde[%u] pte_src[%u] %08x\n", i, j, pte_src[j]);
                 page_t *page = pa2page(pte_src[j]);
                 page->count ++;
-                //assert(page->count <= 1);
-                if(page->count > 1)
-                {
-                    printk("page %08x count %d\n", page, page->count);
-                    panic("----");
-                }
             }
 
         }
index 381c098ce50393e184e6a4f495dd0c382449f5cf..7e7cd41c5940c69d908ef7ed33e5d9b5b1e2d85d 100644 (file)
@@ -145,7 +145,7 @@ task_union *find_task(pid_t pid)
 unsigned long schedule()
 {
     static turn = 0;
-    task_union *sel = &root_task;
+    task_union *sel = 0;
     task_union *p = 0;
     list_head_t *pos = 0, *t=0;
 
@@ -155,6 +155,8 @@ unsigned long schedule()
     {
         p = list_entry(pos, task_union, list);
 
+        printl(MPL_ROOT+p->pid, "task:%d [%08x] state %02x TURN %d turn %d cnt %u", p->pid, p, p->state, turn, p->weight, p->cnt);
+
         if(p->state != TASK_RUNNING)
         {
             continue;
@@ -162,21 +164,22 @@ unsigned long schedule()
 
         printd("%08x weight %d\n", p, p->weight);
 
-        if(p->weight != turn)
+
+        if(sel == 0 && p->weight != turn)
         {
             p->weight = turn;
             sel = p;
-            break;
         }
     }
     irq_restore(iflags);
 
-    if(sel == &root_task)
+
+    if(sel == 0)
     {
+        sel = &root_task;
         turn ++;
     }
 
-    printl(MPL_ROOT+sel->pid, "task:%d [%08x] turn %d cnt %u", sel->pid, sel, sel->weight, sel->cnt);
 
     task_union *prev = current;
     task_union *next = sel;
index f3e623f7767040132368d2cef12677c9bacf3e6c..2c2963ab4d34b943eb784f993b146b2a226b6714 100644 (file)
@@ -51,8 +51,9 @@ const char *version =
     "Kernel "
     VERSION
     " Build on "__DATE__ " " __TIME__
-    " by "
-    BUIDER;
+    " @ "
+    BUIDER
+    "\n";
 
 void setup_kernel()
 {
@@ -93,7 +94,8 @@ void setup_kernel()
 
     setup_fs();
 
-    printk("%s\n", version);
-    //vga_dbg_toggle();
+    vga_puts(0, version, 0x2F);
+
+    switch_printk_screen();
 }
 
index 40ac35cfcc4e0d4c9f36e2947ea485cb3e64da98..927806783b9feb9e82d2db3e5d6d6d047d24fcf8 100644 (file)
@@ -96,15 +96,23 @@ int sysc_wait(unsigned long pid)
     if(p == 0)
         return 0;
 
+    if(p->state == TASK_EXITING)
+        return 0;
+
     task_union * task = current;
     DECLARE_WAIT_QUEUE(wait, task);
     add_wait_queue(&p->wait, &wait);
 
     while(true)
     {
-        task->state = TASK_WAIT;
+        //task->state = TASK_WAIT;
         
-        if(p->state == TASK_EXITING)    // no need irq_save
+        unsigned long flags;
+        irq_save(flags);
+        unsigned int state = p->state;
+        irq_restore(flags);
+
+        if(state == TASK_EXITING)    // no need irq_save
             break;
 
         schedule();