美文网首页
Linux syscall

Linux syscall

作者: clive0x | 来源:发表于2021-06-09 10:39 被阅读0次

两种方法:

1.传统 int 0x80

2.sysenter,速度更快。

sysenter对于进程栈:

_ _kernel_vsyscall:

pushl %ecx

pushl %edx

pushl %ebp

movl %esp, %ebp

sysenter进入系统栈。

sysenter从TSS获取esp0,加载系统栈,开始在系统栈上保存用户进程现场:

pushl $(__USER_DS)    //ds和ss在一块,对应下图ss

pushl %ebp   //对应下图esp(在_ _kernel_vsyscall 保留用户空间时mov %esp,%bp)

pushfl    //对应下图eflags

pushl $(__USER_CS)  //对应下图cs

pushl $SYSENTER_RETURN // 对应下图eip

后面执行push eax和pushal指令,对应下图从original eax开始。

系统栈如下:

截止到%esp,相当于pt_regs 结构。

由于syscall实现机制,当在gdb里面catch syscall xxx时,进入和退出syscall分别会调用do_syacall_trace()一次,即中断两次。

相关文章

网友评论

      本文标题:Linux syscall

      本文链接:https://www.haomeiwen.com/subject/pmteeltx.html