????????copy_prossess??????????get_free_page??????????????????????????????妫�???????????????0??????????????????????????task_struct???????????????task[nr]???nr????find_empty_process?蟹??????????
????????????*p=*current???????????????????????????????????????????些??????????????????????????????????????????????????????????????
???????????????????????????????????????????????copy_process????????????????????copy_mem?????????????????????位?????????????????
????int copy_mem (int nr?? struct task_struct *p) 
????{ 
????unsigned long old_data_base?? new_data_base?? data_limit; 
????unsigned long old_code_base?? new_code_base?? code_limit; 
????code_limit = get_limit (0x0f);    // ?????????????写?????????????卸?????? 
????data_limit = get_limit (0x17);    // ????????????????????????????卸?????? 
????old_code_base = get_base (current->ldt[1]);    // ??????位???? 
????old_data_base = get_base (current->ldt[2]);    // ??????位???? 
????if (old_data_base != old_code_base)   // 0.11 ?娌�???????????畏?????????? 
????panic ("We don't support separate I&D"); 
????if (data_limit < code_limit)   // ???????纬??? < ????纬????????? 
????panic ("Bad data_limit"); 
????new_data_base = new_code_base = nr * 0x4000000;   // ????=?????*64Mb(?????小)?? 
????p->start_code = new_code_base; 
????set_base (p->ldt[1]?? new_code_base);   // ???????????????谢???? 
????set_base (p->ldt[2]?? new_data_base);   // ????????????????谢???? 
????if (copy_page_tables (old_data_base?? new_data_base?? data_limit)) 
????{               // ????????????巍? 
????free_page_tables (new_data_base?? data_limit); // ???????????????????妾� 
????return -ENOMEM; 
????} 
????return 0; 
????}
???????????????pwd???????????????????????????GDT?械????????????????????????????????
???????????????????
????????????娣�?????????????????渭??????
????1??????fork????????????0×80?卸?
????2??????sys_fork
????3?????find_empty_process?????????????????
????4?????copy_process???????????????????????????????些????????煤??????????