????????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???????????????????????????????Щ????????ú??????????