ºìÁªLinuxÃÅ»§
Linux°ïÖú

LinuxÄں˷ÖÎö--ϵͳµ÷ÓÃʵÏÖ´úÂë·ÖÎö

·¢²¼Ê±¼ä:2006-10-31 09:06:46À´Ô´:ºìÁª×÷Õß:MORR
¡¡¡¡Æô¶¯Ôç¾Í¶ÁÍ꣬ÏÖÔÚΪÁËд±Ê¼ÇÔÙ´ÓÆô¶¯Ö®ºó´ÖÂԵĴóÌå¶ÁÒ»±é£¬»ù±¾¾ÍÊǼ¸¸ö´óÄ£¿é£ºÆô¶¯ºÍ³õʼ»¯£¬ÖжÏÐźţ¬½ø³Ì¼°µ÷¶È£¬ÄÚ´æ¹ÜÀí£¬Îļþϵͳ£¬ÍøÂ磬Çý¶¯ºÍÄ£¿éµÈ£¬ÎÒÖ÷ÒªÒ²´ÓÕ⼸¿éÈëÊÖ¡£ÓÉÓÚÆô¶¯²¿·ÖÔÚstart_kernel֮ǰǣÉæµ½´óÁ¿µÄx86ÌåϵÏà¹ØµÄ»ã±à֪ʶ£¬ÐèÒª´óÁ¿µÄʱ¼ä£¬ÓÚÊÇÎÒÌø¹ý£¬ÏÈ°ÑÎÕÕû¸öϵͳµÄ´óÌåÂöÂ磬Ȼºó×ö¶þ´Î£¬Èý´Î·ÖÎö¡£ÍøÂ粿·ÖµÄ·ÖÎö£¬ÎÒ»á´Ó4.4BSD-LiteµÄ´úÂëÖзÖÎö¡£

¡¡¡¡ÏµÍ³µ÷Óãº

¡¡¡¡ÏÈ˵һÏÂϵͳµ÷Óã¬Ææ¹ÖµÄºÜ£¬ËùÓеĶÁºË×ÊÁ϶¼Ã»ÓаÑϵͳµ÷Óõ¥¶ÀÌá³öÀ´Ëµ£¬ÎÒ¾õµÃ»¹ÊDZȽÏÖØÒªµÄ¡£Óû§ºÍϵͳÄÚºËͨÐŵĹؼüµÄÊàŦ£¬²»¹ý·Ö°É£¬ºÇºÇ¡£×ÐϸÑо¿Ò»ÏÂËüµÄ»úÖÆ£¬×¼±¸»¨ÈýÌìʱ¼ä£¬ÊÖÍ·ÓÐЩÊéºÍ×ÊÁÏ£¬°ïÖúÎÒÀí½â¡£

¡¡¡¡¸ÅÄ£¨Ã÷Îúһϻù±¾¸ÅÄϵͳµ÷Ó÷¢ÉúÔÚÓû§½ø³Ì£¬Í¨¹ýһЩÌØÊâµÄº¯Êý£¨Èçopen£©À´ÇëÇóÄÚºËÌṩ·þÎñ£¬Õâʱ£¬Óû§½ø³Ì¹ÒÆð£¬ÄÚºËÑéÖ¤Óû§ÇëÇ󣬳¢ÊÔÖ®ÐУ¬²¢°Ñ½á¹û·´À¡¸øÓû§½ø³Ì£¬½Ó×ÅÓû§½ø³ÌÖØÐÂÆô¶¯¡£ÕâЩ»úÖÆÔÚÒ»°ãµÄ±à³ÌÊéÀﶼÓУ¬ÎÒ¾ÍÊÇÀ´Í¨¹ýÔ´´úÂëµÄʵÏÖÀ´ÌÖÂÛÕâÖÖ»úÖÆ¡£

¡¡¡¡¾ßÌåʵÏÖ´úÂ룺arch/i386/kernel/entry.S£¨Äں˰汾2.2.14£©´Óentry.SµÄµÚ171ÐУ¬¾ÍÊÇsystem_call¿ªÊ¼£¬171-248ÐдúÂëÌù³öÀ´£¬·ÖÎöÒÔ×¢ÊÍÐÎʽ£ºENTRY(system_call) \\ËùÓÐϵͳµ÷ÓõÄÈë¿Úµã£¬²ÎÊýsystem_callÊÇËùÏ£Íû¼¤»îµÄϵͳµ÷ÓõÄÊýpushl £¥eax# ±£´æorig_eax£¬Õâ¸öÖµ¾ÍÊÇÏ£Íûϵͳµ÷ÓÃÊýSAVE_ALL¡£SAVE_ALLºê¶¨ÒåÈçÏ£º

ÒýÓÃ:
¡¡¡¡#define SAVE_ALL cld; pushl £¥es;
pushl £¥ds; pushl £¥eax; pushl £¥ebp; pushl £¥edi;
pushl £¥esi; pushl £¥edx; pushl £¥ecx; pushl £¥ebx;
movl $(__KERNEL_DS),£¥edx; movl £¥dx,£¥ds; movl £¥dx,£¥es;


¡¡¡¡ËûµÄ×÷ÓÃÊÇÏÈ°ÑËùÓмĴæÆ÷µÄֵѹջ£¬È»ºóÔÚsystem_call·µ»Ø֮ǰʹÓÃRESTORE_ALL°ÑÕ»´ÓÕ»Öе¯³ö£¬ÔÚÕâÆäÖÐsystem_call¿ÉÒÔ¸ù¾ÝÐèÒª×ÓȥʹÓüĴæÆ÷µÄÖµ¡£ÈκÎËüµ÷ÓõÄcº¯Êý¶¼¿ÉÒÔ´ÓÕ»ÖвéÕÒµ½ËùÏ£ÍûµÄ²ÎÊý£¬ÒòΪSAVE_ALLÒѾ­°ÑËùÓмĴæÆ÷µÄÖµ¶¼Ñ¹ÈëÕ»ÖÐÁË */GET_CURRENT(£¥ebx) /*ÀûÓÃGET_CURRENTºê´ÓebxÖÐÈ¡µÃµ±Ç°ÈÎÎñÖ¸Õ룬GET_CURRENTºê¶¨ÒåÈçÏ£º#define GET_CURRENT(reg) movl £¥esp, reg; andl $-8192, reg;Õâ¶Î´úÂëÓ¦¸ÃºÜºÃÀí½â£¬°ÑespÖ¸ÒƵ½reg±äÁ¿£¬¼õÈ¥8129µÃµ½µ±Ç°ÈÎÎñµØÖ·¡£cmpl $(NR_syscalls),£¥eax /*²ì¿´±£´æÔÚeaxÖеÄϵͳµ÷ÓÃÊýÊÇ·ñ³¬¹ý×î´óÊý£¨³£ÊýNR_syscalls´ú±íϵͳµ÷ÓõÄ×î´óÊý£©Èç¹ûȷʵ³¬¹ýÁË£¬Çë¿´ÏÂÃæÒ»¾ä:jae badsys£¬³ÌÐòÔòÌøתµ½badsys¡£*/jae badsys testb $0x20,flags(£¥ebx)# PF_TRACESYS/*¼ì²éϵͳµ÷ÓÃÊÇ·ñÕýÔÚ±»¸ú×Ù*/jne tracesys /*Èç¹ûϵͳµ÷Óñ»¸ú×Ù£¬Ôò³ÌÐòÌøתµ½tracesys¡£*/call *SYMBOL_NAME(sys_call_table)(,£¥eax,4)/*µ÷ÓÃϵͳº¯Êý*/¡£/*SYMBOL_NAMEºê²»´¦ÀíÈκι¤×÷£¬Ö»ÊǼòµ¥µÄ±»Îı¾²ÎÊý£¨Ò²¾ÍÊÇϵͳµ÷ÓÃÃû£©ËùÌæ»»£¬ËùÒÔ¿ÉÒÔºöÂÔsys_call_tableÒ²¶¨ÒåÔÚentry.S£¨373ÐУ©ÖУ¬ÊÇÒ»ÕÅÓÉÖ¸ÏòʵÏÖ¸÷ÖÖϵͳµ÷ÓõÄÄں˺¯ÊýµÄº¯ÊýÖ¸Õë×é³ÉµÄ±í£º

ÒýÓÃ:
¡¡¡¡ ENTRY(sys_call_table)
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* 0 - old "setup()" system call*/
¡¡¡¡.long SYMBOL_NAME(sys_exit)
¡¡¡¡.long SYMBOL_NAME(sys_fork)
¡¡¡¡.long SYMBOL_NAME(sys_read)
¡¡¡¡.long SYMBOL_NAME(sys_write)
¡¡¡¡.long SYMBOL_NAME(sys_open)/* 5 */
¡¡¡¡.long SYMBOL_NAME(sys_close)
¡¡¡¡.long SYMBOL_NAME(sys_waitpid)
¡¡¡¡.long SYMBOL_NAME(sys_creat)
¡¡¡¡.long SYMBOL_NAME(sys_link)
¡¡¡¡.long SYMBOL_NAME(sys_unlink)/* 10 */
¡¡¡¡.long SYMBOL_NAME(sys_execve)
¡¡¡¡.long SYMBOL_NAME(sys_chdir)
¡¡¡¡.long SYMBOL_NAME(sys_time)
¡¡¡¡.long SYMBOL_NAME(sys_mknod)
¡¡¡¡.long SYMBOL_NAME(sys_chmod)/* 15 */
¡¡¡¡.long SYMBOL_NAME(sys_lchown)
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* old break syscall holder */
¡¡¡¡.long SYMBOL_NAME(sys_stat)
¡¡¡¡.long SYMBOL_NAME(sys_lseek)
¡¡¡¡.long SYMBOL_NAME(sys_getpid)/* 20 */
¡¡¡¡.long SYMBOL_NAME(sys_mount)
¡¡¡¡.long SYMBOL_NAME(sys_oldumount)
¡¡¡¡.long SYMBOL_NAME(sys_setuid)
¡¡¡¡.long SYMBOL_NAME(sys_getuid)
¡¡¡¡.long SYMBOL_NAME(sys_stime)/* 25 */
¡¡¡¡.long SYMBOL_NAME(sys_ptrace)
¡¡¡¡.long SYMBOL_NAME(sys_alarm)
¡¡¡¡.long SYMBOL_NAME(sys_fstat)
¡¡¡¡.long SYMBOL_NAME(sys_pause)
¡¡¡¡.long SYMBOL_NAME(sys_utime)/* 30 */
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* old stty syscall holder */
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* old gtty syscall holder */
¡¡¡¡.long SYMBOL_NAME(sys_access)
¡¡¡¡.long SYMBOL_NAME(sys_nice)
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* 35 */ /* old ftime syscall holder */
¡¡¡¡.long SYMBOL_NAME(sys_sync)
¡¡¡¡.long SYMBOL_NAME(sys_kill)
¡¡¡¡.long SYMBOL_NAME(sys_rename)
¡¡¡¡.long SYMBOL_NAME(sys_mkdir)
¡¡¡¡.long SYMBOL_NAME(sys_rmdir)/* 40 */
¡¡¡¡.long SYMBOL_NAME(sys_dup)
¡¡¡¡.long SYMBOL_NAME(sys_pipe)
¡¡¡¡.long SYMBOL_NAME(sys_times)
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* old prof syscall holder */
¡¡¡¡.long SYMBOL_NAME(sys_brk)/* 45 */
¡¡¡¡.long SYMBOL_NAME(sys_setgid)
¡¡¡¡.long SYMBOL_NAME(sys_getgid)
¡¡¡¡.long SYMBOL_NAME(sys_signal)
¡¡¡¡.long SYMBOL_NAME(sys_geteuid)
¡¡¡¡.long SYMBOL_NAME(sys_getegid)/* 50 */
¡¡¡¡.long SYMBOL_NAME(sys_acct)
¡¡¡¡.long SYMBOL_NAME(sys_umount)/* recycled never used phys() */
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* old lock syscall holder */
¡¡¡¡.long SYMBOL_NAME(sys_ioctl)
¡¡¡¡.long SYMBOL_NAME(sys_fcntl)/* 55 */
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* old mpx syscall holder */
¡¡¡¡.long SYMBOL_NAME(sys_setpgid)
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* old ulimit syscall holder */
¡¡¡¡.long SYMBOL_NAME(sys_olduname)
¡¡¡¡.long SYMBOL_NAME(sys_umask)/* 60 */
¡¡¡¡.long SYMBOL_NAME(sys_chroot)
¡¡¡¡.long SYMBOL_NAME(sys_ustat)
¡¡¡¡.long SYMBOL_NAME(sys_dup2)
¡¡¡¡.long SYMBOL_NAME(sys_getppid)
¡¡¡¡.long SYMBOL_NAME(sys_getpgrp)/* 65 */
¡¡¡¡.long SYMBOL_NAME(sys_setsid)
¡¡¡¡.long SYMBOL_NAME(sys_sigaction)
¡¡¡¡.long SYMBOL_NAME(sys_sgetmask)
¡¡¡¡.long SYMBOL_NAME(sys_ssetmask)
¡¡¡¡.long SYMBOL_NAME(sys_setreuid)/* 70 */
¡¡¡¡.long SYMBOL_NAME(sys_setregid)
¡¡¡¡.long SYMBOL_NAME(sys_sigsuspend)
¡¡¡¡.long SYMBOL_NAME(sys_sigpending)
¡¡¡¡.long SYMBOL_NAME(sys_sethostname)
¡¡¡¡.long SYMBOL_NAME(sys_setrlimit)/* 75 */
¡¡¡¡.long SYMBOL_NAME(sys_getrlimit)
¡¡¡¡.long SYMBOL_NAME(sys_getrusage)
¡¡¡¡.long SYMBOL_NAME(sys_gettimeofday)
¡¡¡¡.long SYMBOL_NAME(sys_settimeofday)
¡¡¡¡.long SYMBOL_NAME(sys_getgroups)/* 80 */
¡¡¡¡.long SYMBOL_NAME(sys_setgroups)
¡¡¡¡.long SYMBOL_NAME(old_select)
¡¡¡¡.long SYMBOL_NAME(sys_symlink)
¡¡¡¡.long SYMBOL_NAME(sys_lstat)
¡¡¡¡.long SYMBOL_NAME(sys_readlink)/* 85 */
¡¡¡¡.long SYMBOL_NAME(sys_uselib)
¡¡¡¡.long SYMBOL_NAME(sys_swapon)
¡¡¡¡.long SYMBOL_NAME(sys_reboot)
¡¡¡¡.long SYMBOL_NAME(old_readdir)
¡¡¡¡.long SYMBOL_NAME(old_mmap)/* 90 */
¡¡¡¡.long SYMBOL_NAME(sys_munmap)
¡¡¡¡.long SYMBOL_NAME(sys_truncate)
¡¡¡¡.long SYMBOL_NAME(sys_ftruncate)
¡¡¡¡.long SYMBOL_NAME(sys_fchmod)
¡¡¡¡.long SYMBOL_NAME(sys_fchown)/* 95 */
¡¡¡¡.long SYMBOL_NAME(sys_getpriority)
¡¡¡¡.long SYMBOL_NAME(sys_setpriority)
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* old profil syscall holder */
¡¡¡¡.long SYMBOL_NAME(sys_statfs)
¡¡¡¡.long SYMBOL_NAME(sys_fstatfs)/* 100 */
¡¡¡¡.long SYMBOL_NAME(sys_ioperm)
¡¡¡¡.long SYMBOL_NAME(sys_socketcall)
¡¡¡¡.long SYMBOL_NAME(sys_syslog)
¡¡¡¡.long SYMBOL_NAME(sys_setitimer)
¡¡¡¡.long SYMBOL_NAME(sys_getitimer)/* 105 */
¡¡¡¡.long SYMBOL_NAME(sys_newstat)
¡¡¡¡.long SYMBOL_NAME(sys_newlstat)
¡¡¡¡.long SYMBOL_NAME(sys_newfstat)
¡¡¡¡.long SYMBOL_NAME(sys_uname)
¡¡¡¡.long SYMBOL_NAME(sys_iopl)/* 110 */
¡¡¡¡.long SYMBOL_NAME(sys_vhangup)
¡¡¡¡.long SYMBOL_NAME(sys_idle)
¡¡¡¡.long SYMBOL_NAME(sys_vm86old)
¡¡¡¡.long SYMBOL_NAME(sys_wait4)
¡¡¡¡.long SYMBOL_NAME(sys_swapoff)/* 115 */
¡¡¡¡.long SYMBOL_NAME(sys_sysinfo)
¡¡¡¡.long SYMBOL_NAME(sys_ipc)
¡¡¡¡.long SYMBOL_NAME(sys_fsync)
¡¡¡¡.long SYMBOL_NAME(sys_sigreturn)
¡¡¡¡.long SYMBOL_NAME(sys_clone)/* 120 */
¡¡¡¡.long SYMBOL_NAME(sys_setdomainname)
¡¡¡¡.long SYMBOL_NAME(sys_newuname)
¡¡¡¡.long SYMBOL_NAME(sys_modify_ldt)
¡¡¡¡.long SYMBOL_NAME(sys_adjtimex)
¡¡¡¡.long SYMBOL_NAME(sys_mprotect)/* 125 */
¡¡¡¡.long SYMBOL_NAME(sys_sigprocmask)
¡¡¡¡.long SYMBOL_NAME(sys_create_module)
¡¡¡¡.long SYMBOL_NAME(sys_init_module)
¡¡¡¡.long SYMBOL_NAME(sys_delete_module)
¡¡¡¡.long SYMBOL_NAME(sys_get_kernel_syms)/* 130 */
¡¡¡¡.long SYMBOL_NAME(sys_quotactl)
¡¡¡¡.long SYMBOL_NAME(sys_getpgid)
¡¡¡¡.long SYMBOL_NAME(sys_fchdir)
¡¡¡¡.long SYMBOL_NAME(sys_bdflush)
¡¡¡¡.long SYMBOL_NAME(sys_sysfs)/* 135 */
¡¡¡¡.long SYMBOL_NAME(sys_personality)
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* for afs_syscall */
¡¡¡¡.long SYMBOL_NAME(sys_setfsuid)
¡¡¡¡.long SYMBOL_NAME(sys_setfsgid)
¡¡¡¡.long SYMBOL_NAME(sys_llseek)/* 140 */
¡¡¡¡.long SYMBOL_NAME(sys_getdents)
¡¡¡¡.long SYMBOL_NAME(sys_select)
¡¡¡¡.long SYMBOL_NAME(sys_flock)
¡¡¡¡.long SYMBOL_NAME(sys_msync)
¡¡¡¡.long SYMBOL_NAME(sys_readv)/* 145 */
¡¡¡¡.long SYMBOL_NAME(sys_writev)
¡¡¡¡.long SYMBOL_NAME(sys_getsid)
¡¡¡¡.long SYMBOL_NAME(sys_fdatasync)
¡¡¡¡.long SYMBOL_NAME(sys_sysctl)
¡¡¡¡.long SYMBOL_NAME(sys_mlock)/* 150 */
¡¡¡¡.long SYMBOL_NAME(sys_munlock)
¡¡¡¡.long SYMBOL_NAME(sys_mlockall)
¡¡¡¡.long SYMBOL_NAME(sys_munlockall)
¡¡¡¡.long SYMBOL_NAME(sys_sched_setparam)
¡¡¡¡.long SYMBOL_NAME(sys_sched_getparam) /* 155 */
¡¡¡¡.long SYMBOL_NAME(sys_sched_setscheduler)
¡¡¡¡.long SYMBOL_NAME(sys_sched_getscheduler)
¡¡¡¡.long SYMBOL_NAME(sys_sched_yield)
¡¡¡¡.long SYMBOL_NAME(sys_sched_get_priority_max)
¡¡¡¡.long SYMBOL_NAME(sys_sched_get_priority_min) /* 160 */
¡¡¡¡.long SYMBOL_NAME(sys_sched_rr_get_interval)
¡¡¡¡.long SYMBOL_NAME(sys_nanosleep)
¡¡¡¡.long SYMBOL_NAME(sys_mremap)
¡¡¡¡.long SYMBOL_NAME(sys_setresuid)
¡¡¡¡.long SYMBOL_NAME(sys_getresuid)/* 165 */
¡¡¡¡.long SYMBOL_NAME(sys_vm86)
¡¡¡¡.long SYMBOL_NAME(sys_query_module)
¡¡¡¡.long SYMBOL_NAME(sys_poll)
¡¡¡¡.long SYMBOL_NAME(sys_nfsservctl)
¡¡¡¡.long SYMBOL_NAME(sys_setresgid)/* 170 */
¡¡¡¡.long SYMBOL_NAME(sys_getresgid)
¡¡¡¡.long SYMBOL_NAME(sys_prctl)
¡¡¡¡.long SYMBOL_NAME(sys_rt_sigreturn)
¡¡¡¡.long SYMBOL_NAME(sys_rt_sigaction)
¡¡¡¡.long SYMBOL_NAME(sys_rt_sigprocmask)/* 175 */
¡¡¡¡.long SYMBOL_NAME(sys_rt_sigpending)
¡¡¡¡.long SYMBOL_NAME(sys_rt_sigtimedwait)
¡¡¡¡.long SYMBOL_NAME(sys_rt_sigqueueinfo)
¡¡¡¡.long SYMBOL_NAME(sys_rt_sigsuspend)
¡¡¡¡.long SYMBOL_NAME(sys_pread)/* 180 */
¡¡¡¡.long SYMBOL_NAME(sys_pwrite)
¡¡¡¡.long SYMBOL_NAME(sys_chown)
¡¡¡¡.long SYMBOL_NAME(sys_getcwd)
¡¡¡¡.long SYMBOL_NAME(sys_capget)
¡¡¡¡.long SYMBOL_NAME(sys_capset) /* 185 */
¡¡¡¡.long SYMBOL_NAME(sys_sigaltstack)
¡¡¡¡.long SYMBOL_NAME(sys_sendfile)
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* streams1 */
¡¡¡¡.long SYMBOL_NAME(sys_ni_syscall)/* streams2 */
¡¡¡¡.long SYMBOL_NAME(sys_vfork) /* 190 */


¡¡¡¡ÎÒÃÇÀ´¼ÌÐø¿´±¾ÐеÄÈý¸ö²ÎÊý:(,£¥eax,4),ʵÏÖÊý×éË÷Òý¡£µ±È»£¬Õâ¸öÊý×éÊÇÒÔsys_call_table×÷ΪË÷ÒýµÄ£¬³ÆΪƫÒÆ¡£Èý¸ö²ÎÊý·Ö±ð´ú±í£ºÊý×éµÄ»ùµØÖ·£¬Ë÷Òý£¨eax,Ò²¾ÍÊÇϵͳµ÷ÓÃÊý£©ºÍ´óС£¬»òÿ¸öÊý×éÔªËØÖеÄ×Ö½ÚÊý-----ÕâÀïÊÇ4¡£ÓÉÓÚÊý×é»ùµØַΪ¿Õ£¬ËùÒÔ¸³Óè0---µ«ËüÐèÒªºÍÆ«ÒƵØÖ·sys_call_tableÏà¼Ó£¬¼òµ¥µÄ˵ÊÇsys_call_table±»µ±×÷Êý×éµÄ»ùµØÖ·¡£ÎҰѱ¾ÐÐÓÃcÖØдÈçÏ£º

ÒýÓÃ:
¡¡¡¡(sys_call_table)[EAX]();


¡¡¡¡µ±È»£¬c»¹Òª´¦ÀíÐí¶à¹¤×÷£¬ÈçΪÄã¼Í¼Êý×éÔªËصĴóС¡£²»ÒªÍü¼Ç£¬ÏµÍ³µ÷ÓõIJÎÊýÔçÒѾ­´æ´¢ÔÚ¶ÑÕ»ÖÐÁË£¬ÒÔ±ãÓÚsystem_callʹÓÃSAVE_ALL°ÑËûÃÇѹջmovl £¥eax,EAX(£¥esp)# ϵͳµ÷Ó÷µ»Ø/*ËüÔÚEAX¼Ä´æÆ÷Öеķµ»ØÖµ£¨Õâ¸öֵͬʱҲÊÇsystem_callµÄ·µ»ØÖµ£©±»´æ´¢ÁËÆðÀ´¡£·µ»ØÖµ±»´æ´¢ÔÚ¶ÑÕ»ÖеÄEAXÄÚ£¬ÒÔʹµÃRESTORE_ALL¿ÉÒÔѸËٵػָ´Êµ¼ÊµÄEAX¼Ä´æÆ÷¼°ÆäËû¼Ä´æÆ÷µÄÖµ¡£*/

¡¡¡¡ÒÔÏ´úÂëÒÀÈ»ÊÇsystem_callµÄÒ»²¿·Ö£¬ÊÇÒ»¸ö¿ÉÒÔÃüÃûΪret_from_sys_callºÍret_from_intrµÄ¶ÀÁ¢Èë¿Úµã¡£ËüÃÇż¶û»á±»cÖ±½Óµ÷Óã¬Ò²¿ÉÒÔ´Ósystem_callµÄÆäËû²¿·ÖÌøת¹ýÀ´¡£

ÒýÓÃ:
¡¡¡¡ALIGN
¡¡¡¡.globl ret_from_sys_call
¡¡¡¡.globl ret_from_intr
¡¡¡¡ret_from_sys_call:
¡¡¡¡movl SYMBOL_NAME(bh_mask),£¥eax
¡¡¡¡andl SYMBOL_NAME(bh_active),£¥eax
¡¡¡¡jne handle_bottom_half


¡¡¡¡¼ì²âbottom halfÊÇ·ñ¼¤»î£¬Èç¹û¼¤»î£¬³ÌÐò¾ÍÌøתµ½handle_bottom_halfÖ´ÐУ¬bottom halfÊÇÖжϽø³ÌµÄÒ»²¿·Ö£¬ÒÔºóÔÙÌá¼°£¬ÖжϽø³ÌÎҵĸÅÄîÒ²ºÜÄ£ºý¡£

ÒýÓÃ:
¡¡¡¡ret_with_reschedule:
¡¡¡¡cmpl $0,need_resched(£¥ebx)/*¼ì²é½ø³ÌÊÇ·ñΪÔٴε÷¶È×öÁ˱ê¼Ç*/
¡¡¡¡jne reschedule/*Èç¹ûÊÇ£¬¾ÍÌøתµ½reschedule*/
¡¡¡¡cmpl $0,sigpending(£¥ebx)/*¼ì²éÊÇ·ñ»¹ÓйÒÆðÐźÅ*/
¡¡¡¡jne signal_return/*Èç¹ûÓУ¬Ôò³ÌÐòÌøתµ½signal_return*/
¡¡¡¡restore_all:
¡¡¡¡RESTORE_ALL/*system_callµÄÍ˳öµã£¬²Î¿´Ç°ÃæSAVE_ALLµÄÓ÷¨*/


¡¡¡¡ALIGN

¡¡¡¡signal_return:/*µ±system_call´Óϵͳµ÷Ó÷µ»ØÇ°£¬Èç¹ûËü¼ì²âµ½ÐèÒª½«ÐźŴ«Ë͸øµ±Ç°µÄ½ø³Ìʱ£¬²Å»áÖ´Ðе½signal_return¡£Ëüͨ¹ýʹÖжÏÔٴοÉÓÿªÊ¼Ö´ÐС£*/

¡¡¡¡sti# we can get here from an interrupt handler testl $(VM_MASK),EFLAGS(£¥esp)/*¼ì²âÊÇ·ñ·µ»ØÐéÄâ8086ģʽ*/movl £¥esp,£¥eax jne v86_signal_return/*Èç¹ûÊÇ£¬¾ÍÌøתµ½v86_signal_return£¨ÓÉÓÚÐéÄâ8086ÎÒÒ²²»Ì«Àí½â£¬ËùÒÔ¾ÍÌø¹ýÁË£¬£º£¨*/xorl £¥edx,£¥edx /*system_callÐèÒªµ÷ÓÃcº¯Êýdo_signalÀ´ÊÍ·ÅÐźš£do_signalÐèÒªÁ½¸ö²ÎÊý£¬ÕâÁ½¸ö²ÎÊý¶¼ÊÇͨ¹ý¼Ä´æÆ÷À´´«µÝµÄ£»µÚÒ»¸öÊÇEAX¼Ä´æÆ÷£¬ÁíÒ»¸öÊÇedx¼Ä´æÆ÷¡£system_callÒѾ­°ÑµÚÒ»¸ö²ÎÊýµÄÖµ¸³¸øÁËeax£»ÏÖÔÚ£¬°Ñedx¼Ä´æÆ÷ºÍ¼Ä´æÆ÷±¾Éí½øÐÐxor²Ù×÷£¬´Ó¶ø½«ÆäÇå0£¬ÕâÑùdo_signal¾ÍÈÏΪÕâÊÇÒ»¸ö¿ÕÖ¸Õë¡£*/call SYMBOL_NAME(do_signal) /*ºÃ£¬ÏÖÔھͿÉÒÔµ÷ÓÃdo_signalÀ´´«µÝÐźÅÁË*/jmp restore_all /*È»ºóÌøתµ½restore_all½áÊø¡£

ÒýÓÃ:
¡¡¡¡ALIGN
¡¡¡¡v86_signal_return:
¡¡¡¡call SYMBOL_NAME(save_v86_state)
¡¡¡¡movl £¥eax,£¥esp
¡¡¡¡xorl £¥edx,£¥edx
¡¡¡¡call SYMBOL_NAME(do_signal)
¡¡¡¡jmp restore_all


¡¡¡¡tracesys: Ç°Ãæ˵¹ý£¬µ±Óе±Ç°½ø³ÌµÄϵͳµ÷Óñ»Æä×æÏȸú×Ù£¬Èçstrace»òtruss³ÌÐò£¬³ÌÐò¾ÍÌøתµ½´Ë¡£

ÒýÓÃ:
¡¡¡¡movl $-ENOSYS,EAX(£¥esp) /*system_call°Ñ´æ´¢ÔÚ¶ÑÕ»ÖеÄEAX¿½±´¸³Óè-ENOSYS¡£*/
¡¡¡¡call SYMBOL_NAME(syscall_trace) /*µ÷ÓÃsyscall_trace*/
¡¡¡¡movl ORIG_EAX(£¥esp),£¥eax /*ÔÚ172ÐÐÔÙ´ÓËù×÷µÄ¿½±´Öлָ´EAXµÄÖµ*/
¡¡¡¡call *SYMBOL_NAME(sys_call_table)(,£¥eax,4) /*µ÷ÓÃʵ¼ÊµÄϵͳµ÷Óá£*/
¡¡¡¡movl £¥eax,EAX(£¥esp)/*°Ñϵͳµ÷Óõķµ»ØÖµÖÃÈë¶ÑÕ»ÖÐEAXµÄλÖá£*/
¡¡¡¡call SYMBOL_NAME(syscall_trace) /*Ôٴε÷ÓÃsyscall_trace*/
¡¡¡¡jmp ret_from_sys_call /*±»¸ú×ÙµÄϵͳµ÷ÓÃÒѾ­·µ»Ø£¬¿ØÖÆÁ÷³ÌÌøתµ½ret_from_sys_call*/
¡¡¡¡badsys: /*Ç°Ãæ˵¹ý£¬µ±ÏµÍ³µ÷ÓÃÊý³¬¹ý±ß½çֵʱ³ÌÐò¾ÍÌøתµ½ÕâÀï¡£*/
¡¡¡¡movl $-ENOSYS,EAX(£¥esp) /*Õâʱsystem_call±ØÐë·µ»Ø-ENOSYS£¬82ÐаÑENOSYS¸³ÖµÎª38¡£µ÷ÓÃ
¡¡¡¡ Õß»áʶ±ðÕâ¸ö´íÎó*/
¡¡¡¡jmp ret_from_sys_call /*Ìøתµ½ret_from_sys_call*/


¡¡¡¡ret_from_exception:ÔÚÖîÈç³ý0Ö®ÀàµÄcpuÒì³£ÖжÏÇé¿öϽ«Ö´Ðе½ÕâÀsystem_callÄÚ²¿´úÂë²»»áÖ´Ðе½Õâ¸ö±êºÅ£º

ÒýÓÃ:
¡¡¡¡movl SYMBOL_NAME(bh_mask),£¥eax
¡¡¡¡andl SYMBOL_NAME(bh_active),£¥eax
¡¡¡¡jne handle_bottom_half
¡¡¡¡ALIGN
¡¡¡¡ret_from_intr:
¡¡¡¡GET_CURRENT(£¥ebx)
¡¡¡¡movl EFLAGS(£¥esp),£¥eax# mix EFLAGS and CS
¡¡¡¡movb CS(£¥esp),£¥al
¡¡¡¡testl $(VM_MASK | 3),£¥eax# return to VM86 mode or non-supervisor?
¡¡¡¡jne ret_with_reschedule
¡¡¡¡jmp restore_all
¡¡¡¡
¡¡¡¡ALIGN
¡¡¡¡handle_bottom_half:
¡¡¡¡call SYMBOL_NAME(do_bottom_half)
¡¡¡¡jmp ret_from_intr
¡¡¡¡
¡¡¡¡ALIGN
¡¡¡¡reschedule:
¡¡¡¡call SYMBOL_NAME(schedule) # test
¡¡¡¡jmp ret_from_sys_call


¡¡¡¡ÕâÒÔÉϵĴúÂ룬ÎÒ¶¼»¹²»Ì«ÔõôÃ÷°×£¬µÈÎÒŪÃ÷°×Á˾Ͳ¹Æ룬µ«»ù±¾µÄsystem_callµÄÄÚ²¿ºËÐÄ´úÂ붼½éÉÜÍêÁË¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 2 ÌõÆÀÂÛ

  1. cxqcxq0177 ÓÚ 2006-12-12 10:20:11·¢±í:

    ÏÂÏÂÀ´£¬ºÃºÃ¿´¿´:0L

  2. jetli ÓÚ 2006-11-09 09:37:41·¢±í:

    :0D1 :handshake :0(1 :0L