looper0001 发表于 2016-04-08 22:04

请教一个关于系统调用,现场保护的问题(64位),不胜感激

本帖最后由 looper0001 于 2016-04-08 22:23 编辑

最近在分析一个coredump的问题,但是由于core不完整,导致无法直观的看到案发现场的调用栈,只能通过栈桢结构反推。

但是,由于注册了信号捕获函数core_handler。

也就是,coredump发生时,进程捕获到coredump信号(如:11信号,07信号等),需要先保护现场(寄存器等信息)

之后再通过系统调用,进入信号处理函数core_handler。


但是查了很多资料,没有明确找到,系统调用时的现场保护,压栈了哪些内容?压栈顺序是怎么样的?

在系统调用这一栈桢看到的内容,环境是x64 suse11的:
gdb查看rsp往上的 22 * 8字节内容,但是不知道前面 5 * 8字节保存的是什么内容?

x /22xg $rsp


?
?
?
?
?
r8寄存器
r9寄存器
r10寄存器
r11寄存器
r12寄存器
r13寄存器
r14寄存器
r15寄存器
rbp寄存器
rdi寄存器
rsi寄存器
rdx寄存器
rbx寄存器
rcx寄存器
rax寄存器
rsp寄存器
rip寄存器




有看到关于SAVE_ALL宏的介绍,但是这个应该是32位系统的,对于64位系统应该不一样的吧?

#define SAVE_ALL \
      cld; \
      pushl %es; \
      pushl %ds; \
      pushl %eax; \
      pushl %ebp; \
      pushl %edi; \
      pushl %esi; \
      pushl %edx; \
      pushl %ecx; \
      pushl %ebx; \
      movl $(__USER_DS), %edx; \
      movl %edx, %ds; \
      movl %edx, %es;

页: [1]
查看完整版本: 请教一个关于系统调用,现场保护的问题(64位),不胜感激