美文网首页
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