-
- /*
- 因为schedule从设计上是需要在中断环境中执行的
- 可是我们需要在这里手动调用 schedule,从而使我们的init能够被执行。
- 所以需要模拟中断产生时的栈里内容。
- */
- kstack[2] = kinit.intr_ctx.eip;
- kstack[3] = kinit.intr_ctx.cs;
- kstack[4] = kinit.intr_ctx.eflags;
-
+ kinit.page_table = dup_pagetable(kinit.pid);
+
+ // Ok... 准备fork进我们的init进程
+ /*
+ 这里是一些栈的设置,因为我们将切换到一个新的地址空间里,并且使用一个全新的栈。
+ 让iret满意!
+ */
+ asm volatile(
+ "movl %%cr3, %%eax\n"
+ "movl %%esp, %%ebx\n"
+ "movl %0, %%cr3\n"
+ "movl %1, %%esp\n"
+ "pushf\n"
+ "pushl %2\n"
+ "pushl %3\n"
+ "pushl $0\n"
+ "pushl $0\n"
+ "movl %%eax, %%cr3\n"
+ "movl %%ebx, %%esp\n"
+ ::"r"(kinit.page_table), "i"(KSTACK_TOP), "i"(KCODE_SEG), "r"(kinit.intr_ctx.eip)
+ :"%eax", "%ebx", "memory"
+ );
+
+ // 向调度器注册进程,然后这里阻塞等待调度器调度就好了。