¼ÓÈëÊÕ²Ø | ÉèΪÊ×Ò³ | »áÔ±ÖÐÐÄ | ÎÒҪͶ¸å ·ðɽվ³¤Íø £¨https://www.0757zz.com/£©- ¿Æ¼¼¡¢½¨Õ¾¡¢¾­Ñé¡¢ÔÆ¼ÆËã¡¢5G¡¢´óÊý¾Ý,Õ¾³¤Íø!
µ±Ç°Î»Ö㺠Ê×Ò³ > ·þÎñÆ÷ > ´î½¨»·¾³ > Unix > ÕýÎÄ

kernelѧϰ֮ϵͳµ÷Óùý³Ì·ÖÎö

·¢²¼Ê±¼ä£º2016-10-08 19:39:29 ËùÊôÀ¸Ä¿£ºUnix À´Ô´£ºÍøÂçÕûÀí
µ¼¶Á£º¹ý³Ì·ÖÎö£º 1¡¢ÏµÍ³µ÷ÓÃÐèÒªÒ»¸öÓû§¿Õ¼äµ½Äں˿ռäµÄת»»£¬²»Í¬µÄƽ̨Óв»Í¬µÄÖ¸ÁîÀ´Íê³ÉÕâÑùµÄת»»£¬Õâ¸öÖ¸ÁîÒ²½Ð×ö²Ù×÷ϵͳÏÝÈë(operating systemtrap)Ö¸Áî

kernelѧϰ֮ϵͳµ÷Óùý³Ì·ÖÎö

¹ý³Ì·ÖÎö£º

1¡¢ÏµÍ³µ÷ÓÃÐèÒªÒ»¸öÓû§¿Õ¼äµ½Äں˿ռäµÄת»»£¬²»Í¬µÄƽ̨Óв»Í¬µÄÖ¸ÁîÀ´Íê³ÉÕâÑùµÄת»»£¬Õâ¸öÖ¸ÁîÒ²½Ð×ö²Ù×÷ϵͳÏÝÈë(operating systemtrap)Ö¸Áî¡£ÔÚlinuxÖжÔÓÚx86À´ËµÊÇÓÃÈíÖжÏ0x80£¬Ò²¼´ÊÇint $0x80¡£ÈíÖжÏÓÉÈí¼þÖ¸Áî´¥·¢£¬Ó²ÖжÏÓÉÓ²¼þ´¥·¢¡£

ͨ¹ýÈíÖжϣ¬ÏµÍ³»áÌøµ½Ò»¸öÔ¤¶¨µÄÄں˿ռ䡣ËüÖ¸ÏòÁËϵͳµ÷Óô¦Àí³ÌÐò(²»ÊÇϵͳµ÷Ó÷þÎñ³ÌÐò)system_callº¯Êý(arch/x86/kernel/entry32.h)¡£ÈçÉÏͼ¡£

2¡¢system_callµ½·þÎñ³ÌÐò

ÏÔÈ»ËùÓеÄϵͳµ÷Óö¼»áÌøµ½Õâ¸öµØÖ·Ö´ÐÐsystem_callº¯Êý¡£ÔÚÖ´ÐÐint 0x80ʱϵͳµ÷ÓúŻᱻ·ÅÈëeax¼Ä´æÆ÷ÖС£ÒòΪsys_call_tableÿ¸öÏîÕ¼ÓÃ4¸ö×Ö½Ú¡£ËùÒÔsys_call_table×÷Ϊ»ùµØÖ·£¬eax*4×÷ÎªÆ«ÒÆÁ¿¾Í¿ÉÒÔÕÒµ½¶ÔÓ¦µÄ·þÎñ³ÌÐòµÄµØÖ·¡£

ϵͳµ÷ÓõIJÎÊýͨ¹ýÆäËû¼Ä´æÆ÷À´´«µÝ¡£Èç

write(unsignedint fd,const char *buf,size_t count)

¼Ä´æÆ÷ebx,ecx,esi,edxÀ´´«µÝ¡£µ«ÊÇÇ°ÃæÎÒÃÇ˵¹ý£¬asmlinkage±íʾÄں˴ӶÑÕ»ÖÐÌáÈ¡²ÎÊý£¬¶ø²»ÊǼĴæÆ÷¡£ÒòΪÔÚsystem_callÖ´ÐÐʱÊ×ÏȰÑÕâЩ¼Ä´æÆ÷ѹÈë¶ÑÕ»ÁË¡£´ÓÏÂÃæµÄ´úÂëÖоͿÉÕÒµ½´ð°¸~~~

ENTRY(system_call)  
      
     RING0_INT_FRAME             # can't unwind into user spaceanyway  
      
     pushl_cfi%eax              # save orig_eax  
      
     SAVE_ALL  
      
     GET_THREAD_INFO(%ebp)  
      
                       #system call tracing in operation / emulation  
      
     testl$_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)  
      
     jnzsyscall_trace_entry  
      
     cmpl$(nr_syscalls), %eax  
      
     jaesyscall_badsys  
      
syscall_call:  
      
     call*sys_call_table(,%eax,4)

ϵͳ·þÎñ³ÌÐò´Ó¶ÑÕ»ÖлñÈ¡²ÎÊý£¬²¢Ð޸ģ¬×îºóÔÙͨ¹ý¶ÑÕ»·µ»ØÐ޸ĺóµÄÊýÖµ¡£

²»ÊÇËùÓеÄϵͳµ÷Óö¼ÓÐʵ¼ÊÄÚÈÝ£¬Èçsys_ni_syscllÔÚkernel/sys_ni.cÖж¨Ò壺

asmlinkage long sys_ni_syscall(void){  
      
return -ENOSYS;  
      
}

Äã»á·¢ÏÖÔÚsys_call_tableÖÐsys_ni_syscallÕ¼¾ÝÁ˺ܶàÄÚÈÝ£¬ÆäʵËü´ú±í×ÅÒѱ»ÌÔÌ­µÄϵͳµ÷Óá£

.longsys_ni_syscall   /* old stty syscallholder */
      
.longsys_ni_syscall   /* old gtty syscallholder */
      
.longsys_access  
      
.longsys_nice  
      
.longsys_ni_syscall   /* 35 - old ftime syscallholder */
      
.longsys_sync  
      
.longsys_kill  
      
.longsys_rename  
      
.longsys_mkdir  
      
.longsys_rmdir        /* 40 */
      
.longsys_dup  
      
.longsys_pipe  
      
.longsys_times  
      
.longsys_ni_syscall   /* old prof syscallholder */

ÈçÉÏÃæ¿ÉÖªsys_ni_syscall´úÌæÁ˲»ÓõÄsttyºÍgttyºÍprof¡£ÆäʵֻҪÊDZ»ÄÚºËÌÔÌ­µÄϵͳµ÷Óö¼»á±»sys_ni_systcall´úÌæ¡£Ö®ËùÒÔÕâÑùÊÇΪÁËÀϵijÌÐòÔÚеÄÄÚºËÉÏÔËÐÐʱ²»ÖÁÓÚ³öÏÖ´óµÄÎÊÌâ¡£Èç²»Ó¦µ÷ÓÃÕâ¸öϵͳµ÷ÓÃÈ´µ÷ÓÃÁËÄǸöϵͳµ÷ÓÃÁË¡£

²é¿´±¾À¸Ä¿¸ü¶à¾«²ÊÄÚÈÝ£ºhttp://www.bianceng.cn/OS/unix/

£¨±à¼­£º·ðɽվ³¤Íø£©

¡¾ÉùÃ÷¡¿±¾Õ¾ÄÚÈݾùÀ´×ÔÍøÂ磬ÆäÏà¹ØÑÔÂÛ½ö´ú±í×÷Õ߸öÈ˹۵㣬²»´ú±í±¾Õ¾Á¢³¡¡£ÈôÎÞÒâÇÖ·¸µ½ÄúµÄȨÀû£¬Ç뼰ʱÓëÁªÏµÕ¾³¤É¾³ýÏà¹ØÄÚÈÝ!

    ÍÆ¼öÎÄÕÂ
      ÈȵãÔĶÁ