Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 如何从linux内核x86_64[VMI]获取当前用户堆栈帧的返回地址_Linux Kernel_X86 64 - Fatal编程技术网

Linux kernel 如何从linux内核x86_64[VMI]获取当前用户堆栈帧的返回地址

Linux kernel 如何从linux内核x86_64[VMI]获取当前用户堆栈帧的返回地址,linux-kernel,x86-64,Linux Kernel,X86 64,我想获取当前用户堆栈帧的返回地址 使用基于VMI的方法,从Linux x86_64虚拟机上的某些Linux内核结构。 我可以访问几乎所有寄存器的内容,但目前只能访问 一个上下文切换(CR3事件),所以像RBP或RSP这样的寄存器是 指向内核堆栈而不是用户堆栈 我的第一种方法是获取堆栈/基指针并派生 从它到返回地址的偏移量。但是,访问 任务结构成员线程(类型thread\u struct)及其内部 成员sp或usersp不会产生所需的结果。成员 usersp确实指向用户堆栈中的某个区域,但它肯定没

我想获取当前用户堆栈帧的返回地址 使用基于VMI的方法,从Linux x86_64虚拟机上的某些Linux内核结构。 我可以访问几乎所有寄存器的内容,但目前只能访问 一个上下文切换(CR3事件),所以像RBP或RSP这样的寄存器是 指向内核堆栈而不是用户堆栈

我的第一种方法是获取堆栈/基指针并派生 从它到返回地址的偏移量。但是,访问 任务结构成员线程(类型thread\u struct)及其内部 成员sp或usersp不会产生所需的结果。成员 usersp确实指向用户堆栈中的某个区域,但它肯定没有 保持用户堆栈指针的当前位置。我用了一些简单的 C程序,它打印出每个函数中的堆栈指针,以验证 usersp成员的有效性

另一种方法是跟随包含成员ret的task_struct的ret_堆栈指针(类型ftrace_ret_stack)。该成员引用相同的值 作为上面的usersp成员

但是,我可以通过访问start_stack字段来导出栈顶 来自嵌套在task_结构中的结构mm_结构(指向它的指针)。此信息似乎最接近实际堆栈指针。但是,我不知道如何从中获得所需的回信地址

我注意到task_结构中有一个名为stack的原始指针, 但无法找出关于它的任何详细信息

我知道Windows系统上的“trapframe”结构,但找不到 Linux上的等效版本

提前谢谢