Linux syscall

2021-06-09  本文已影响0人  clive0x

两种方法:

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()一次,即中断两次。

上一篇下一篇

猜你喜欢

热点阅读