]> Zhao Yanbai Git Server - kernel.git/commitdiff
kernel_task不把名字传递给内核函数入口,直接在do_fork里赋值
authoracevest <zhaoyanbai@126.com>
Mon, 15 Nov 2021 01:25:10 +0000 (09:25 +0800)
committeracevest <zhaoyanbai@126.com>
Mon, 15 Nov 2021 01:25:10 +0000 (09:25 +0800)
kernel/fork.c
kernel/init.c
kernel/sched.c
kernel/syscall.S

index ea2848c3b3da1643c06d5d2c1cacf2ec9aabe2e9..62915019570882875e2e323b0b27be7a63ffd8c0 100644 (file)
@@ -85,16 +85,17 @@ int do_fork(pt_regs_t *regs, unsigned long flags) {
     printk("child regs: %x %x\n", child_regs, regs);
     memcpy(child_regs, regs, sizeof(*regs));
 
-    child_regs->eax = 0;
-    child_regs->eflags |= 0x200;  // enable IF
-
     tsk->esp0 = TASK_SIZE + (unsigned long)tsk;
     tsk->esp = (unsigned long)child_regs;
     tsk->eip = (unsigned long)ret_from_fork_user;
     if (flags & FORK_KRNL) {
+        strcpy(tsk->name, (char *)(child_regs->eax));
         tsk->eip = (unsigned long)ret_from_fork_krnl;
     }
 
+    child_regs->eax = 0;
+    child_regs->eflags |= 0x200;  // enable IF
+
     printk("tsk %08x child_regs esp %08x esp0 %08x\n", tsk, tsk->esp, tsk->esp0);
 
     tsk->state = TASK_INITING;
index 4d0707c6835d3007d37a295eaf4c88455cd91e67..3abeb06d780ceb4d771f59f0d7b5b863160652ce 100644 (file)
@@ -58,9 +58,7 @@ void __ring3text__ __attribute__((__aligned__(PAGE_SIZE))) ring3_entry() {
     }
 }
 
-void user_task_entry(char *name) {
-    strcpy(current->name, name);
-
+void user_task_entry() {
     current->priority = 90;
 
     unsigned long ring3_text_page = va2pa(ring3_entry);
@@ -93,12 +91,10 @@ void user_task_entry(char *name) {
     asm volatile("sysexit;" ::"d"(0x08000000), "c"(0x30000000 + PAGE_SIZE - 100));
 }
 
-void init_task_entry(char *name) {
+void init_task_entry() {
     int cnt = 0;
     pid_t id = sysc_getpid();
 
-    strcpy(current->name, name);
-
     // 赋予不同的优先级
     current->priority = id * 30;
 
@@ -119,6 +115,12 @@ void init_task_entry(char *name) {
     }
 }
 
+void disk_task_entry() {
+    while (1) {
+        schedule();
+    }
+}
+
 void kernel_task(char *name, void *entry) {
     pt_regs_t regs;
 
@@ -127,6 +129,8 @@ void kernel_task(char *name, void *entry) {
     // 内核任务入口
     regs.edx = (unsigned long)entry;
 
+    regs.eax = (u32)name;
+
     // 创建内核任务的时候就直接指定其在fork后走的路径
     // 就不用走sysexit那个路径了
     extern void ret_from_fork_krnl();
@@ -138,8 +142,6 @@ void kernel_task(char *name, void *entry) {
     regs.fs = SELECTOR_KRNL_DS;
     regs.gs = SELECTOR_KRNL_DS;
 
-    regs.ebx = (unsigned long)name;  // 用ebx传递参数
-
     int pid = do_fork(&regs, FORK_KRNL);
 
     printk("kernel[%s] task pid is %d\n", name, pid);
@@ -161,18 +163,10 @@ void root_task_entry() {
     setup_under_irq();
 
     kernel_task("init", init_task_entry);
-    kernel_task("test", init_task_entry);
+    kernel_task("disk", disk_task_entry);
     kernel_task("user", user_task_entry);
 
-    int cnt = 0;
-
     while (1) {
-        // sysc_test();
-        // printl(MPL_TASK_0, "root:0 [%08x] weight %d cnt %d", current, root_task.weight, cnt++);
-        // printk("root:0 [%08x] weight %d cnt %d", current, current->weight, cnt++);
         asm("hlt;");
-        // asm("nop;nop;nop;");
-        // sysc_test();
-        // syscall0(SYSC_TEST);
     }
 }
index f3ce8e3150073cd2a665e825e3fe54bc90c6c820..fd5a8c7d4f78292e3ea5aa2977d8e09e4cb5aacf 100644 (file)
@@ -49,7 +49,7 @@ LIST_HEAD(all_tasks);
 
 LIST_HEAD(delay_tasks);
 
-void init_root_tsk() {
+void init_root_task() {
     int i;
 
     root_task.preempt_cnt = 0;
@@ -83,7 +83,7 @@ void setup_tasks() {
     INIT_LIST_HEAD(&all_tasks);
     INIT_LIST_HEAD(&delay_tasks);
 
-    init_root_tsk();
+    init_root_task();
 
     task_union_cache = kmem_cache_create("task_union", sizeof(task_union), PAGE_SIZE);
     if (0 == task_union_cache) {
@@ -144,7 +144,9 @@ static const char *task_state(unsigned int state) {
         "  ERROR", "RUNNING", "   WAIT", "INITING", "EXITING",
     };
 
-    if (state >= TASK_END) state = TASK_UNUSED;
+    if (state >= TASK_END) {
+        state = TASK_UNUSED;
+    }
 
     return s[state];
 }
index 76b3ad14c80a5a6666ca4e49792339e0235d7926..f813627993289ccf64b2203447011b932b3a807c 100644 (file)
@@ -90,8 +90,6 @@ ret_from_fork_krnl:
     popfl
     addl    $8, %esp
 
-    # 用ebx传递参数
-    pushl   %ebx
     call    *%edx
     addl    $4, %esp