两种方法:
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()一次,即中断两次。
网友评论