linux系统调用完全剖析x86

linux系统调用完全剖析x86

ID:27622018

大小:132.06 KB

页数:7页

时间:2018-12-05

linux系统调用完全剖析x86_第1页
linux系统调用完全剖析x86_第2页
linux系统调用完全剖析x86_第3页
linux系统调用完全剖析x86_第4页
linux系统调用完全剖析x86_第5页
资源描述:

《linux系统调用完全剖析x86》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、用户程序需要系统提供服务的时候,会通过系统调用产生一个int0x80的软中断,就会进入到系统调用的入口函数,入口函数存放在以下文件当中:[entry_32.S(archx86kernel)]以下是系统调用的入口:ENTRY(system_call)RINGO_INT_FRAME#cantunwindintouserspaceanywaypushl%eax#saveorig_eax,将系统调用号压入栈中CFI_ADJUST_CFA_OFFSET4SAVE.ALL#将寄存器的值压入堆栈当中,压入堆栈的顺序对应着结构体structpt_regs,当出栈的

2、时候,就将这些值传递到结构体structpt_regs里面的成员,从而实现从汇编代码向C程序传递参数。Structpt_regs对应定义在[Ptrace-h(archx86includeas>)]structpt_regs{longebx;longecx;longedx;longesi;longedi;longebp;longeax;intxds;intxes;intxfs;intxgs;longorig_eax;longeip;intxcs;longeflags;longesp;intxss;#GET_THREADJNFO宏获得当前进程的thr

3、eadJnfo结构的地址,获取当前进程的信息。GET_THREAD_INFO(%ebp)#systemcalltracinginoperation/emulation#thread_inof结构中flag字段的_TIF_SYSCALL_TRACESK_TIF_SYSCALL_AUDIT#被置1。如果发生被跟踪的情况则转向相应的处理命令处。testl$_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)jnzsyscall_trace_entry#比较结果不为零的时候跳转。#对用户态进程传递过来的系统调用号的合法性进行检查。#如果

4、不合法则跳转到syscall_badsys标记的命令处。cmpl$(nr_syscalls),%eaxjaesyscall.badsys#比较结果大于或者等于最大的系统调用号的时候跳转,不合法#合法则跳转到相应系统调用号所对应的服务例程当中,#也就是在sys_call_table表中找到了相应的函数入口点。#由于sys_call_table表的表项占4字节,因此获得服务例程指针的具体方法#是将由eax保存的系统调用号乘以4再与sys_call_table表的基址相加。syscall_call:call*sys_call_table(,%eax,4)mo

5、vl%eax,PT_EAX(%esp)#storethereturnvalue将保存的结果返回。接下来,会进入到系统调用表查找到系统调用服务程序的入口函数的地址,再进行跳转,整个过程如下图所示:参数人枝•■鏞囔••system^callsys一calljablc服务例Wrvturnteuiru[syscall_table_32.S(archx86kernel)]ENTR¥(sys_call_table)•longsys_restart一syscall/*0-old"setupO”systemcall,usedforrestarting*/.long

6、sys_exit•longptregs_fork•longsys_read•longsys_write•longsys_open/*5*/.longsys_close•longsys_waitpid•longsys_creat•longsysjink.longsys_unlink/*10*/•longptregs_execve例如我们跟踪一下系统调用open的打开流程:1、open的系统调用号,存放于#defineNRrestartsyscall0#define_NR_exit1#define_NR_fork2#define_NR_read3#defi

7、ne_NR_write4#define_NR_open5#define_NR_close6#define_NR_waitpid7#define_NR_creat8#define_NRJink9#define_NR_unlink10其•屮这里使用了一个宏asmlinkage,我们再看一下它在系统里的定义:[Linkage,h(archx86includeasB)]#ifdefCONFIG_X86_32#defineasmlinkageCPP_ASMLINKAGE_attribute_((regparm(O)))后面的_attribute_((reg

8、parm(O)))表示的是不通过寄存器来传递参数,通过栈来传递所以系统调用的入口函数里而I[e

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。