Bri*_*ian 6 c linux assembly system-calls inline-assembly
我正在做一些实验,并希望能够在系统调用期间查看堆栈中保存的内容(用户登陆过程的已保存状态).根据http://lxr.linux.no/#linux+v2.6.30.1/arch/x86/kernel/entry_32.S它表明寄存器的各种值都保存在堆栈指针的那些特定偏移处.这是我一直试图用来检查堆栈上保存的代码的代码(这是我创建的自定义系统调用):
asm("movl 0x1C(%esp), %ecx");
asm("movl %%ecx, %0" : "=r" (value));
Run Code Online (Sandbox Code Playgroud)
其中value是unsigned long.
截至目前,该值不是预期的值(它显示为ds的用户值保存0).
我是否正确访问堆栈指针的偏移量?
另一种可能性是我可以在内核中使用调试器(如GDB)来检查堆栈内容吗?我没有广泛使用调试,也不知道如何在内核中调试代码.任何帮助深表感谢.
无需内联装配.entry_32.S推送到堆栈以进行系统调用的已保存状态被布置为a struct pt_regs,您可以像这样得到指针(您需要包含<asm/ptrace.h>和/或<asm/processor.h>直接或间接):
struct pt_regs *regs = task_pt_regs(current);
请记住,x86_64 代码通常会在寄存器中传递值(因为它有很多寄存器),因此堆栈上不会有任何内容。检查 gcc 中间输出 ( IIRC) 并在程序集中-S查找。push
我不熟悉调试内核代码,但 gdb 绝对更适合交互式检查堆栈。