]> Zhao Yanbai Git Server - kernel.git/commitdiff
rewrite scheduler
authorAceVest <zhaoyanbai@126.com>
Sun, 27 Jul 2014 11:20:18 +0000 (19:20 +0800)
committerAceVest <zhaoyanbai@126.com>
Sun, 27 Jul 2014 11:20:18 +0000 (19:20 +0800)
12 files changed:
Makefile
bin/hello.c
bin/shell.c
include/printk.h
include/syscall.h
include/task.h
kernel/exec.c
kernel/init.c
kernel/sched.c
kernel/syscall.c
lib/exec.c
lib/syscall.c

index 45a147ec90b55a59c25488547d5d3651b854ea67..39b76d612961b3f3dffcca6b4ce3ad41c061a43b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -40,5 +40,6 @@ install:
        cp bin/hello /kernel/bin/
        cp bin/shell /kernel/bin/
 cp:
+       cd bin && make clean
        cd bin && make
        ./scripts/copy.sh
index 917720f07aaaa9aca865e8c754ee16a8526c414b..532fe4bb172204ee69796ebd39267a4cf45d8e90 100644 (file)
 int main()
 {
     printf("hello world\n");
-    //syscall3(SYSC_WRITE, 0, "fuck", 5);
-    //write(0, "hello world", sizeof("hello world"));
-    //write(0, "hello world", 12);
-    
+    while(1);
     exit(0);
 
     return 0;
index 65eeaac6ace306d2f4cc41c649e464a265998bb9..1b3d2517f62c3ef6e9e436c3bd05eea7706748bc 100644 (file)
 #include <string.h>
 
 int systest();
+int sysdebug();
 int main()
 {
-    char x[10];
-    x[0] = 'a';
-    x[1] = 'b';
-    x[2] = 'c';
-    x[3] = '\n';
-#if 1
-    //while(1) write(0, x, 4);
-    //while(1) systest();
     int pid = fork();
 
     if(pid > 0)
     {
-        //write(0, "parent\n", 7);
-        //write(0, x, 4);
+        printf("prarent child pid %u\n", pid);
         while(1)
-        ;    systest();
+        {
+            systest();
+            sysdebug(0x112233);
+        }
     }
     else if(pid == 0)
-#endif
     {
-        //write(0, "child\n", 6);
-        //write(0, x, 4);
+        printf("child\n");
+        execv("/bin/hello", 0);
         while(1)
         {
             systest();
+            sysdebug(0xAABBCCDD);
         }
     }
+    else
+    {
+
+    }
 
     return 0;
 }
index 9527a9f05a965fbeb91a9dd296b221098decd803..ecaf06b6648d2657df9c9ccc06e4b2bb19203f48 100644 (file)
@@ -34,10 +34,17 @@ enum {
     MPL_IDE,
     MPL_IDE_INTR,
     MPL_PREEMPT,
+    MPL_TEST,
+    MPL_DEBUG,
     MPL_ROOT,
     MPL_TASK_1,
     MPL_TASK_2,
-    MPL_TEST,
+    MPL_TASK_3,
+    MPL_TASK_4,
+    MPL_TASK_5,
+    MPL_TASK_6,
+    MPL_TASK_7,
+    MPL_TASK_8,
     MPL_END
 };
 
index 7530188380e0020b4ae7e85cb81330267b390bd9..da40042a8564113c26c11fcc8821a6470472afbd 100644 (file)
@@ -48,7 +48,8 @@ enum
     SYSC_STAT,
     SYSC_EXIT,
     SYSC_PAUSE,
-    SYSC_TEST
+    SYSC_TEST,
+    SYSC_DEBUG
 };
 
 #endif    // ASM
index 35030797d8cc19e12386b755b5ade25a9c8d07b7..9d59ad9419c72d55117d714e3ab715d08160cca8 100644 (file)
@@ -64,6 +64,7 @@ typedef union task_union
 
         //pFile        fps[NR_OPENS];
 
+        unsigned int cnt;   // debug only
     };
 
     unsigned char stack[TASK_SIZE];
@@ -88,7 +89,7 @@ static inline pid_t sysc_getpid()
 
 #define ROOT_TSK_PID    (0)
 
-#define TASK_INIT_WEIGHT 10
+#define TASK_INIT_WEIGHT 0
 
 #define get_tsk_from_list(p)    list_entry((p), Task, list)
 #define del_tsk_from_list(tsk)    list_del((&tsk->list))
index 393e29e5dfaf09b2bee851767cd13f01f2dc34f5..04e84de2f47c9fe5f5c5145183e866b59d54839e 100644 (file)
@@ -110,7 +110,6 @@ int sysc_exec(const char *path, char *const argv[])
 
     load_cr3(current);
 
-    disable_irq();
 
     pt_regs_t *regs = ((pt_regs_t *)(TASK_SIZE+(unsigned long)current)) - 1;
     memset((void*)regs, 0, sizeof(pt_regs_t));
index 66b6bd5fc5c6f2104ee364ee1a63b5fbaa749446..eb3f6aaef28caf6d48cc7bf01d928819eff555a4 100644 (file)
@@ -42,9 +42,10 @@ void init_task_entry()
 
     while(1)
     {
-        printl(MPL_TASK_1+id-1, "task:%d [%08x] weight %d cnt %d", id, current, current->weight, cnt++);
-        int v = debug_wait_queue_get();
-        printk("task:%d wait queue get %d\n", id, v);
+        sysc_test();
+        //printl(MPL_TASK_1+id-1, "task:%d [%08x] weight %d cnt %d", id, current, current->weight, cnt++);
+        int v = 0; //debug_wait_queue_get();
+        //printk("task:%d wait queue get %d\n", id, v);
     }
 }
 
@@ -68,7 +69,8 @@ void root_task_entry()
     int cnt = 0;
     while(1)
     {
-        printl(MPL_ROOT, "root:0 [%08x] weight %d cnt %d", current, root_task.weight, cnt++);
+        sysc_test();
+        //printl(MPL_ROOT, "root:0 [%08x] weight %d cnt %d", current, root_task.weight, cnt++);
         asm("sti;hlt;");
         //sysc_test();
         //syscall0(SYSC_TEST);
index d8acd7311f92a4bf8df1b02941e275e2c5f7baea..cb864b161b98a668d3626bb883166882fd09fad0 100644 (file)
@@ -126,12 +126,11 @@ inline void context_switch(task_union * prev, task_union * next)
 
 unsigned long schedule()
 {
+    static turn = 0;
     task_union *sel = &root_task;
     task_union *p = 0;
     list_head_t *pos = 0, *t=0;
 
-    unsigned int max_weight = 0;
-
     unsigned long iflags;
     irq_save(iflags);
     list_for_each_safe(pos, t, &root_task.list)
@@ -140,32 +139,33 @@ unsigned long schedule()
 
         if(p->state != TASK_RUNNING)
         {
-            if(p->state == TASK_EXEC)
-                p->state = TASK_RUNNING;
             continue;
         }
 
-        if(p->weight > max_weight)
-        {
-            max_weight = p->weight;
-            sel = p;
-        }
+        printd("%08x weight %d\n", p, p->weight);
 
-        else if(p->weight == 0)
+        if(p->weight != turn)
         {
-            p->weight = TASK_INIT_WEIGHT;
+            p->weight = turn;
+            sel = p;
+            break;
         }
     }
     irq_restore(iflags);
 
-    sel->weight--;
+    if(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;
 
     if(prev != next)
     {
-        printd("select %08x\n", next);
+        printd("[s:%08x]\n", next);
         context_switch(prev, next);
     }
 }
index 3c7292d2fd0fd7c014c2f15b1a7c61bf7a0046a0..5c658d5613c58cfbd89aec1622b5cfa4b7072253 100644 (file)
@@ -51,10 +51,15 @@ int sysc_pause()
 int sysc_test()
 {
     static unsigned int cnt=0;
-    printl(MPL_TEST, "sysc_test %u", cnt++);
+    current->cnt++;
+    printl(MPL_TEST, "sysc_test cnt %u current %08x cnt %u",
+           cnt++, current, current->cnt);
+}
 
-    //unsigned long *pde = (unsigned long *)current->cr3;
-    //printk("sysctest %08x\n", pde[797]);
+int sysc_debug(unsigned int v)
+{
+    static unsigned int cnt=0;
+    printl(MPL_DEBUG, "Task Debug Syscall %u Value %08x", cnt++, v);
 }
 
 void    init_sysc_handler_table()
@@ -80,6 +85,7 @@ void    init_sysc_handler_table()
     _sysc_(SYSC_EXIT,        sysc_exit);
     _sysc_(SYSC_PAUSE,       sysc_pause);
     _sysc_(SYSC_TEST,        sysc_test);
+    _sysc_(SYSC_DEBUG,       sysc_debug);
 }
 
 int sysc_bad_syscnr()
index d693fe1aa9a959c3b003e28e1ab59c86eaa45620..17453b9913cef3716db3917d939534eefcbf94df 100644 (file)
@@ -20,3 +20,9 @@ int systest()
 {
     return syscall0(SYSC_TEST);
 }
+
+int sysdebug(unsigned int v)
+{
+    //return syscall1(SYSC_DEBUG, v);
+    return syscall1(SYSC_DEBUG, 1);
+}
index 0cfa8d19b6199a55dc96262f902a5806943556d5..7ca142038d147305ec124d9030f9ddc14d56fadc 100644 (file)
@@ -10,7 +10,7 @@
 // "movl     $1f, %%edi;"
 //
 #define SYSENTER_ASM            \
-        "pushl  $1f;"   \
+        "pushl    $1f;"         \
         "pushl    %%ecx;"       \
         "pushl    %%edx;"       \
         "pushl    %%ebp;"       \