]> Zhao Yanbai Git Server - kernel.git/commitdiff
让user任务进入wait状态
authoracevest <zhaoyanbai@126.com>
Sun, 7 Nov 2021 16:54:28 +0000 (00:54 +0800)
committeracevest <zhaoyanbai@126.com>
Mon, 8 Nov 2021 02:22:40 +0000 (10:22 +0800)
include/list.h
include/sched.h
include/task.h
kernel/clock.c
kernel/sched.c
kernel/setup.c
kernel/syscall.c

index 475e7f38cbd0fd15414ec5cd4ec72df2de6a1999..9ab99fb0bac0ce8ed323844c071637b5338898f3 100644 (file)
@@ -64,7 +64,11 @@ static inline void _list_del(list_head_t *prev, list_head_t *next) {
     prev->next = next;
 }
 
-static inline void list_del(list_head_t *entry) { _list_del(entry->prev, entry->next); }
+static inline void list_del(list_head_t *entry) {
+    _list_del(entry->prev, entry->next);
+    entry->prev = NULL;
+    entry->next = NULL;
+}
 
 static inline void list_del_init(list_head_t *entry) {
     _list_del(entry->prev, entry->next);
index d1cb9990c4330270f825cfb154e35f9d72f09e4b..7b7eb7d2db485239a31c5448caf3aca33c15b3aa 100644 (file)
@@ -29,3 +29,6 @@ void wake_up(wait_queue_head_t *wqh);
 extern task_union root_task;
 
 extern void load_cr3(task_union *tsk);
+
+extern list_head_t all_tasks;
+extern list_head_t pend_tasks;
\ No newline at end of file
index 38f9250c921f38de7bb59588506015b9ae14bce5..ff6559a7d826459dff1e343ba236594d3597c187 100644 (file)
@@ -63,13 +63,15 @@ typedef union task_union {
 
         char name[TASK_NAME_SIZE];
 
-        list_head_t list;
+        list_head_t list;  // 所有进程串成一个链表
+
+        list_head_t pend;  // 某些条件串成一个链表
 
         wait_queue_head_t wait;
 
         unsigned int sched_cnt;
 
-        unsigned int cnt;  // debug only
+        int delay_cnt;  // debug only
     };
 
     unsigned char stack[TASK_SIZE];
index 5dc04ca1cbfd87748a28a0c100aadd42f0d671f6..7639f132bd06b7db80ac7d2945ea1f80426bd1c2 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <printk.h>
+#include <sched.h>
 #include <system.h>
 
 static unsigned int jiffies = 0;
@@ -20,6 +21,26 @@ unsigned int sys_clock() { return jiffies; }
 void clk_handler(unsigned int irq, pt_regs_t *regs, void *dev_id) {
     jiffies++;
 
+    task_union *p = 0, *p1 = 0;
+    list_head_t *pos = 0, *t = 0;
+
+    unsigned long iflags;
+    irq_save(iflags);
+    int cnt = 0;
+
+    list_for_each_entry_safe(p, p1, &pend_tasks, pend) {
+        // printk("cnt %d %d\n", cnt++, p->delay_cnt);
+
+        p->delay_cnt -= p->delay_cnt == 0 ? 0 : 1;
+
+        if (0 == p->delay_cnt) {
+            p->state = TASK_RUNNING;
+            list_del(&p->pend);
+        }
+    }
+
+    irq_restore(iflags);
+
     // printd("^");
     // printl(MPL_CLOCK, "clock irq: %d", jiffies);
 }
index 43e3432102e3e99ee7cfe6dcf3ed7a86cad0bd09..37b85290bc6a0a72c816e81f1e8d81c7e461bc56 100644 (file)
@@ -43,7 +43,11 @@ void load_cr3(task_union *tsk) { LoadCR3(tsk->cr3); }
 
 extern pde_t __initdata init_pgd[PDECNT_PER_PAGE] __attribute__((__aligned__(PAGE_SIZE)));
 
-list_head_t all_tasks;
+// list_head_t all_tasks;
+// list_head_t delay_tasks;
+LIST_HEAD(all_tasks);
+
+LIST_HEAD(pend_tasks);
 
 void init_root_tsk() {
     int i;
@@ -56,8 +60,8 @@ void init_root_tsk() {
     root_task.priority = 100;
     strcpy(root_task.name, "root");
 
-    INIT_LIST_HEAD(&all_tasks);
     list_add(&root_task.list, &all_tasks);
+    // INIT_LIST_HEAD(&root_task.next);
 
     //  TODO
     // for(i=0; i<NR_OPENS; i++)
@@ -76,6 +80,9 @@ void init_root_tsk() {
 kmem_cache_t *task_union_cache;
 
 void setup_tasks() {
+    INIT_LIST_HEAD(&all_tasks);
+    INIT_LIST_HEAD(&pend_tasks);
+
     init_root_tsk();
 
     task_union_cache = kmem_cache_create("task_union", sizeof(task_union), PAGE_SIZE);
@@ -123,7 +130,9 @@ task_union *find_task(pid_t pid) {
     irq_save(iflags);
     list_for_each_safe(pos, tmp, &all_tasks) {
         p = list_entry(pos, task_union, list);
-        if (p->pid == pid) break;
+        if (p->pid == pid) {
+            break;
+        }
     }
     irq_restore(iflags);
 
@@ -180,8 +189,6 @@ unsigned long schedule() {
             continue;
         }
 
-        // printd("%08x %s weight %d\n", p, p->name, p->weight);
-
         float ratio = (float)(p->weight * 1.0) / (p->priority * 1.0);
         if (ratio < min_ratio) {
             sel = p;
@@ -191,7 +198,17 @@ unsigned long schedule() {
     irq_restore(iflags);
 
     sel->weight++;
-    printd("%08x %s:%d weight %d\n", sel, sel->name, sel->pid, sel->weight);
+    printk("%08x %s weight %d state: %s\n", sel, sel->name, sel->weight, task_state(sel->state));
+
+    list_for_each_safe(pos, t, &all_tasks) {
+        p = list_entry(pos, task_union, list);
+        printl(MPL_TASK_0 + p->pid, " ");  //清掉上一次显示的 '>'
+        printl(MPL_TASK_0 + p->pid, "%s%4s:%d [%08x] state %s weight %03d sched %u", sel == p ? ">" : " ", p->name,
+               p->pid, p, task_state(p->state), p->weight, p->sched_cnt);
+        if (sel->state == TASK_WAIT) {
+            asm volatile("xchg %bx, %bx");
+        }
+    }
 
     task_union *prev = current;
     task_union *next = sel;
@@ -199,11 +216,6 @@ unsigned long schedule() {
     if (prev != next) {
         // printk("switch to: %s:%d\n", next->name, next->pid);
         sel->sched_cnt++;
-        list_for_each_safe(pos, t, &all_tasks) {
-            p = list_entry(pos, task_union, list);
-            printl(MPL_TASK_0 + p->pid, "%s%4s:%d [%08x] state %s weight %03d sched %u", sel == p ? ">" : " ", p->name,
-                   p->pid, p, task_state(p->state), p->weight, p->sched_cnt);
-        }
         context_switch(prev, next);
     }
 }
index 295ef6472883185b5f8dfd0d79b37dc977959280..32cc84650cd1beaf5aa97484f00d28fd7407d343 100644 (file)
@@ -17,6 +17,7 @@
 #include <io.h>
 #include <printk.h>
 #include <system.h>
+#include <tty.h>
 
 extern void init_mm();
 extern void setup_gdt();
@@ -81,7 +82,8 @@ void setup_kernel() {
     setup_tasks();
 
     setup_irqs();
-    printk("fuck\tfu\tsad\tasdfa\t\taa\n");
+    extern tty_t monitor_tty;
+    // tty_switch(&monitor_tty);
     return;
 
     // switch_printk_screen();
index 70156d3c3d83cecb26a0a4306a95a9ab39580de7..b133db482a2af363c0f6824ffc598dab2eebc651 100644 (file)
@@ -44,7 +44,21 @@ int sysc_pause(unsigned long tick) { return 0; }
 
 int sysc_test() {
     static unsigned int cnt = 0;
-    current->cnt++;
+
+    current->delay_cnt = root_task.sched_cnt % 40;
+
+    unsigned long iflags;
+    irq_save(iflags);
+
+    current->state = TASK_WAIT;
+    // 现在sysc还没有实现进程切换
+    // 这个要到下一次中断之后才生效
+    list_add(&(current->pend), &pend_tasks);
+
+    irq_restore(iflags);
+
+    schedule();
+
     // printl(MPL_TEST, "systest cnt %u current %08x cnt %u          ",
     //        cnt++, current, cnt);
     // printk("systest cnt %u current %08x cnt %u\n",cnt++, current, cnt);