资源描述:
《linux系统调用》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、www.linuxidc.comChapter5:系统调用¢为什么需要系统调用¢相关数据和代码¢例:系统调用getuid()的实现¢添加一个系统调用mysyscall¢再实现一个稍复杂的系统调用边干边学——Linux内核指导Linux公社(LinuxIDC.com)是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。www.linuxidc.comLinux公社www.Linuxidc.com¢Linux公社(LinuxIDC.com)于2006年9月25日注册并开通网站,L
2、inux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心。¢LinuxIDC.com提供包括Ubuntu,Fedora,SUSE技术,以及最新IT资讯等Linux专业类网站。边干边学——Linux内核指导Linux公社(LinuxIDC.com)是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。www.linuxidc.com为什么需要系统调用(1)边干边学——Linux内核指导Linux公社(LinuxID
3、C.com)是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。www.linuxidc.com为什么需要系统调用(2)边干边学——Linux内核指导Linux公社(LinuxIDC.com)是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。www.linuxidc.com相关数据和代码¢arch/i386/kernel/traps.c¢arch/i386/kernel/entry.S系统调用时的内核栈sys_call_tablesystem
4、_call和ret_from_sys_call¢include/linux/unistd.h系统调用编号宏定义展开系统调用glibc展开系统调用INLINE_SYSCALL(getuid,0);边干边学——Linux内核指导Linux公社(LinuxIDC.com)是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。www.linuxidc.com系统调用时的内核栈内核栈用户栈向内中断向外返回用户空间ss函数返回地址用户空间espeipEFLAGS局部变量用户空间cs中断前及
5、iret(系统调用返回)后用户空间eip可用空间的esp系统调用号用户ss中断后(SAVE_ALL前)及iret前(RESTORE_ALL后)的可用空间esp陷入内核时,系统自动从当前进程的TSS(任task_struct务状态段)中获得内核栈的SS和ESP,并完成栈切换内核ss边干边学——Linux内核指导Linux公社(LinuxIDC.com)是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。www.linuxidc.com系统调用时的内核栈18*Stacklayou
6、tin'ret_from_system_call':19*ptraceneedstohaveallregsonthestack.20*iftheorderhereischanged,itneedstobe21*updatedinfork.c:copy_process,signal.c:do_signal,22*ptrace.candptrace.h23*24*0(%esp)-%ebx25*4(%esp)-%ecx26*8(%esp)-%edx27*C(%esp)-%esi28*10(%esp)-%edi29
7、*14(%esp)-%ebp30*18(%esp)-%eax31*1C(%esp)-%ds32*20(%esp)-%es33*24(%esp)-orig_eax34*28(%esp)-%eip35*2C(%esp)-%cs36*30(%esp)-%eflags37*34(%esp)-%oldesp38*38(%esp)-%oldss39*40*"current"isinregister%ebxduringanyslowentries.边干边学——Linux内核指导Linux公社(LinuxIDC.com)是
8、包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。www.linuxidc.com系统调用时的内核栈#defineSAVE_ALLcld;pushl%es;pushl%ds;pushl%eax;pushl%ebp;pushl%edi;pushl%esi;pushl%edx;pushl%ecx;pushl%ebx;movl$(__KERNEL_DS),%edx;