C 如何确定保存在堆栈上的值?
我正在做一些实验,希望能够看到在系统调用期间堆栈上保存了什么(用户登录进程的保存状态)。根据它显示,寄存器的各种值保存在堆栈指针的特定偏移处。下面是我一直试图用来检查堆栈上保存的内容的代码(这是在我创建的自定义系统调用中): 其中,值为无符号长字符串 到目前为止,该值不是预期值(它显示为ds的用户值保存了0) 我是否正确访问堆栈指针的偏移量C 如何确定保存在堆栈上的值?,c,linux,assembly,inline-assembly,system-calls,C,Linux,Assembly,Inline Assembly,System Calls,我正在做一些实验,希望能够看到在系统调用期间堆栈上保存了什么(用户登录进程的保存状态)。根据它显示,寄存器的各种值保存在堆栈指针的特定偏移处。下面是我一直试图用来检查堆栈上保存的内容的代码(这是在我创建的自定义系统调用中): 其中,值为无符号长字符串 到目前为止,该值不是预期值(它显示为ds的用户值保存了0) 我是否正确访问堆栈指针的偏移量 另一种可能是,我是否可以在内核中使用GDB之类的调试器来检查堆栈内容?我对调试没有太多的用途,也不知道如何调试内核中的代码。非常感谢您的帮助 请记住,x86
另一种可能是,我是否可以在内核中使用GDB之类的调试器来检查堆栈内容?我对调试没有太多的用途,也不知道如何调试内核中的代码。非常感谢您的帮助 请记住,x86_64代码通常会在寄存器中传递值(因为它的寄存器太多),所以堆栈中不会有任何内容。检查gcc中间输出(
-S
IIRC),并在程序集中查找push
我不熟悉调试内核代码,但gdb绝对更适合以交互方式检查堆栈。内联汇编比看起来更复杂。试图简要介绍GCC关注的问题:
asm("movl 0x1C(%%esp), %0;"
: "=r" (value)
: /* no inputs :) */
/* no modified registers */
);
输出参数不需要在clobber列表中,因为GCC已经知道它将被更改
或者,由于您只需要ESP寄存器的值,因此可以避免这样做的所有痛苦:
register int esp asm("esp");
esp += 0x1C;
这也许不能解决你的问题,但这是一条路要走。参考、检查和。无需在线组装。
entry\u 32.S
为系统调用推送到堆栈上的保存状态以struct pt\u regs
的形式显示,您可以像这样获得指向它的指针(您需要直接或间接地包括
和/或
):
struct pt_regs*regs=任务pt_regs(当前)代码>
register int esp asm("esp");
esp += 0x1C;