多进程的进程表初始化

来源:互联网 发布:ce6.0软件 编辑:程序博客网 时间:2024/06/06 00:54

多进程的进程表初始化


PUBLIC char   task_stack[STACK_SIZE_TOTAL]  //在global.c中task_stack其实是一个有着STACK_SIZE_TOTAL大小的数组。task_stack是这个数组名

                                                                                       用这个数组作为堆栈。

----------------------------------------------------------
 TASK*  p_task  = task_table;
 PROCESS* p_proc  = proc_table;
 char*  p_task_stack = task_stack + STACK_SIZE_TOTAL;  //进程堆栈,是一个数组。数组的起始地址+偏移量,此时p_task_stack指向堆栈底
 u16  selector_ldt = SELECTOR_LDT_FIRST;                      //selector_ldt在后面自动加,使之指向下一个选择子
 int i;
 for (i = 0; i < NR_TASKS; i++) {
  strcpy(p_proc->p_name, p_task->name); // name of the process
  p_proc->pid = i;   // pid

  p_proc->ldt_sel = selector_ldt;

  memcpy(&p_proc->ldts[0], &gdt[SELECTOR_KERNEL_CS >> 3],
         sizeof(DESCRIPTOR));
  p_proc->ldts[0].attr1 = DA_C | PRIVILEGE_TASK << 5;
  memcpy(&p_proc->ldts[1], &gdt[SELECTOR_KERNEL_DS >> 3],
         sizeof(DESCRIPTOR));
  p_proc->ldts[1].attr1 = DA_DRW | PRIVILEGE_TASK << 5;
  p_proc->regs.cs = ((8 * 0) & SA_RPL_MASK & SA_TI_MASK)
   | SA_TIL | RPL_TASK;
  p_proc->regs.ds = ((8 * 1) & SA_RPL_MASK & SA_TI_MASK)
   | SA_TIL | RPL_TASK;
  p_proc->regs.es = ((8 * 1) & SA_RPL_MASK & SA_TI_MASK)
   | SA_TIL | RPL_TASK;
  p_proc->regs.fs = ((8 * 1) & SA_RPL_MASK & SA_TI_MASK)
   | SA_TIL | RPL_TASK;
  p_proc->regs.ss = ((8 * 1) & SA_RPL_MASK & SA_TI_MASK)
   | SA_TIL | RPL_TASK;
  p_proc->regs.gs = (SELECTOR_KERNEL_GS & SA_RPL_MASK)
   | RPL_TASK;

  p_proc->regs.eip = (u32)p_task->initial_eip;
  p_proc->regs.esp = (u32)p_task_stack;
  p_proc->regs.eflags = 0x1202; /* IF=1, IOPL=1 */

  p_task_stack -= p_task->stacksize;                                //p_task_stack减去本进程堆栈的大小,使之指向下一个进程的堆栈底
  p_proc++;
  p_task++;
  selector_ldt += 1 << 3;                                                //selector_ldt自动向后加。
 }

 proc_table[0].ticks = proc_table[0].priority = 15;
 proc_table[1].ticks = proc_table[1].priority =  5;
 proc_table[2].ticks = proc_table[2].priority =  3;

 k_reenter = 0;
 ticks = 0;

 p_proc_ready = proc_table;