linux系统调用完全剖析x86.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用户程序需要系统提供服务的时候,会通过系统调用产生一个int 0x80的软中断,就会 进入到系统调用的入口函数,入口函数存放在以下文件当中: [entry_32.S (arch\x86\kernel)] 以下是系统调用的入口: ENTRY (system_call) RINGO_INT_FRAME # cant unwind into user space anyway pushl %eax # save orig_eax,将系统调用号压入栈中 CFI_ADJUST_CFA_OFFSET 4 SAVE.ALL #将寄存器的值压入堆栈当中,压入堆栈的顺序对应着结构体struct pt_regs,当出栈的时候,就将这些值传递到结构体struct pt_regs里面的成员,从而实现 从汇编代码向C程序传递参数。 Struct pt_regs对应定义在 Struct pt_regs对应定义在 struct pt_regs { long ebx; long ecx; long edx; long esi; long edi; long ebp; long eax; int xds; int xes; int xfs; int xgs; long orig_eax; long eip; int xcs; long eflags; long esp; int xss; #GET_THREADJNFO宏获得当前进程的threadJnfo结构的地址,获取当前进程的 信息。 GET_THREAD_INFO(%ebp) # system call tracing in operation / emulation #thread_inof 结构中 flag 字段的_TIF_SYSCALL_TRACE SK_TIF_SYSCALL_AUDIT #被置1。如果发生被跟踪的情况则转向相应的处理命令处。 testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) jnz syscall_trace_entry #比较结果不为零的时候跳转。 #对用户态进程传递过来的系统调用号的合法性进行检查。 #如果不合法则跳转到syscall_badsys标记的命令处。 cmpl $(nr_syscalls),%eax jae syscall.badsys #比较结果大于或者等于最大的系统调用号的时候跳转,不合法 #合法则跳转到相应系统调用号所对应的服务例程当中, #也就是在sys_call_table表中找到了相应的函数入口点。 #由于sys_call_table表的表项占4字节,因此获得服务例程指针的具体方法 #是将由eax保存的系统调用号乘以4再与sys_call_table表的基址相加。 syscall_call: call *sys_call_table(,%eax,4) movl %eax,PT_EAX(%esp) # store the return value 将保存的结果返回。 接下来,会进入到系统调用表查找到系统调用服务程序的入口函数的地址,再进行跳转,整 个过程如下图所示: 参数人枝?■鏞囔??system ^callsys 一 参数人枝 ?■鏞囔?? system ^call sys 一 calljablc 服务例W rvturn teuiru [syscall_table_32.S (arch\x86\kernel)] ENTR¥(sys_call_table) ?long sys_restart一syscall /* 0 - old setupO” system call,used for restarting */ .long sys_exit ?long ptregs_fork ?long sys_read ?long sys_write ?long sys_open /* 5 */ .long sys_close ?long sys_waitpid ?long sys_creat ?long sysjink .long sys_unlink /* 10 */ ?long ptregs_execve 例如我们跟踪一下系统调用open的打开流程: 1、 1、open的系统调用号, 存放于 TOC \o 1-5 \h \z #define NR restart syscall 0 #define _NR_exit 1 #define _NR_fork 2 #define _NR_read 3 #define _NR_write 4 #define _NR_open 5 #define _NR_close 6 #define _NR_waitpid 7 #define _NR_creat 8 #define

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档