±¾ÕÂÖØµãÌÖÂÛLinuxÄÚºËÈçºÎÔÚϵͳÖд´½¨¡¢¹ÜÀíÒÔ¼°É¾³ý½ø³Ì¡£
½ø³ÌÔÚ²Ù×÷ϵͳÖÐÖ´ÐÐÌØ¶¨µÄÈÎÎñ¡£¶ø³ÌÐòÊÇ´æ´¢ÔÚ´ÅÅÌÉϰüº¬¿ÉÖ´ÐлúÆ÷Ö¸ÁîºÍÊý¾ÝµÄ¾²Ì¬ÊµÌå¡£½ø³Ì»òÕßÈÎÎñÊÇ´¦Óڻ״̬µÄ¼ÆËã»ú³ÌÐò¡£
½ø³ÌÊÇÒ»¸öËæÖ´Ðйý³Ì²»¶Ï±ä»¯µÄʵÌå¡£ºÍ³ÌÐòÒª°üº¬Ö¸ÁîºÍÊý¾ÝÒ»Ñù£¬½ø³ÌÒ²°üº¬³ÌÐò¼ÆÊýÆ÷ºÍËùÓÐCPU¼Ä´æÆ÷µÄÖµ£¬Í¬Ê±ËüµÄ¶ÑÕ»Öд洢×ÅÈç×Ó³ÌÐò²ÎÊý¡¢·µ»ØµØÖ·ÒÔ¼°±äÁ¿Ö®ÀàµÄÁÙʱÊý¾Ý¡£µ±Ç°µÄÖ´ÐгÌÐò£¬»òÕß˵½ø³Ì£¬°üº¬×ŵ±Ç°´¦ÀíÆ÷ÖеĻ״̬¡£LinuxÊÇÒ»¸ö¶à´¦Àí²Ù×÷ϵͳ¡£½ø³Ì¾ßÓжÀÁ¢µÄȨÏÞÓëÖ°Ôð¡£Èç¹ûϵͳÖÐij¸ö½ø³Ì±ÀÀ££¬Ëü²»»áÓ°Ïìµ½ÆäÓàµÄ½ø³Ì¡£Ã¿¸ö½ø³ÌÔËÐÐÔÚÆä¸÷×ÔµÄÐéÄâµØÖ·¿Õ¼äÖУ¬Í¨¹ýºËÐÄ¿ØÖÆÏ¿ɿ¿µÄͨѶ»úÖÆ£¬ËüÃÇÖ®¼ä²ÅÄÜ·¢ÉúÁªÏµ¡£
½ø³ÌÔÚÉúÃüÆÚÄÚ½«Ê¹ÓÃϵͳÖеÄ×ÊÔ´¡£ËüÀûÓÃϵͳÖеÄCPUÀ´Ö´ÐÐÖ¸ÁÔÚÎïÀíÄÚ´æÀ´·ÅÖÃÖ¸ÁîºÍÊý¾Ý¡£Ê¹ÓÃÎļþϵͳÌṩµÄ¹¦ÄÜ´ò¿ª²¢Ê¹ÓÃÎļþ£¬Í¬Ê±Ö±½Ó»òÕß¼ä½ÓµÄʹÓÃÎïÀíÉ豸¡£Linux±ØÐë¸ú×ÙϵͳÖÐÿ¸ö½ø³ÌÒÔ¼°×ÊÔ´£¬ÒÔ±ãÔÚ½ø³Ì¼äʵÏÖ×ÊÔ´µÄ¹«Æ½·ÖÅä¡£Èç¹ûϵͳÓÐÒ»¸ö½ø³Ì¶ÀÕ¼Á˴󲿷ÖÎïÀíÄÚ´æ»òÕßCPUµÄʹÓÃʱ¼ä£¬ÕâÖÖÇé¿ö¶ÔϵͳÖÐµÄÆäËü½ø³ÌÊDz»¹«Æ½µÄ¡£
ϵͳÖÐ×¹óµÄ×ÊÔ´ÊÇCPU£¬Í¨³£ÏµÍ³ÖÐÖ»ÓÐÒ»¸öCPU¡£LinuxÊÇÒ»¸ö¶à´¦Àí²Ù×÷ϵͳ£¬Ëü×îÖÕµÄÄ¿µÄÊÇ:ÈκÎʱ¿ÌϵͳÖеÄÿ¸öCPUÉ϶¼ÓÐÈÎÎñÖ´ÐУ¬´Ó¶øÌá¸ßCPUµÄÀûÓÃÂÊ¡£Èç¹û½ø³Ì¸öÊý¶àÓÚCPUµÄ¸öÊý£¬ÔòÓÐЩ½ø³Ì±ØÐëµÈ´ýµ½CPU¿ÕÏÐʱ²Å¿ÉÒÔÔËÐС£¶à´¦ÀíÊǵÄ˼·ºÜ¼òµ¥£»µ±½ø³ÌÐèҪij¸öϵͳ×ÊԴʱËü½«Í£Ö¹Ö´Ðв¢µÈ´ýµ½×ÊÔ´¿ÉÓÃʱ²Å¼ÌÐøÔËÐС£µ¥´¦ÀíϵͳÖУ¬ÈçDOS£¬´ËʱCPU½«´¦ÓÚ¿ÕµÈ״̬£¬Õâ¸öʱ¼ä½«±»À˷ѵô¡£ÔÚ¶à´¦ÀíϵͳÖУ¬ÒòΪ¿ÉÒÔͬʱ´æÔÚ¶à¸ö½ø³Ì£¬ËùÒÔµ±Ä³¸ö½ø³Ì¿ªÊ¼µÈ´ýʱ£¬²Ù×÷ϵͳ½«°ÑCPU¿ØÖÆÈ¨ÄùýÀ´²¢½»¸øÆäËü¿ÉÒÔÔËÐеĽø³Ì¡£µ÷¶ÈÆ÷¸ºÔðÑ¡ÔñÊʵ±µÄ½ø³ÌÀ´ÔËÐУ¬LinuxʹÓÃһЩµ÷¶È²ßÂÔÒÔ±£Ö¤CPU·ÖÅäµÄ¹«Æ½ÐÔ¡£
LinuxÖ§³Ö¶àÖÖÀàÐ͵ĿÉÖ´ÐÐÎļþ¸ñʽ£¬ÈçELF£¬JAVAµÈ¡£ÓÉÓÚÕâЩ½ø³Ì±ØÐëʹÓÃϵͳ¹²Ïí¿â£¬ËùÒÔ¶ÔËüÃǵĹÜÀíÒª¾ßÓÐ͸Ã÷ÐÔ¡£
ΪÁËÈÃLinuxÀ´¹ÜÀíϵͳÖеĽø³Ì£¬Ã¿¸ö½ø³ÌÓÃÒ»¸ötask_structÊý¾Ý½á¹¹À´±íʾ£¨ÈÎÎñÓë½ø³ÌÔÚLinuxÖпÉÒÔ»ìÓã©¡£Êý×étask°üº¬Ö¸ÏòϵͳÖÐËùÓÐtask_struct½á¹¹µÄÖ¸Õë¡£
ÕâÒâζ×ÅϵͳÖеÄ×î´ó½ø³ÌÊýÄ¿ÊÜtaskÊý×é´óСµÄÏÞÖÆ£¬È±Ê¡ÖµÒ»°ãΪ512¡£´´½¨Ð½ø³Ìʱ£¬Linux½«´ÓϵͳÄÚ´æÖзÖÅäÒ»¸ötask_struct½á¹¹²¢½«Æä¼ÓÈëtaskÊý×é¡£µ±Ç°ÔËÐнø³ÌµÄ½á¹¹ÓÃcurrentÖ¸ÕëÀ´Ö¸Ê¾¡£
Linux»¹Ö§³Öʵʱ½ø³Ì¡£ÕâЩ½ø³Ì±ØÐë¶ÔÍⲿʱ¼ä×÷³ö¿ìËÙ·´Ó¦£¨Õâ¾ÍÊÇ¡°ÊµÊ±¡±µÄÒâ˼£©£¬ÏµÍ³½«Çø·Ö¶Ô´ýÕâЩ½ø³ÌºÍÆäËû½ø³Ì¡£ËäÈ»task_structÊý¾Ý½á¹¹ÅÓ´ó¶ø¸´ÔÓ£¬µ«Ëü¿ÉÒÔ·Ö³ÉһЩ¹¦ÄÜ×é³É²¿·Ö£º
init(1)-+-crond(98) |-emacs(387) |-gpm(146) |-inetd(110) |-kerneld(18) |-kflushd(2) |-klogd(87) |-kswapd(3) |-login(160)---bash(192)---emacs(225) |-lpd(121) |-mingetty(161) |-mingetty(162) |-mingetty(163) |-mingetty(164) |-login(403)---bash(404)---pstree(594) |-sendmail(134) |-syslogd(78) `-update(166)ÁíÍ⣬ϵͳÖÐËùÓнø³Ì¶¼ÓÃÒ»¸öË«ÏòÁ´±íÁ¬½ÓÆðÀ´£¬¶øËüÃǵĸùÊÇinit½ø³ÌµÄtask_structÊý¾Ý½á¹¹¡£Õâ ¸öÁ´±í±»LinuxºËÐÄÓÃÀ´Ñ°ÕÒϵͳÖÐËùÓнø³Ì£¬Ëü¶Ôps»òÕßkillÃüÁîÌṩÁËÖ§³Ö¡£
ºÍÆäËûUnixÒ»Ñù£¬LinuxʹÓÃÓû§ºÍ×é±êÖ¾·ûÀ´¼ì²é¶ÔϵͳÖÐÎļþºÍ¿ÉÖ´ÐÐÓ³ÏóµÄ·ÃÎÊȨÏÞ¡£LinuxϵͳÖÐËùÓеÄÎļþ¶¼ÓÐËùÓÐÕߺÍÔÊÐíµÄȨÏÞ£¬ÕâЩȨÏÞÃèÐðÁËϵͳʹÓÃÕß¶ÔÎļþ»òÕßĿ¼µÄʹÓÃȨ¡£»ù±¾µÄȨÏÞÊǶÁ¡¢Ð´ºÍ¿ÉÖ´ÐУ¬ÕâЩȨÏÞ±»·ÖÅ䏸ÈýÀàÓû§£ºÎļþµÄËùÓÐÕߣ¬ÊôÓÚÏàͬ×éµÄ½ø³ÌÒÔ¼°ÏµÍ³ÖÐËùÓнø³Ì¡£Ã¿ÀàÓû§¾ßÓв»Í¬µÄȨÏÞ£¬ÀýÈçÒ»¸öÎļþÔÊÐíÆäÓµÓÐÕß¶Áд£¬µ«ÊÇͬ×éµÄÖ»ÄܶÁ¶øÆäËû½ø³Ì²»ÔÊÐí·ÃÎÊ¡£
LinuxʹÓÃ×齫ÎļþºÍĿ¼µÄ·ÃÎÊÌØÈ¨ÊÚÓèÒ»×éÓû§£¬¶ø²»Êǵ¥¸öÓû§»òÕßϵͳÖÐËùÓнø³Ì¡£Èç¿ÉÒÔΪij¸öÈí¼þÏîÄ¿ÖеÄËùÓÐÓû§´´½¨Ò»¸ö×飬²¢½«ÆäȨÏÞÉèÖóÉÖ»ÓÐËûÃDzÅÔÊÐí¶ÁдÏîÄ¿ÖеÄÔ´´úÂë¡£Ò»¸ö½ø³Ì¿ÉÒÔͬʱÊôÓÚ¶à¸ö×飨×î¶àΪ32¸ö£©£¬ÕâЩ×é¶¼±»·ÅÔÚ½ø³ÌµÄtask_structÖеÄgroupÊý×éÖС£Ö»ÒªÄ³×é½ø³Ì¿ÉÒÔ´æÈ¡Ä³¸öÎļþ£¬ÔòÓÉ´Ë×éÅÉÉú³öµÄ½ø³Ì¶ÔÕâ¸öÎļþÓÐÏàÓ¦µÄ×é·ÃÎÊȨÏÞ¡£
task_struct½á¹¹ÖÐÓÐËĶԽø³ÌºÍ×é±êÖ¾·û£º
ËùÓнø³Ì²¿·Öʱ¼äÔËÐÐÓÚÓû§Ä£Ê½£¬²¿·Öʱ¼äÔËÐÐÓÚϵͳģʽ¡£ÈçºÎÖ§³ÖÕâЩģʽ£¬µ×²ãÓ²¼þµÄʵÏÖ¸÷²»Ïàͬ£¬µ«ÊÇ´æÔÚÒ»ÖÖ°²È«»úÖÆ¿ÉÒÔʹËüÃÇÔÚÓû§Ä£Ê½ºÍϵͳģʽ֮¼äÀ´»ØÇл»¡£Óû§Ä£Ê½µÄȨÏÞ±ÈϵͳģʽϵÄСµÃ¶à¡£½ø³Ìͨ¹ýϵͳµ÷ÓÃÇл»µ½ÏµÍ³Ä£Ê½¼ÌÐøÖ´ÐС£´ËʱºËÐÄΪ½ø³Ì¶øÖ´ÐС£ÔÚLinuxÖУ¬½ø³Ì²»Äܱ»ÇÀÕ¼¡£Ö»ÒªÄܹ»ÔËÐÐËüÃǾͲ»Äܱ»Í£Ö¹¡£µ±½ø³Ì±ØÐëµÈ´ýij¸öϵͳʼþʱ£¬Ëü²Å¾ö¶¨ÊͷųöCPU¡£ÀýÈç½ø³Ì¿ÉÄÜÐèÒª´ÓÎļþÖжÁ³ö×Ö·û¡£Ò»°ãµÈ´ý·¢ÉúÔÚϵͳµ÷Óùý³ÌÖУ¬´Ëʱ½ø³Ì´¦ÓÚϵͳģʽ£»´¦Óڵȴý״̬µÄ½ø³Ì½«±»¹ÒÆð¶øÆäËûµÄ½ø³Ì±»µ÷¶È¹ÜÀíÆ÷Ñ¡³öÀ´Ö´ÐС£
½ø³Ì³£ÒòΪִÐÐϵͳµ÷ÓöøÐèÒªµÈ´ý¡£ÓÉÓÚ´¦Óڵȴý״̬µÄ½ø³Ì»¹¿ÉÄÜÕ¼ÓÃCPUʱ¼ä£¬ËùÒÔLinux²ÉÓÃÁËÔ¤¼ÓÔØµ÷¶È²ßÂÔ¡£Ôڴ˲ßÂÔÖУ¬Ã¿¸ö½ø³ÌÖ»ÔÊÐíÔËÐк̵ܶÄʱ¼ä£º200ºÁÃ룬µ±Õâ¸öʱ¼äÓÃÍêÖ®ºó£¬ÏµÍ³½«Ñ¡ÔñÁíÒ»¸ö½ø³ÌÀ´ÔËÐУ¬ÔÀ´µÄ½ø³Ì±ØÐëµÈ´ýÒ»¶Îʱ¼äÒÔ¼ÌÐøÔËÐС£Õâ¶Îʱ¼ä³ÆÎªÊ±¼äƬ¡£
µ÷¶ÈÆ÷±ØÐëÑ¡Ôñ×îÆÈÇÐÐèÒªÔËÐжøÇÒ¿ÉÒÔÖ´ÐеĽø³ÌÀ´Ö´ÐС£
¿ÉÔËÐнø³ÌÊÇÒ»¸öÖ»µÈ´ýCPU×ÊÔ´µÄ½ø³Ì¡£LinuxʹÓûùÓÚÓÅÏȼ¶µÄ¼òµ¥µ÷¶ÈËã·¨À´Ñ¡ÔñÏÂÒ»¸öÔËÐнø³Ì¡£µ±Ñ¡¶¨Ð½ø³Ìºó£¬ÏµÍ³±ØÐ뽫µ±Ç°½ø³ÌµÄ״̬£¬´¦ÀíÆ÷ÖеļĴæÆ÷ÒÔ¼°ÉÏÏÂÎÄ״̬±£´æµ½task_struct½á¹¹ÖС£Í¬Ê±Ëü½«ÖØÐÂÉèÖÃнø³ÌµÄ״̬²¢½«ÏµÍ³¿ØÖÆÈ¨½»¸ø´Ë½ø³Ì¡£ÎªÁ˽«CPUʱ¼äºÏÀíµÄ·ÖÅä¸øÏµÍ³ÖÐÿ¸ö¿ÉÖ´Ðнø³Ì£¬µ÷¶È¹ÜÀíÆ÷±ØÐ뽫ÕâЩʱ¼äÐÅÏ¢Ò²±£´æÔÚtask_structÖС£
ºËÐÄÔÚ¼¸¸öλÖõ÷Óõ÷¶È¹ÜÀíÆ÷¡£È統ǰ½ø³Ì±»·ÅÈëµÈ´ý¶ÓÁкóÔËÐлòÕßϵͳµ÷ÓýáÊøÊ±£¬ÒÔ¼°´Óϵͳģʽ·µ»ØÓû§Ä£Ê½Ê±¡£´ËʱϵͳʱÖÓ½«µ±Ç°½ø³ÌµÄcounterÖµÉèΪ0ÒÔÇý¶¯µ÷¶È¹ÜÀíÆ÷¡£Ã¿´Îµ÷¶È¹ÜÀíÆ÷ÔËÐÐʱ½«½øÐÐÏÂÁвÙ×÷£º
Èç¹ûµ±Ç°½ø³ÌµÄµ÷¶È²ßÂÔÊÇʱ¼äƬÂÖת£¬ÔòËü±»·Å»Øµ½ÔËÐжÓÁС£
Èç¹ûÈÎÎñ¿ÉÖжÏÇÒ´ÓÉϴα»µ÷¶Èºó½ÓÊÕµ½ÁËÒ»¸öÐźţ¬ÔòËüµÄ״̬±äΪRunning¡£
Èç¹ûµ±Ç°½ø³Ì³¬Ê±£¬ÔòËüµÄ״̬±äΪRunning¡£
Èç¹ûµ±Ç°½ø³ÌµÄ״̬ÊÇRunning£¬Ôò״̬±£³Ö²»±ä¡£ ÄÇЩ¼È²»´¦ÓÚRunning״̬ÓÖ²»ÊÇ¿ÉÖжϵĽø³Ì½«»á´ÓÔËÐжÓÁÐÖÐɾ³ý¡£ÕâÒâζ×ŵ÷¶È¹ÜÀíÆ÷Ñ¡ÔñÔËÐнø³Ìʱ²»»á½«ÕâЩ½ø³Ì¿¼ÂÇÔÚÄÚ¡£
ÔÚLinuxÊÀ½çÖУ¬¶àCPUϵͳ·Ç³£ÉÙ¼û¡£µ«ÊÇLinuxÉÏÒѾ×öÁ˺ܶ๤×÷À´±£Ö¤ËüÄÜÔËÐÐÔÚSMP£¨¶Ô³Æ¶à´¦Àí£©»úÆ÷ÉÏ¡£LinuxÄܹ»ÔÚϵͳÖеÄCPU¼ä½øÐкÏÀíµÄ¸ºÔØÆ½ºâµ÷¶È¡£ÕâÀïµÄ¸ºÔØÆ½ºâ¹¤×÷±Èµ÷¶È¹ÜÀíÆ÷Ëù×öµÄ¸ü¼ÓÃ÷ÏÔ¡£
ÔÚ¶à´¦ÀíÆ÷ϵͳÖУ¬ÈËÃÇÏ£Íûÿ¸ö´¦ÀíÆ÷×Ü´¦Ó빤×÷״̬¡£µ±´¦ÀíÆ÷Éϵĵ±Ç°½ø³ÌÓÃÍêËüµÄʱ¼äƬ»òÕߵȴýϵͳ×ÊԴʱ£¬¸÷¸ö´¦ÀíÆ÷½«¶ÀÁ¢ÔËÐе÷¶È¹ÜÀíÆ÷¡£SMPϵͳÖÐÒ»¸öÖµµÃ×¢ÒâµÄÎÊÌâÊÇϵͳÖв»Ö¹Ò»¸öidle½ø³Ì¡£ÔÚµ¥´¦ÀíÆ÷ϵͳÖУ¬idle½ø³ÌÊÇtaskÊý×éÖеĵÚÒ»¸öÈÎÎñ£¬ÔÚSMPϵͳÖÐÿ¸öCPUÓÐÒ»¸öidle½ø³Ì£¬Í¬Ê±Ã¿¸öCPU¶¼ÓÐÒ»¸öµ±Ç°½ø³Ì£¬SMPϵͳ±ØÐë¸ú×Ùÿ¸ö´¦ÀíÆ÷ÖеÄidle½ø³ÌºÍµ±Ç°½ø³Ì¡£
ÔÚSMPϵͳÖУ¬Ã¿¸ö½ø³ÌµÄtask_struct½á¹¹Öаüº¬×ŵ±Ç°ÔËÐÐËüµÄ´¦ÀíÆ÷µÄ±àºÅÒÔ¼°ÉÏ´ÎÔËÐÐʱ´¦ÀíÆ÷µÄ±àºÅ¡£ °Ñ½ø³Ìÿ´Î¶¼µ÷¶Èµ½²»Í¬CPUÉÏÖ´ÐÐÏÔÈ»ºÁÎÞÒâÒ壬Linux¿ÉÒÔʹÓÃprocessor_maskÀ´Ê¹µÃij¸ö½ø³ÌÖ»ÔÚÒ»¸ö»òÕß¼¸¸ö´¦ÀíÆ÷ÉÏÔËÐÐ:Èç¹ûNλÖÃ룬Ôò½ø³Ì¿ÉÔÚ´¦ÀíÆ÷NÉÏÔËÐС£µ±µ÷¶È¹ÜÀíÆ÷Ñ¡Ôñнø³ÌÔËÐÐʱ£¬Ëü ²»»á¿¼ÂÇÒ»¸öÔÚÆäprocessor_maskÖÐÔÚµ±Ç°´¦ÀíÆ÷λûÓÐÖÃλµÄ½ø³Ì¡£Í¬Ê±µ÷¶È¹ÜÀíÆ÷½«¸øÓèÉÏ´ÎÔÚ´Ë´¦ÀíÆ÷ÖÐÔËÐеĽø³ÌһЩÓÅÏÈȨ£¬ÒòΪ½«½ø³ÌÇ¨ÒÆµ½ÁíÍâ´¦ÀíÆ÷ÉÏÔËÐн«´øÀ´ÐÔÄܵÄËðʧ¡£
ͼ4.1¸ø³öÁËÁ½¸öÃèÐðϵͳÖÐÿ¸ö½ø³ÌËùʹÓõÄÎļþϵͳÏà¹ØÐÅÏ¢¡£µÚÒ»¸öfs_struct°üº¬ÁËÖ¸Ïò½ø³ÌµÄVFS inodeºÍÆäÆÁ±ÎÂë¡£Õâ¸öÆÁ±ÎÂëÖµÊÇ´´½¨ÐÂÎļþʱËùʹÓõÄȱʡֵ£¬¿ÉÒÔͨ¹ýϵͳµ÷ÓÃÀ´¸Ä±ä¡£
µÚ¶þ¸öÊý¾Ý½á¹¹files_struct°üº¬Á˽ø³Ìµ±Ç°ËùʹÓõÄËùÓÐÎļþµÄÐÅÏ¢¡£³ÌÐò´Ó±ê×¼ÊäÈëÖжÁÈ¡²¢Ð´Èëµ½±ê×¼Êä³öÖÐÈ¥¡£ÈκδíÎóÐÅÏ¢½«Êä³öµ½±ê×¼´íÎóÊä³ö¡£ÕâЩÎļþÓÐЩ¿ÉÄÜÊÇÕæÕýµÄÎļþ£¬ÓеÄÔòÊÇÊä³ö/ÊäÈëÖÕ¶Ë»òÕßÎïÀíÉ豸£¬µ«³ÌÐò¶¼½«ËüÃÇÊÓΪÎļþ¡£Ã¿¸öÎļþÓÐÒ»¸öÃèÐð·û£¬files_struct×î¶à¿ÉÒÔ°üº¬256¸öÎļþÊý¾Ý½á¹¹£¬ËüÃÇ·Ö±ðÃèÐðÒ»¸ö±»µ±Ç°½ø³ÌʹÓõÄÎļþ¡£f_modeÓò±íʾÎļþ½«ÒÔºÎÖÖģʽ´´½¨£ºÖ»¶Á ¡¢¶Áд»¹ÊÇֻд¡£f_posÖаüº¬ÏÂÒ»´ÎÎļþ¶Áд²Ù×÷¿ªÊ¼Î»Öá£f_inodeÖ¸ÏòÃèÐð´ËÎļþµÄVFS inode£¬ f_opsÖ¸ÏòÒ»×é¿ÉÒÔ¶Ô´ËÎļþ½øÐвÙ×÷µÄº¯ÊýÈë¿ÚµØÖ·Ö¸ÕëÊý×é¡£ÕâЩ³éÏó½Ó¿ÚÊ®·ÖÇ¿´ó£¬ËüÃÇʹµÃLinux Äܹ»Ö§³Ö¶àÖÖÎļþÀàÐÍ¡£ÔÚLinuxÖУ¬¹ÜµÀÊÇÓÃÎÒÃÇÏÂÃæÒªÌÖÂ۵ĻúÖÆÊµÏֵġ£
ÿµ±´ò¿ªÒ»¸öÎļþʱ£¬Î»ÓÚfiles_structÖеÄÒ»¸ö¿ÕÏÐÎļþÖ¸Õ뽫±»ÓÃÀ´Ö¸ÏòÕâ¸öеÄÎļþ½á¹¹¡£Linux½ø ³ÌÏ£ÍûÔÚ½ø³ÌÆô¶¯Ê±ÖÁÉÙÓÐÈý¸öÎļþÃèÐð·û±»´ò¿ª£¬ËüÃÇÊDZê×¼ÊäÈ룬±ê×¼Êä³öºÍ±ê×¼´íÎóÊä³ö£¬Ò»°ã½ø³Ì »á´Ó¸¸½ø³ÌÖм̳ÐËüÃÇ¡£ÕâЩÃèÐð·ûÓÃÀ´Ë÷Òý½ø³ÌµÄfdÊý×飬ËùÒÔ±ê×¼ÊäÈ룬±ê×¼Êä³öºÍ±ê×¼´íÎóÊä³ö·Ö±ð ¶ÔÓ¦ÎļþÃèÐð·û0£¬1ºÍ2¡£Ã¿´Î¶ÔÎļþµÄ´æÈ¡¶¼ÒªÍ¨¹ýÎļþÊý¾Ý½á¹¹ÖеÄÎļþ²Ù×÷×Ó³ÌÐòºÍVFS inodeÒ»ÆðÀ´Íê³É£¬
½ø³ÌµÄÐéÄâÄÚ´æ°üÀ¨¿ÉÖ´ÐдúÂëºÍ¶à¸ö×ÊÔ´Êý¾Ý¡£Ê×ÏȼÓÔØµÄÊdzÌÐòÓ³Ïó£¬ÀýÈçls¡£lsºÍËùÓпÉÖ´ÐÐÓ³ÏóÒ»Ñù£¬ÊÇÓÉ¿ÉÖ´ÐдúÂëºÍÊý¾Ý×é³ÉµÄ¡£´ËÓ³ÏóÎļþ°üº¬ËùÓмÓÔØ¿ÉÖ´ÐдúÂëËùÐèµÄÐÅÏ¢£¬Í¬Ê±»¹½«³ÌÐòÊý¾ÝÁ¬½Ó½øÈë½ø³ÌµÄÐéÄâÄÚ´æ¿Õ¼ä¡£È»ºóÔÚÖ´Ðйý³ÌÖУ¬½ø³Ì¶¨Î»¿ÉÒÔʹÓõÄÐéÄâÄڴ棬ÒÔ°üº¬ÕýÔÚ¶ÁÈ¡µÄÎļþÄÚÈÝ¡£Ð·ÖÅäµÄÐéÄâÄÚ´æ±ØÐëÁ¬½Óµ½½ø³ÌÒÑ´æÔÚµÄÐéÄâÄÚ´æÖвÅÄܹ»Ê¹Óᣠ×îºóLinux½ø³Ìµ÷ÓÃͨÓÿâ¹ý³Ì£¬±ÈÈçÎļþ´¦Àí×Ó³ÌÐò¡£Èç¹ûÿ¸ö½ø³Ì¶¼Óпâ¹ý³ÌµÄ¿½±´£¬ÄÇô¹²Ïí¾Í±äµÃûÓÐÒâÒå¡£¶øLinux¿ÉÒÔʹ¶à¸ö½ø³ÌͬʱʹÓù²Ïí¿â¡£À´×Ô¹²Ïí¿âµÄ´úÂëºÍÊý¾Ý±ØÐëÁ¬½Ó½øÈë½ø³ÌµÄÐéÄâµØÖ·¿Õ¼äÒÔ¼°¹²Ïí´Ë¿âµÄÆäËü½ø³ÌµÄÐéÄâµØÖ·¿Õ¼ä¡£
ÈκÎʱºò½ø³Ì¶¼²»Í¬Ê±Ê¹Óðüº¬ÔÚÆäÐéÄâÄÚ´æÖеÄËùÓдúÂëºÍÊý¾Ý¡£ËäÈ»Ëü¿ÉÒÔ¼ÓÔØÔÚÌØ¶¨Çé¿öÏÂʹÓõÄÄÇЩ´úÂ룬Èç³õʼ»¯»òÕß´¦ÀíÌØÊâʼþʱ£¬ÁíÍâËüҲʹÓÃÁ˹²Ïí¿âµÄ²¿·Ö×Ó³ÌÐò¡£µ«Èç¹û½«ÕâЩûÓлòºÜÉÙʹÓõĴúÂëºÍÊý¾ÝÈ«²¿¼ÓÔØµ½ÎïÀíÄÚ´æÖÐÒýÆð¼«´óµÄÀË·Ñ¡£Èç¹ûϵͳÖжà¸ö½ø³Ì¶¼ÀË·ÑÕâô¶à×ÊÔ´£¬Ôò»á´ó´ó½µµÍµÄϵͳЧÂÊ¡£LinuxʹÓÃÇëÇóµ÷Ò³¼¼ÊõÀ´°ÑÄÇЩ½ø³ÌÐèÒª·ÃÎʵÄÐéÄâÄÚ´æ´øÈëÎïÀíÄÚ´æÖС£ºËÐĽ«½ø³ÌÒ³±íÖÐÕâЩÐéÄâµØÖ·±ê¼Ç³É´æÔÚµ«²»ÔÚÄÚ´æÖеÄ״̬£¬¶øÎÞÐ轫ËùÓдúÂëºÍÊý¾ÝÖ±½Óµ÷ÈëÎïÀíÄÚ´æ¡£µ±½ø³ÌÊÔͼ·ÃÎÊÕâЩ´úÂëºÍÊý¾Ýʱ£¬ÏµÍ³Ó²¼þ½«²úÉúÒ³Ãæ´íÎó²¢½«¿ØÖÆ×ªÒƵ½LinuxºËÐÄÀ´´¦ÀíÖ®¡£ÕâÑù¶ÔÓÚ´¦ÀíÆ÷µØÖ·¿Õ¼äÖеÄÿ¸öÐéÄâÄÚ´æÇøÓò£¬Linux¶¼±ØÐëÖªµÀÕâЩÐéÄâÄÚ´æ´ÓºÎ´¦¶øÀ´ÒÔ¼°ÈçºÎ½«ÆäÔØÈëÄÚ´æÒÔ´¦ÀíÒ³Ãæ´íÎó¡£
LinuxºËÐÄÐèÒª¹ÜÀíËùÓеÄÐéÄâÄÚ´æµØÖ·£¬Ã¿¸ö½ø³ÌÐéÄâÄÚ´æÖеÄÄÚÈÝÔÚÆätask_struct½á¹¹ÖÐÖ¸ÏòµÄ vm_area_struct½á¹¹ÖÐÃèÐð¡£½ø³ÌµÄmm_structÊý¾Ý½á¹¹Ò²°üº¬ÁËÒѼÓÔØ¿ÉÖ´ÐÐÓ³ÏóµÄÐÅÏ¢ºÍÖ¸Ïò½ø³ÌÒ³±í µÄÖ¸Õë¡£Ëü»¹°üº¬ÁËÒ»¸öÖ¸Ïòvm_area_structÁ´±íµÄÖ¸Õ룬ÿ¸öÖ¸Õë´ú±í½ø³ÌÄÚµÄÒ»¸öÐéÄâÄÚ´æÇøÓò¡£
´ËÁ´±í°´ÐéÄâÄÚ´æÎ»ÖÃÀ´ÅÅÁУ¬Í¼4.2¸ø³öÁËÒ»¸ö¼òµ¥½ø³ÌµÄÐéÄâÄÚ´æÒÔ¼°¹ÜÀíËüµÄºËÐÄÊý¾Ý½á¹¹·Ö²¼Í¼¡£ ÓÉÓÚÄÇЩÐéÄâÄÚ´æÇøÓòÀ´Ô´¸÷²»Ïàͬ£¬LinuxʹÓÃvm_area_structÖÐÖ¸ÏòÒ»×éÐéÄâÄÚ´æ´¦Àí¹ý³ÌµÄÖ¸ÕëÀ´³é Ïó´Ë½Ó¿Ú¡£Í¨¹ýʹÓÃÕâ¸ö²ßÂÔ£¬ËùÓеĽø³ÌÐéÄâµØÖ·¿ÉÒÔÓÃÏàͬµÄ·½Ê½´¦Àí¶øÎÞÐèÁ˽âµ×²ã¶ÔÓÚÄÚ´æ¹ÜÀíµÄÇø±ð¡£Èçµ±½ø³ÌÊÔͼ·ÃÎʲ»´æÔÚÄÚ´æÇøÓòʱ£¬ÏµÍ³Ö»ÐèÒªµ÷ÓÃÒ³Ãæ´íÎó´¦Àí¹ý³Ì¼´¿É¡£
Ϊ½ø³Ì´´½¨ÐÂÐéÄâÄÚ´æÇøÓò»ò´¦ÀíÒ³Ãæ²»ÔÚÎïÀíÄÚ´æ´íÎóʱ£¬LinuxºËÐÄÖØ¸´Ê¹Óýø³ÌµÄvm_area_structÊý¾Ý½á¹¹¼¯ºÏ¡£ÕâÑùÏûºÄÔÚ²éÕÒvm_area_structÉϵÄʱ¼äÖ±½ÓÓ°ÏìÁËϵͳÐÔÄÜ¡£Linux°Ñvm_area_structÊý¾Ý½á¹¹ÒÔAVL(Adelson-Velskii and Landis)Ê÷½á¹¹Á¬½ÓÒÔ¼Ó¿ìËÙ¶È¡£ÔÚÕâÖÖÁ¬½ÓÖУ¬Ã¿¸övm_area_struct½á¹¹ÓÐÒ»¸ö×óÖ¸ÕëºÍÓÒÖ¸ÕëÖ¸Ïòvm_area_struct½á¹¹¡£×ó±ßµÄÖ¸ÕëÖ¸ÏòÒ»¸ö¸üµÍµÄÐéÄâÄÚ´æÆðʼµØÖ·½Úµã¶øÓұߵÄÖ¸ÕëÖ¸ÏòÒ»¸ö¸ü¸ßÐéÄâÄÚ´æÆðʼµØÖ·½Úµã¡£ÎªÁËÕÒµ½Ä³¸öµÄ½Úµã£¬Linux´ÓÊ÷µÄ¸ù½Úµã¿ªÊ¼²éÕÒ£¬Ö±µ½ÕÒµ½ÕýÈ·µÄvm_area_struct½á¹¹¡£²åÈë»òÕßÊÍ·ÅÒ»¸övm_area_struct½á¹¹²»»áÏûºÄ¶îÍâµÄ´¦Àíʱ¼ä¡£
µ±½ø³ÌÇëÇó·ÖÅäÐéÄâÄÚ´æÊ±£¬Linux²¢²»Ö±½Ó·ÖÅäÎïÀíÄÚ´æ¡£ËüÖ»ÊÇ´´½¨Ò»¸övm_area_struct ½á¹¹À´ÃèÐð´ËÐéÄâÄڴ棬´Ë½á¹¹±»Á¬½Óµ½½ø³ÌµÄÐéÄâÄÚ´æÁ´±íÖС£µ±½ø³ÌÊÔͼ¶ÔзÖÅäµÄÐéÄâÄÚ´æ½øÐÐд²Ù×÷ʱ£¬ÏµÍ³½«²úÉúÒ³Ãæ´í¡£´¦ÀíÆ÷»á³¢ÊÔ½âÎö´ËÐéÄâµØÖ·£¬µ«ÊÇÈç¹ûÕÒ²»µ½¶ÔÓ¦´ËÐéÄâµØÖ·µÄÒ³±íÈë¿Úʱ£¬´¦ÀíÆ÷½«·ÅÆú½âÎö²¢²úÉúÒ³Ãæ´íÎóÒì³££¬ÓÉLinuxºËÐÄÀ´´¦Àí¡£LinuxÔò²é¿´´ËÐéÄâµØÖ·ÊÇ·ñÔÚµ±Ç°½ø³ÌµÄÐéÄâµØÖ·¿Õ¼äÖС£Èç¹ûÊÇLinux»á´´½¨ÕýÈ·µÄPTE²¢Îª´Ë½ø³Ì·ÖÅäÎïÀíÒ³Ãæ¡£°üº¬ÔÚ´ËÒ³ÃæÖеĴúÂë»òÊý¾Ý¿ÉÄÜÐèÒª´ÓÎļþϵͳ»òÕß½»»»´ÅÅÌÉ϶Á³ö¡£È»ºó½ø³Ì½«´ÓÒ³Ãæ´íÎ󴦿ªÊ¼¼ÌÐøÖ´ÐУ¬ÓÉÓÚÎïÀíÄÚ´æÒѾ´æÔÚ£¬ËùÒÔ²»»áÔÙ²úÉúÒ³ÃæÒì³£¡£
ϵͳÆô¶¯Ê±×ÜÊÇ´¦ÓÚºËÐÄģʽ£¬´ËʱֻÓÐÒ»¸ö½ø³Ì£º³õʼ»¯½ø³Ì¡£ÏóËùÓнø³ÌÒ»Ñù£¬³õʼ»¯½ø³ÌÒ²ÓÐÒ»¸öÓɶÑÕ»¡¢¼Ä´æÆ÷µÈ±íʾµÄ»úÆ÷״̬¡£µ±ÏµÍ³ÖÐÓÐÆäËü½ø³Ì±»´´½¨²¢ÔËÐÐʱ£¬ÕâЩÐÅÏ¢½«±»´æ´¢ÔÚ³õʼ»¯½ø³ÌµÄtask_struct½á¹¹ÖС£ÔÚϵͳ³õʼ»¯µÄ×îºó£¬³õʼ»¯½ø³ÌÆô¶¯Ò»¸öºËÐÄỊ̈߳¨init£©È»ºó±£ÁôÔÚidle״̬¡£ Èç¹ûûÓÐÈκÎÊÂÒª×ö£¬µ÷¶È¹ÜÀíÆ÷½«ÔËÐÐidle½ø³Ì¡£idle½ø³ÌÊÇΨһ²»ÊǶ¯Ì¬·ÖÅätask_structµÄ½ø³Ì£¬ËüµÄ task_structÔÚºËÐĹ¹Ôìʱ¾²Ì¬¶¨Òå²¢ÇÒÃû×ֺܹ֣¬½Ðinit_task¡£
ÓÉÓÚÊÇϵͳµÄµÚÒ»¸öÕæÕýµÄ½ø³Ì£¬ËùÒÔinitºËÐÄỊ̈߳¨»ò½ø³Ì£©µÄ±êÖ¾·ûΪ1¡£Ëü¸ºÔðÍê³ÉϵͳµÄһЩ³õʼ»¯ÉèÖÃÈÎÎñ£¨Èç´ò¿ªÏµÍ³¿ØÖÆÌ¨Óë°²×°¸ùÎļþϵͳ£©£¬ÒÔ¼°Ö´ÐÐϵͳ³õʼ»¯³ÌÐò£¬Èç/etc/init, /bin/init »òÕß /sbin/init £¬ÕâЩ³õʼ»¯³ÌÐòÒÀÀµÓÚ¾ßÌåµÄϵͳ¡£init³ÌÐòʹÓÃ/etc/inittab×÷Ϊ½Å±¾ÎļþÀ´´´½¨ÏµÍ³ÖеÄнø³Ì¡£ÕâЩнø³ÌÓÖ´´½¨¸÷×ÔµÄнø³Ì¡£ÀýÈçgetty½ø³Ì½«ÔÚÓû§ÊÔͼµÇ¼ʱ´´½¨Ò»¸ölogin½ø³Ì¡£Ïµ ͳÖÐËùÓнø³Ì¶¼ÊÇ´ÓinitºËÐÄÏß³ÌÖÐÅÉÉú³öÀ´¡£
нø³Ìͨ¹ý¿Ë¡ÀϽø³Ì»òµ±Ç°½ø³ÌÀ´´´½¨¡£ÏµÍ³µ÷ÓÃfork»òclone¿ÉÒÔ´´½¨ÐÂÈÎÎñ£¬¸´ÖÆ·¢ÉúÔÚºËÐÄ״̬ϵĺËÐÄÖС£ÔÚϵͳµ÷ÓõĽáÊø´¦ÓÐÒ»¸öнø³ÌµÈ´ýµ÷¶È¹ÜÀíÆ÷Ñ¡ÔñËüÈ¥ÔËÐС£ÏµÍ³´ÓÎïÀíÄÚ´æÖзÖÅä³öÀ´Ò»¸öеÄtask_structÊý¾Ý½á¹¹£¬Í¬Ê±»¹ÓÐÒ»¸ö»ò¶à¸ö°üº¬±»¸´Öƽø³Ì¶ÑÕ»£¨Óû§ÓëºËÐÄ£©µÄÎïÀíÒ³Ãæ¡£È»ºó´´½¨Î¨Ò»µØ±ê¼Ç´ËÐÂÈÎÎñµÄ½ø³Ì±êÖ¾·û¡£µ«¸´Öƽø³Ì±£ÁôÆä¸¸½ø³ÌµÄ±êÖ¾·ûÒ²ÊǺÏÀíµÄ¡£Ð´´½¨µÄtask_struct½«±»·ÅÈëtaskÊý×éÖУ¬ÁíÍ⽫±»¸´Öƽø³ÌµÄtask_structÖеÄÄÚÈÝÒ³±í¿½ÈëеÄtask_structÖС£
¸´ÖÆÍê³Éºó£¬LinuxÔÊÐíÁ½¸ö½ø³Ì¹²Ïí×ÊÔ´¶ø²»ÊǸ´ÖƸ÷×ԵĿ½±´¡£ÕâЩ×ÊÔ´°üÀ¨Îļþ¡¢ÐźŴ¦Àí¹ý³ÌºÍÐéÄâÄÚ´æ¡£½ø³Ì¶Ô¹²Ïí×ÊÔ´Óø÷×ÔµÄcountÀ´¼ÇÊý¡£ÔÚÁ½¸ö½ø³Ì¶Ô×ÊÔ´µÄʹÓÃÍê±Ï֮ǰ£¬Linux¾ø²»»áÊÍ·Å´Ë×ÊÔ´£¬ÀýÈç¸´ÖÆ½ø³ÌÒª¹²ÏíÐéÄâÄڴ棬ÔòÆätask_struct½«°üº¬Ö¸ÏòÔÀ´½ø³ÌµÄmm_structµÄÖ¸Õë¡£mm_struct½«Ôö¼Ócount±äÁ¿ÒÔ±íʾµ±Ç°½ø³Ì¹²ÏíµÄ´ÎÊý¡£
¸´Öƽø³ÌÐéÄâ¿Õ¼äËùÓü¼ÊõµÄÊ®·ÖÇÉÃî¡£¸´Öƽ«²úÉúÒ»×éеÄvm_area_struct½á¹¹ºÍ¶ÔÓ¦µÄmm_struct½á¹¹£¬Í¬Ê±»¹Óб»¸´Öƽø³ÌµÄÒ³±í¡£¸Ã½ø³ÌµÄÈκÎÐéÄâÄڴ涼ûÓб»¿½±´¡£ÓÉÓÚ½ø³ÌµÄÐéÄâÄÚ´æÓеĿÉÄÜÔÚÎïÀíÄÚ´æÖУ¬ÓеĿÉÄÜÔÚµ±Ç°½ø³ÌµÄ¿ÉÖ´ÐÐÓ³ÏóÖУ¬ÓеĿÉÄÜÔÚ½»»»ÎļþÖУ¬ËùÒÔ¿½±´½«ÊÇÒ»¸öÀ§ÄÑÇÒ·±ËöµÄ¹¤×÷¡£LinuxʹÓÃÒ»ÖÖ"copy on write"¼¼Êõ£º½öµ±Á½¸ö½ø³ÌÖ®Ò»¶ÔÐéÄâÄÚ´æ½øÐÐд²Ù×÷ʱ²Å¿½±´´ËÐéÄâÄÚ´æ¿é¡£µ«ÊDz»¹ÜдÓ벻д£¬ÈκÎÐéÄâÄÚ´æ¶¼¿ÉÒÔÔÚÁ½¸ö½ø³Ì¼ä¹²Ïí¡£Ö»¶ÁÊôÐÔµÄÄڴ棬Èç¿ÉÖ´ÐдúÂ룬×ÜÊÇ¿ÉÒÔ¹²ÏíµÄ¡£ÎªÁËʹ"copy on write"²ßÂÔ¹¤×÷£¬±ØÐ뽫ÄÇЩ¿ÉÐ´ÇøÓòµÄÒ³±íÈë¿Ú±ê¼ÇΪֻ¶ÁµÄ£¬Í¬Ê±ÃèÐðËüÃǵÄvm_area_structÊý¾Ý¶¼±»ÉèÖÃΪ"copy on write"¡£µ±½ø³ÌÖ®Ò»ÊÔͼ¶ÔÐéÄâÄÚ´æ½øÐÐд²Ù×÷ʱ½«²úÉúÒ³Ãæ´íÎó¡£ÕâʱLinux½«¿½±´ÕâÒ»¿éÄÚ´æ²¢ÐÞ¸ÄÁ½¸ö½ø³ÌµÄÒ³±íÒÔ¼°ÐéÄâÄÚ´æÊý¾Ý½á¹¹¡£
³ýÁËÒÔÉϼÇʱÆ÷Í⣬Linux»¹Ö§³Ö¼¸ÖÖ½ø³ÌÏà¹ØµÄʱ¼ä¼ä¸ô¶¨Ê±Æ÷¡£
½ø³Ì¿ÉÒÔʹÓÃÕâЩ¶¨Ê±Æ÷ÔÚµ½Ê±Ê±ÏòËü·¢Ë͸÷ÖÖÐźţ¬ÕâЩ¶¨Ê±Æ÷ÈçÏ£º
ÒÔÉÏʱ¼ä¼ä¸ô¶¨Ê±Æ÷¿ÉÒÔͬʱҲ¿ÉÒÔµ¥¶ÀÔËÐУ¬Linux½«ËùÓÐÕâЩÐÅÏ¢´æ´¢ÔÚ½ø³ÌµÄtask_structÊý¾Ý½á¹¹ÖС£Í¨¹ýϵͳµ÷ÓÿÉÒÔÉèÖÃÕâЩʱ¼ä¼ä¸ô¶¨Ê±Æ÷²¢Æô¶¯¡¢ÖÕÖ¹ËüÃÇ»ò¶ÁÈ¡ËüÃǵĵ±Ç°Öµ¡£VirtualºÍProfile¶¨Ê±Æ÷ÒÔÏàͬ·½Ê½´¦Àí¡£
ÿ´ÎʱÖӵδðºóµ±Ç°½ø³ÌµÄʱ¼ä¼ä¸ô¶¨Ê±Æ÷½«µÝ¼õ£¬µ±µ½Ê±Ö®ºó½«·¢ËÍÊʵ±µÄÐźš£
RealʱÖÓ¼ä¸ô¶¨Ê±Æ÷µÄ»úÖÆÓÐЩ²»Í¬£¬ÕâЩ½«ÔÚkernelÒ»ÕÂÖÐÏêϸÌÖÂÛ¡£Ã¿¸ö½ø³ÌÓÐÆä×ÔÉíµÄtimer_listÊý ¾Ý½á¹¹£¬µ±Ê±¼ä¼ä¸ô¶¨Ê±Æ÷ÔËÐÐʱ£¬ËüÃDZ»ÅÅÈëϵͳµÄ¶¨Ê±Æ÷Á´±íÖС£µ±¶¨Ê±Æ÷µ½ÆÚºó£¬µ×²ã´¦Àí¹ý³Ì½«°ÑËü´Ó¶ÓÁÐÖÐɾ³ý²¢µ÷ÓÃʱ¼ä¼ä¸ô´¦Àí¹ý³Ì¡£´Ë¹ý³Ì½«Ïò½ø³Ì·¢ËÍSIGALRMÐźŲ¢ÖØÐÂÆô¶¯¶¨Ê±Æ÷£¬½«ÆäÖØÐ·ÅÈëϵͳʱÖÓ¶ÓÁС£
ÏóUnixÒ»Ñù£¬Linux³ÌÐòͨ¹ýÃüÁî½âÊÍÆ÷À´Ö´ÐС£ÃüÁî½âÊÍÆ÷ÊÇÒ»¸öÓû§½ø³Ì£¬ÈËÃǽ«Æä³ÆÎªshell³ÌÐò¡£
ÔÚLinuxÖÐÓжà¸öshell³ÌÐò£¬×îÁ÷ÐеöÊÇsh¡¢bashºÍtcsh¡£³ýÁ˼¸¸öÄÚÖÃÃüÁîÈçcdºÍpwdÍ⣬ÃüÁî¶¼ÊÇ Ò»¸ö¿ÉÖ´Ðжþ½øÖÆÎļþ¡£µ±¼üÈëÒ»¸öÃüÁîʱ£¬Shell³ÌÐò½«ËÑË÷°üº¬ÔÚ½ø³ÌPATH»·¾³±äÁ¿ÖвéÕÒ·¾¶ÖеÄÄ¿ ¼À´¶¨Î»Õâ¸ö¿ÉÖ´ÐÐÓ³ÏóÎļþ¡£Èç¹ûÕÒµ½£¬ÔòËü±»¼ÓÔØÇÒÖ´ÐС£shellʹÓÃÉÏÃæÃèÐðµÄfork»úÖÆÀ´¸´ÖÆ×ÔÉí È»ºóÓÃÕÒµ½µÄ¶þ½øÖÆ¿ÉÖ´ÐÐÓ³ÏóµÄÄÚÈÝÀ´´úÌæÆä×Ó½ø³Ì¡£Ò»°ãÇé¿öÏ£¬shell½«µÈ´ý´ËÃüÁîµÄÍê³É»òÕß×Ó½ø ³ÌµÄÍ˳ö¡£Äã¿ÉÒÔͨ¹ý°´ÏÂcontrol-Z¼üʹ×Ó½ø³ÌÇл»µ½ºǫ́¶øshellÔٴοªÊ¼ÔËÐС£Í¬Ê±»¹¿ÉÒÔʹÓÃshell ÃüÁîbg½«ÃüÁî·ÅÈëºǫִ́ÐУ¬shell½«·¢ËÍSIGCONTÐźÅÒÔÖØÐÂÆô¶¯½ø³ÌÖ±µ½½ø³ÌÐèÒª½øÐÐÖÕ¶ËÊä³öºÍÊäÈë¡£
¿ÉÖ´ÐÐÎļþ¿ÉÒÔÓÐÐí¶à¸ñʽ£¬ÉõÖÁÊÇÒ»¸ö½Å±¾Îļþ¡£½Å±¾ÎļþÐèҪǡµ±µÄÃüÁî½âÊÍÆ÷À´´¦ÀíËüÃÇ£»ÀýÈç /bin/sh½âÊÍshell½Å±¾¡£¿ÉÖ´ÐÐÄ¿±êÎļþ°üº¬¿ÉÖ´ÐдúÂëºÍÊý¾Ý£¬ÕâÑù²Ù×÷ϵͳ¿ÉÒÔ»ñµÃ×ã¹»µÄÐÅÏ¢½«Æä ¼ÓÔØµ½ÄÚ´æ²¢Ö´ÐÐÖ®¡£Linux×î³£ÓõÄÄ¿±êÎļþÊÇELF£¬µ«ÊÇÀíÂÛÉÏLinux¿ÉÒÔÁé»îµØ´¦Àí¼¸ºõËùÓÐÄ¿±êÎļþ ¸ñʽ¡£
ͨ¹ýʹÓÃÎļþϵͳ£¬LinuxËùÖ§³ÖµÄ¶þ½øÖƸñʽ¼È¿ÉÒÔ¹¹Ôìµ½ºËÐÄÓÖ¿ÉÒÔ×÷Ϊģ¿é¼ÓÔØ¡£ºËÐı£´æ×ÅÒ»¸ö¿ÉÒÔÖ§³ÖµÄ¶þ½øÖƸñʽµÄÁ´±í£¨¼ûͼ4.3£©£¬Í¬Ê±µ±Ö´ÐÐÒ»¸öÎļþʱ£¬¸÷ÖÖ¶þ½øÖƸñʽ±»ÒÀ´Î³¢ÊÔ¡£
LinuxÉÏÖ§³Ö×î¹ãµÄ¸ñʽÊÇa.outºÍELF¡£Ö´ÐÐÎļþ²¢²»ÐèҪȫ²¿¶ÁÈëÄڴ棬¶øÊ¹ÓÃÒ»ÖÖÇëÇó¼ÓÔØ¼¼Êõ¡£½ø³Ì ʹÓõĿÉÖ´ÐÐÓ³ÏóµÄÿһ²¿·Ö±»µ÷ÈëÄÚ´æ¶øÃ»ÓõIJ¿·Ö½«´ÓÄÚ´æÖжªÆú¡£
ELF£¨¿ÉÖ´ÐÐÓë¿ÉÁ¬½Ó¸ñʽ£©ÊÇUnixϵͳʵÑéÊÒÉè¼ÆµÄÒ»ÖÖÄ¿±êÎļþ¸ñʽ£¬ÏÖÔÚÒѳÉΪLinuxÖÐʹÓÃ×î¶àµÄ¸ñʽ¡£µ«ÓëÆäËüÄ¿±êÎļþ¸ñʽÏà±È£¬ÈçECOFFºÍa.out£¬ELFµÄ¿ªÏúÉÔ´ó£¬ËüµÄÓŵãÊǸü¼ÓÁé»î¡£ELF¿ÉÖ´ÐÐÎļþ Öаüº¬¿ÉÖ´ÐдúÂ룬¼´ÕýÎĶΣºtextºÍÊý¾Ý¶Î£ºdata¡£Î»ÓÚ¿ÉÖ´ÐÐÓ³ÏóÖеıíÃèÐðÁ˳ÌÐòÓ¦ÈçºÎ·ÅÈë½ø³ÌµÄ ÐéÄâµØÖ·¿Õ¼äÖС£¾²Ì¬Á¬½ÓÓ³ÏóÊÇͨ¹ýÁ¬½ÓÆ÷ldµÃµ½£¬ÔÚµ¥¸öÓ³ÏóÖаüº¬ËùÓÐÔËÐдËÓ³ÏóËùÐè´úÂëºÍÊý¾Ý¡£ ´ËÓ³ÏóͬʱҲ¶¨ÒåÁËÓ³ÏóµÄÄÚ´æ·Ö²¼ºÍÊ×Ïȱ»Ö´ÐеĴúÂëµÄµØÖ·¡£
ͼ4.4¸ø³öÁËÒ»¸ö¾²Ì¬Á¬½ÓµÄELF¿ÉÖ´ÐÐÓ³ÏóµÄ¹¹³É¡£
ÕâÊÇÒ»¸ö´òÓ¡"Hello World"²¢Í˳öµÄ¼òµ¥C³ÌÐò¡£ÎļþÍ·½«Æä×÷Ϊһ¸ö´øÁ½¸öÎïÀíÎļþÍ·(e_phnum = 2)µÄELFÓ³ÏóÀ´ÃèÐð£¬ÎïÀíÎļþͷλÓÚÓ³ÏóÎļþÆðʼλÖÃ52×Ö½Ú´¦¡£µÚÒ»¸öÎïÀíÎļþÍ·ÃèÐðµÄÊÇÓ³ÏóÖеĿÉÖ´ÐдúÂë¡£Ëü´ÓÐéÄâµØÖ·0x8048000¿ªÊ¼£¬³¤¶ÈΪ65532×Ö½Ú¡£ÕâÊÇÒòΪËü°üº¬ÁËprintf()º¯Êý¿â´úÂëÒÔÊä³ö"Hello World"µÄ¾²Ì¬Á¬½ÓÓ³Ïó¡£Ó³ÏóµÄÈë¿Úµã£¬¼´³ÌÐòµÄµÚÒ»ÌõÖ¸Á²»ÊÇλÓÚÓ³ÏóµÄÆðʼλÖà ¶øÔÚÐéÄâµØÖ·0x8048090£¨e_entry£©´¦¡£´úÂëÕýºÃ½Ó×ŵڶþ¸öÎïÀíÎļþÍ·¡£Õâ¸öÎïÀíÎļþÍ·ÃèÐðÁ˴˳ÌÐòʹÓõÄÊý¾Ý£¬Ëü±»¼ÓÔØµ½ÐéÄâÄÚ´æÖÐ0x8059BB8´¦¡£ÕâЩÊý¾ÝÊǿɶÁ²¢¿ÉдµÄ¡£Äã¿ÉÄÜÒѾעÒâµ½ÁËÊý¾Ý µÄ´óСÔÚÎļþÖÐÊÇ2200×Ö½Ú(p_filesz)µ«ÊÇÔÚÄÚ´æÖеĴóСΪ4248×Ö½Ú¡£ÕâÊÇÒòΪ¿ªÊ¼µÄ2200×Ö½Ú°üº¬µÄÊÇÔ¤Ïȳõʼ»¯Êý¾Ý¶ø½ÓÏÂÀ´µÄ2048×Ö½Ú°üº¬µÄÊDZ»Ö´ÐдúÂë³õʼ»¯µÄÊý¾Ý¡£
µ±Linux½«Ò»¸öELF¿ÉÖ´ÐÐÓ³Ïó¼ÓÔØµ½½ø³ÌµÄÐéÄâµØÖ·¿Õ¼äʱ£¬Ëü²¢²»ÕæµÄ¼ÓÔØÓ³Ïó¡£Ê×ÏÈËü½¨Á¢ÆäÐéÄâÄÚ´æÊý¾Ý½á¹¹£º½ø³ÌµÄvm_area_structÊ÷ºÍÒ³±í¡£µ±³ÌÐòÖ´ÐÐʱ½«²úÉúÒ³Ãæ´í£¬ÒýÆð³ÌÐò´úÂëºÍÊý¾Ý´ÓÎïÀíÄÚ´æÖÐÈ¡³ö¡£³ÌÐòÖÐûÓÐʹÓõ½µÄ²¿·Ö´ÓÀ´¶¼²»»á¼ÓÔØµ½ÄÚ´æÖÐÈ¥¡£Ò»µ©ELF¶þ½øÖƸñʽ¼ÓÔØÆ÷·¢ÏÖÕâ¸öÓ³ÏóÊÇÓÐЧµÄELF¿ÉÖ´ÐÐÓ³Ïó£¬Ëü½«°Ñ½ø³ÌµÄµ±Ç°¿ÉÖ´ÐÐÓ³Ïó´ÓÐéÄâÄÚ´æ³åË¢³öÈ¥¡£µ±½ø³ÌÊÇÒ»¸ö¸´ÖÆÓ³Ïóʱ£¨ËùÓеĽø³Ì¶¼ÊÇ£©£¬¸¸½ø³ÌÖ´ÐеÄÊÇÀϵÄÓ³Ïó³ÌÐò£¬ÀýÈçÏóbashÕâÑùµÄÃüÁî½âÊÍÆ÷¡£Í¬Ê±»¹½«Çå³ýÈκÎÐźŴ¦Àí¹ý³Ì²¢Çҹرմò¿ªµÄÎļþ£¬ÔÚ³åË¢µÄ×îºó£¬½ø³ÌÒѾΪеĿÉÖ´ÐÐÓ³Ïó×÷ºÃÁË×¼±¸¡£²»¹Ü¿ÉÖ´ÐÐÓ³ÏóÊÇÄÄÖÖ¸ñʽ£¬½ø³ÌµÄmm_struct½á¹¹Öн«´æÈëÏàͬÐÅÏ¢£¬ËüÃÇÊÇÖ¸ÏòÓ³Ïó´úÂëºÍÊý¾ÝµÄÖ¸Õë¡£µ±ELF¿ÉÖ´ÐÐÓ³Ïó´ÓÎļþÖжÁ³öÇÒÏà¹Ø³ÌÐò´úÂë±»Ó³Éäµ½½ø³ÌÐéÄâµØÖ·¿Õ¼äºó£¬ÕâЩָÕëµÄÖµ¶¼±»È·¶¨ÏÂÀ´¡£Í¬Ê±vm_area_structÒ²±»½¨Á¢ÆðÀ´£¬½ø³ÌµÄÒ³±íÒ²±»Ð޸ġ£mm_struct½á¹¹Öл¹°üº¬´«µÝ¸ø³ÌÐòºÍ½ø³Ì»·¾³±äÁ¿µÄ²ÎÊýµÄÖ¸Õë¡£
ÁíÒ»·½Ã棬¶¯Ì¬Á¬½ÓÓ³Ïó²¢²»°üº¬È«²¿ÔËÐÐËùÐèÒªµÄ´úÂëºÍÊý¾Ý¡£ÆäÖеÄÒ»²¿·Ö½öÔÚÔËÐÐʱ²ÅÁ¬½Óµ½¹²Ïí¿âÖС£ELF¹²Ïí¿âÁÐ±í»¹ÔÚÔËÐÐʱÁ¬½Óµ½¹²Ïí¿âʱ±»¶¯Ì¬Á¬½ÓÆ÷ʹÓá£LinuxʹÓü¸¸ö¶¯Ì¬Á¬½ÓÆ÷£¬Èçld.so.1£¬libc.so.1ºÍld-linux.so.1£¬ÕâЩ¶¼·ÅÖÃÔÚ/libĿ¼ÖС£ÕâЩ¿âÖаüº¬³£ÓôúÂ룬ÈçCÓïÑÔ×Ó³ÌÐòµÈ¡£Èç¹ûûÓж¯Ì¬Á¬½Ó£¬ËùÓгÌÐò½«²»µÃ²»½«ËùÓпâ¹ý³Ì¿½±´Ò»·Ý²¢Á¬½Ó½øÀ´£¬ÕâÑù½«ÐèÒª¸ü¶àµÄ´ÅÅÌÓëÐéÄâÄÚ´æ¿Õ¼ä¡£Í¨¹ý¶¯Ì¬Á¬½Ó£¬Ã¿¸ö±»ÒýÓÿâ¹ý³ÌµÄÐÅÏ¢¶¼¿ÉÒÔ°üº¬ÔÚELFÓ³ÏóÁбíÖС£ÕâЩÐÅÏ¢ÓÃÀ´°ïÖú¶¯Ì¬Á¬½ÓÆ÷¶¨Î»¿â¹ý³Ì²¢½«ËüÁ¬Èë³ÌÐòµÄµØÖ·¿Õ¼ä¡£
½Å±¾ÎļþµÄÔËÐÐÐèÒª½âÊÍÆ÷µÄ°ïÖú¡£LinuxÖÐÓÐÐíÐí¶à¶àµÄ½âÊÍÆ÷£»ÀýÈçwish¡¢perlÒÔ¼°ÃüÁîÍâ¿Ç³ÌÐòtcsh¡£ LinuxʹÓñê×¼µÄUnix¹æÔò£¬Ôڽű¾ÎļþµÄµÚÒ»Ðаüº¬Á˽ű¾½âÊÍÆ÷µÄÃû×Ö¡£µäÐ͵Ľű¾ÎļþµÄ¿ªÍ·ÈçÏ£º
#!/usr/bin/wish
´ËʱÃüÁî½âÊÍÆ÷»áÊÔ×ÅѰÕҽű¾½âÊÍÆ÷¡£ È»ºóËü´ò¿ª´Ë½Å±¾½âÊÍÆ÷µÄÖ´ÐÐÎļþµÃµ½Ò»¸öÖ¸Ïò´ËÎļþµÄVFS inode²¢Ê¹´Ë½Å±¾½âÊÍÆ÷¿ªÊ¼½âÊʹ˽ű¾¡£Õâʱ½Å±¾ÎļþÃû±ä³ÉÁ˽ű¾½âÊÍÆ÷µÄ0ºÅ²ÎÊý(µÚÒ»¸ö²ÎÊý)²¢ÇÒÆäÓà²ÎÊýÏòÉÏŲһ¸öλÖÃ(ÔÀ´µÄµÚÒ»¸ö²ÎÊý±ä³ÉµÚ¶þ¸ö)¡£½Å±¾½âÊÍÆ÷µÄ¼ÓÔØ¹ý³ÌÓëÆäËû¿ÉÖ´ÐÐÎļþÏàͬ¡£Linux»áÖð¸ö³¢ÊÔ¸÷ÖÖ¶þ½øÖÆ¿ÉÖ´Ðиñʽֱµ½Ëü¿ÉÒÔÖ´ÐС£
File translated from TEX by TTH, version 1.0.