ãã究ç«ä»ä¹æ¯ç¨æ·æï¼ä»ä¹æ¯å
æ ¸æï¼è¿ä¸¤ä¸ªåºæ¬æ¦å¿µä»¥åä¸ç´ç解å¾ä¸æ¯å¾æ¸
æ¥ï¼æ ¹æ¬åå 个人è§å¾æ¯å¨äºå 为大é¨åæ¶åæ们å¨åç¨åºæ¶å
³æ³¨çéç¹åçç¼çè§åº¦æ¾å¨äºå®ç°çåè½å代ç çé»è¾æ§ä¸ï¼å
çä¸ä¸ªä¾åï¼
ãã1ï¼ä¾å
ããC代ç
ãã1. void testfork(){
ãã2. if(0 = = fork()){
ãã3. printf(âcreate new process success!\nâ);
ãã4. }
ãã5. printf(âtestfork ok\nâ);
ãã6. }
ããè¿æ®µä»£ç å¾ç®åï¼ä»åè½çè§åº¦æ¥çï¼å°±æ¯å®é
æ§è¡äºä¸ä¸ªfork()ï¼çæä¸ä¸ªæ°çè¿ç¨ï¼ä»é»è¾çè§åº¦çï¼å°±æ¯å¤æäºå¦æfork()è¿åçæ¯åæå°ç¸å
³è¯å¥ï¼ç¶åå½æ°æååæå°ä¸å¥è¡¨ç¤ºæ§è¡å®æ´ä¸ªtestfork()å½æ°ã代ç çæ§è¡é»è¾ååè½ä¸çå°±æ¯å¦æ¤ç®åï¼ä¸å
±åè¡ä»£ç ï¼ä»ä¸å°ä¸ä¸å¥ä¸å¥æ§è¡èå·²ï¼å®å
¨çä¸åºæ¥åªéæä½ç°åºç¨æ·æåè¿ç¨æçæ¦å¿µã
ããå¦æ说åé¢ä¸¤ç§æ¯éæè§å¯çè§åº¦ççè¯ï¼æ们è¿å¯ä»¥ä»å¨æçè§åº¦æ¥çè¿æ®µä»£ç ï¼å³å®è¢«è½¬æ¢æCPUæ§è¡çæ令åå è½½æ§è¡çè¿ç¨ï¼è¿æ¶è¿æ®µç¨åºå°±æ¯ä¸ä¸ªå¨ææ§è¡çæ令åºåãè究ç«å è½½äºåªäºä»£ç ï¼å¦ä½å 载就æ¯åæä½ç³»ç»å¯åç¸å
³äºã
ãã2ï¼ç¹æ级
ããçæUnix/Linuxç³»ç»ç人é½ç¥éï¼forkçå·¥ä½å®é
ä¸æ¯ä»¥ç³»ç»è°ç¨çæ¹å¼å®æç¸åºåè½çï¼å
·ä½çå·¥ä½æ¯ç±sys_forkè´è´£å®æ½ãå
¶å®æ 论æ¯ä¸æ¯Unixæè
Linuxï¼å¯¹äºä»»ä½æä½ç³»ç»æ¥è¯´ï¼å建ä¸ä¸ªæ°çè¿ç¨é½æ¯å±äºæ ¸å¿åè½ï¼å 为å®è¦åå¾å¤åºå±ç»è´å°å·¥ä½ï¼æ¶èç³»ç»çç©çèµæºï¼æ¯å¦åé
ç©çå
åï¼ä»ç¶è¿ç¨æ·è´ç¸å
³ä¿¡æ¯ï¼æ·è´è®¾ç½®é¡µç®å½é¡µè¡¨ççï¼è¿äºæ¾ç¶ä¸è½é便让åªä¸ªç¨åºå°±è½å»åï¼äºæ¯å°±èªç¶å¼åºç¹æ级å«çæ¦å¿µï¼æ¾ç¶ï¼æå
³é®æ§çæåå¿
é¡»ç±é«ç¹æ级çç¨åºæ¥æ§è¡ï¼è¿æ ·æå¯ä»¥åå°éä¸ç®¡çï¼åå°æéèµæºç访é®å使ç¨å²çªã
ããç¹æ级æ¾ç¶æ¯é常ææç管çåæ§å¶ç¨åºæ§è¡çæ段ï¼å æ¤å¨ç¡¬ä»¶ä¸å¯¹ç¹æ级åäºå¾å¤æ¯æï¼å°±Intel x86æ¶æçCPUæ¥è¯´ä¸å
±æ0~3å个ç¹æ级ï¼0级æé«ï¼3级æä½ï¼ç¡¬ä»¶ä¸å¨æ§è¡æ¯æ¡æ令æ¶é½ä¼å¯¹æ令æå
·æçç¹æ级åç¸åºçæ£æ¥ï¼ç¸å
³çæ¦å¿µæ CPLãDPLåRPLï¼è¿éä¸åè¿å¤éè¿°ã硬件已ç»æä¾äºä¸å¥ç¹æ级使ç¨çç¸å
³æºå¶ï¼è½¯ä»¶èªç¶å°±æ¯å¥½å¥½å©ç¨çé®é¢ï¼è¿å±äºæä½ç³»ç»è¦åçäºæ
ï¼å¯¹äº Unix/Linuxæ¥è¯´ï¼åªä½¿ç¨äº0级ç¹æ级å3级ç¹æ级ãä¹å°±æ¯è¯´å¨Unix/Linuxç³»ç»ä¸ï¼ä¸æ¡å·¥ä½å¨çº§ç¹æ级çæ令å
·æäºCPUè½æä¾çæé«æåï¼èä¸æ¡å·¥ä½å¨3级ç¹æ级çæ令å
·æCPUæä¾çæä½æè
说æåºæ¬æåã
ãã3ï¼ç¨æ·æåå
æ ¸æ
ããç°å¨æ们ä»ç¹æ级çè°åº¦æ¥ç解ç¨æ·æåå
æ ¸æå°±æ¯è¾å¥½ç解äºï¼å½ç¨åºè¿è¡å¨3级ç¹æ级ä¸æ¶ï¼å°±å¯ä»¥ç§°ä¹ä¸ºè¿è¡å¨ç¨æ·æï¼å 为è¿æ¯æä½ç¹æ级ï¼æ¯æ®éçç¨æ·è¿ç¨è¿è¡çç¹æ级ï¼å¤§é¨åç¨æ·ç´æ¥é¢å¯¹çç¨åºé½æ¯è¿è¡å¨ç¨æ·æï¼åä¹ï¼å½ç¨åºè¿è¡å¨çº§ç¹æ级ä¸æ¶ï¼å°±å¯ä»¥ç§°ä¹ä¸ºè¿è¡å¨å
æ ¸æã
ããè½ç¶ç¨æ·æä¸åå
æ ¸æä¸å·¥ä½çç¨åºæå¾å¤å·®å«ï¼ä½æéè¦çå·®å«å°±å¨äºç¹æ级çä¸åï¼å³æåçä¸åãè¿è¡å¨ç¨æ·æä¸çç¨åºä¸è½ç´æ¥è®¿é®æä½ç³»ç»å
æ ¸æ°æ®ç»æåç¨åºï¼æ¯å¦ä¸é¢ä¾åä¸çtestfork()å°±ä¸è½ç´æ¥è°ç¨ sys_fork()ï¼å 为åè
æ¯å·¥ä½å¨ç¨æ·æï¼å±äºç¨æ·æç¨åºï¼èsys_fork()æ¯å·¥ä½å¨å
æ ¸æï¼å±äºå
æ ¸æç¨åºã
ããå½æ们å¨ç³»ç»ä¸æ§è¡ä¸ä¸ªç¨åºæ¶ï¼å¤§é¨åæ¶é´æ¯è¿è¡å¨ç¨æ·æä¸çï¼å¨å
¶éè¦æä½ç³»ç»å¸®å©å®ææäºå®æ²¡ææååè½åå®æçå·¥ä½æ¶å°±ä¼åæ¢å°å
æ ¸æï¼æ¯å¦testfork()æåè¿è¡å¨ç¨æ·æè¿ç¨ä¸ï¼å½å®è°ç¨fork()æç»è§¦å sys_fork()çæ§è¡æ¶ï¼å°±åæ¢å°äºå
æ ¸æã
ãã2. ç¨æ·æåå
æ ¸æç转æ¢
ãã1ï¼ç¨æ·æåæ¢å°å
æ ¸æç3ç§æ¹å¼
ããa. ç³»ç»è°ç¨
ããè¿æ¯ç¨æ·æè¿ç¨ä¸»å¨è¦æ±åæ¢å°å
æ ¸æçä¸ç§æ¹å¼ï¼ç¨æ·æè¿ç¨éè¿ç³»ç»è°ç¨ç³è¯·ä½¿ç¨æä½ç³»ç»æä¾çæå¡ç¨åºå®æå·¥ä½ï¼æ¯å¦åä¾ä¸fork()å®é
ä¸å°±æ¯æ§è¡äºä¸ä¸ªå建æ°è¿ç¨çç³»ç»è°ç¨ãèç³»ç»è°ç¨çæºå¶å
¶æ ¸å¿è¿æ¯ä½¿ç¨äºæä½ç³»ç»ä¸ºç¨æ·ç¹å«å¼æ¾çä¸ä¸ªä¸ææ¥å®ç°ï¼ä¾å¦Linuxçint 80hä¸æã
ããb. å¼å¸¸
ããå½CPUå¨æ§è¡è¿è¡å¨ç¨æ·æä¸çç¨åºæ¶ï¼åçäºæäºäºå
ä¸å¯ç¥çå¼å¸¸ï¼è¿æ¶ä¼è§¦åç±å½åè¿è¡è¿ç¨åæ¢å°å¤çæ¤å¼å¸¸çå
æ ¸ç¸å
³ç¨åºä¸ï¼ä¹å°±è½¬å°äºå
æ ¸æï¼æ¯å¦ç¼ºé¡µå¼å¸¸ã
ããc. å¤å´è®¾å¤çä¸æ
ããå½å¤å´è®¾å¤å®æç¨æ·è¯·æ±çæä½åï¼ä¼åCPUååºç¸åºçä¸æä¿¡å·ï¼è¿æ¶CPUä¼æåæ§è¡ä¸ä¸æ¡å³å°è¦æ§è¡çæ令转èå»æ§è¡ä¸ä¸æä¿¡å·å¯¹åºçå¤çç¨åºï¼å¦æå
åæ§è¡çæ令æ¯ç¨æ·æä¸çç¨åºï¼é£ä¹è¿ä¸ªè½¬æ¢çè¿ç¨èªç¶ä¹å°±åçäºç±ç¨æ·æå°å
æ ¸æçåæ¢ãæ¯å¦ç¡¬ç读åæä½å®æï¼ç³»ç»ä¼åæ¢å°ç¡¬ç读åçä¸æå¤çç¨åºä¸æ§è¡åç»æä½çã
ããè¿3ç§æ¹å¼æ¯ç³»ç»å¨è¿è¡æ¶ç±ç¨æ·æ转å°å
æ ¸æçæ主è¦æ¹å¼ï¼å
¶ä¸ç³»ç»è°ç¨å¯ä»¥è®¤ä¸ºæ¯ç¨æ·è¿ç¨ä¸»å¨åèµ·çï¼å¼å¸¸åå¤å´è®¾å¤ä¸æåæ¯è¢«å¨çã
ãã2ï¼å
·ä½çåæ¢æä½
ããä»è§¦åæ¹å¼ä¸çï¼å¯ä»¥è®¤ä¸ºåå¨åè¿°3ç§ä¸åçç±»åï¼ä½æ¯ä»æç»å®é
å®æç±ç¨æ·æå°å
æ ¸æçåæ¢æä½ä¸æ¥è¯´ï¼æ¶åçå
³é®æ¥éª¤æ¯å®å
¨ä¸è´çï¼æ²¡æä»»ä½åºå«ï¼é½ç¸å½äºæ§è¡äºä¸ä¸ªä¸æååºçè¿ç¨ï¼å 为系ç»è°ç¨å®é
ä¸æç»æ¯ä¸ææºå¶å®ç°çï¼èå¼å¸¸åä¸æçå¤çæºå¶åºæ¬ä¸ä¹æ¯ä¸è´çï¼å
³äºå®ä»¬çå
·ä½åºå«è¿éä¸åèµè¿°ãå
³äºä¸æå¤çæºå¶çç»èåæ¥éª¤è¿éä¹ä¸åè¿å¤åæï¼æ¶åå°ç±ç¨æ·æåæ¢å°å
æ ¸æçæ¥éª¤ä¸»è¦å
æ¬ï¼
ãã[1] ä»å½åè¿ç¨çæ述符ä¸æåå
¶å
æ ¸æ çss0åesp0ä¿¡æ¯ã
ãã[2] 使ç¨ss0åesp0æåçå
æ ¸æ å°å½åè¿ç¨çcs,eip,eflags,ss,espä¿¡æ¯ä¿åèµ·æ¥ï¼è¿ä¸ª
ããè¿ç¨ä¹å®æäºç±ç¨æ·æ å°å
æ ¸æ çåæ¢è¿ç¨ï¼åæ¶ä¿åäºè¢«æåæ§è¡çç¨åºçä¸ä¸
ããæ¡æ令ã
ãã[3] å°å
åç±ä¸æåéæ£ç´¢å¾å°çä¸æå¤çç¨åºçcs,eipä¿¡æ¯è£
å
¥ç¸åºçå¯åå¨ï¼å¼å§
ããæ§è¡ä¸æå¤çç¨åºï¼è¿æ¶å°±è½¬å°äºå
æ ¸æçç¨åºæ§è¡äºã
ãã
温馨提示:答案为网友推荐,仅供参考