]> Zhao Yanbai Git Server - kernel.git/commitdiff
fix memcpy param in do_fork
authoracevest <zhaoyanbai@126.com>
Tue, 2 Nov 2021 16:25:44 +0000 (00:25 +0800)
committeracevest <zhaoyanbai@126.com>
Wed, 3 Nov 2021 02:45:48 +0000 (10:45 +0800)
.bochsrc
kernel/fork.c
kernel/init.c
kernel/syscall.S

index 9c88cd29ecfdecc5941cf6fd3b5d1721dacaef20..a2e7855be52c1c454ac6f419929cb31aa8be27cf 100644 (file)
--- a/.bochsrc
+++ b/.bochsrc
@@ -1243,7 +1243,7 @@ speaker: enabled=1, mode=sound, volume=15
 # Example:
 #   magic_break: enabled=1
 #=======================================================================
-#magic_break: enabled=1
+magic_break: enabled=1
 
 #=======================================================================
 # DEBUG_SYMBOLS:
index 5caa1ca90bf1b6eb218ddaef8d30f1373cfb5dbd..77b80132019959934138bcc858d62fee3669a304 100644 (file)
@@ -90,10 +90,13 @@ int do_fork(pt_regs_t *regs, unsigned long flags) {
 
     pt_regs_t *child_regs = ((pt_regs_t *)(TASK_SIZE + (unsigned long)tsk)) - 1;
 
-    *child_regs = *regs;
+    printk("child regs: %x %x %d\n", child_regs, regs, sizeof(regs));
+    //*child_regs = *regs;
+    memcpy(child_regs, regs, sizeof(*regs));
+    asm("xchg %bx, %bx");
 
     child_regs->eax = 0;
-    child_regs->eflags |= 0x200;  // enable IF
+    //child_regs->eflags |= 0x200;  // enable IF
 
     tsk->esp0 = TASK_SIZE + (unsigned long)tsk;
     tsk->esp = (unsigned long)child_regs;
index ede85d5ae6038c6aa4e6c30d480750fbc120a8bf..41cff0afb438ea47324be29efd21b37d7622d511 100644 (file)
@@ -46,35 +46,33 @@ void init_task_entry() {
     }
 }
 
-int kernel_fork() {
-    int pid = 0;
-
-    pt_regs_t *regs = ((pt_regs_t *)(TASK_SIZE + ((unsigned long)current))) - 1;
-    unsigned long *pedx = &(regs->edx);
-
-    asm volatile(
-        "movl $1f, %[pedx];"
-        "call do_fork;"
-        "1:"
-        : "=a"(pid)
-        : [pedx] "m"(pedx));
-
-    return pid;
-}
-
-void kernel_task(void *entry) {
+extern void ret_from_fork_krnl();
+void kernel_task(char *name, void *entry) {
     pt_regs_t regs;
+    
     memset((void *)&regs, 0, sizeof(regs));
+    
+    // 内核任务入口
     regs.edx = (unsigned long)entry;
-    // int pid = do_fork(&regs, FORK_KRNL);
-    // int pid = kernel_fork();
+    
+    // 创建内核任务的时候就直接指定其在fork后走的路径
+    // 就不用走sysexit那个路径了
+    regs.eip = (unsigned long)ret_from_fork_krnl;
+    regs.cs = SELECTOR_KRNL_CS;
+    regs.ds = SELECTOR_KRNL_DS;
+    regs.es = SELECTOR_KRNL_DS;
+    regs.ss = SELECTOR_KRNL_DS;
+    regs.eflags = (1 << 9); // enable IF
+
     int pid = do_fork(&regs, FORK_KRNL);
+
     printk("kernel task pid is %d\n", pid);
+
     enable_irq();
 }
 
 void root_task_entry() {
-    kernel_task(init_task_entry);
+    kernel_task("init", init_task_entry);
     // kernel_task(user_task_entry);
     // kernel_task(init_task_entry);
 
index ff8617e8047cc2b25a453fc896949b4eb5ee7d61..072f9a3ff698071f7d1117435c68edc045825c48 100644 (file)
@@ -83,10 +83,14 @@ ret_from_fork_user:
     sti        /* sysenter have cleared IF, and sysexit will not set IF. */
     sysexit
 
+
+// 内核线程fork出路
 ret_from_fork_krnl:
-    movl    PT_REGS_EDX(%esp), %edx
-    sti
+    RESTORE_REGS
+    addl    $24, %esp
     call    *%edx
+
+    # 还没有实现do_exit
     #call    do_exit