多進程的進程表初始化

多進程的進程表初始化


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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章