【发布时间】:2021-02-11 02:53:39
【问题描述】:
我正在编写内核系统调用,我想读取用户的基指针寄存器 (RBP)。也许我可以使用为参数传递的pt_regs 结构来做到这一点,不是吗?
示例代码:
unsigned long int data;
asmlinkage int my_read(int d)
{
get_rbp_of_userStack(&data);#or somthing like that
}
我知道这些数据保存在某处用于上下文切换,我该如何获取它?
这是我的用户代码
void rar()
{//rbp here should be rsp when it call so it basically the return addres of the main
char t[10];
getchar();
}
int main()
{
rar();
}
【问题讨论】:
-
您正在为当前任务在
struct pt_regs中寻找bp。 Where is eax in the pt_regs struct? Only ax is present -
@PeterCordes 但如何加载新的 pt_regs 使其不会为空?
-
IIRC,
current(属于 tyep task_struct)有一个 pt_regs 成员。但是我没有做很多内核代码的东西,所以我没有发布答案。 -
嘿彼得,非常感谢您的回答 :-)
-
这里的rbp在调用时应该是rsp,所以它基本上是main的返回地址 - 呃,什么?如果您使用
-fno-omit-frame-pointer编译,则 RBP 指向已保存的 RBP,是的。但是系统调用的 libc 包装器通常不会以这种方式编译,因此除非您将syscall内联到asm()语句,否则情况可能不会如此。并且保存的 RBP 值不是返回地址;他们通常下一个返回地址。
标签: c linux-kernel x86 kernel-module cpu-registers