我遇到了get_user()宏的问题。我所做的如下:
我运行以下程序
int main()
{
int a = 20;
printf("address of a: %p", &a);
sleep(200);
return 0;
}
当程序运行时,它输出a的地址,比如0xbff91914。
然后我将这个地址传递给在内核模式下运行的模块,该模块检索此地址的内容(当我这样做的时候,我也确保进程没有终止,因为我让它睡了200秒......):
首先将地址作为字符串发送,然后将其转换为指针类型。
int * ptr = (int*)simple_strtol(buffer, NULL,16);
printk("address: %p",ptr); // I use this line to make sure the cast is correct. When running, it outputs bff91914, as expected.
int val = 0;
int res;
res= get_user(val, (int*) ptr);
但是,res始终不为0,这意味着get_user返回错误。我想知道是什么问题......
谢谢!
- 方凯
答案 0 :(得分:3)
这可能是因为您试图从不同的用户空间中获取价值。你得到的地址来自简单程序的地址空间,而你可能正在使用另一个程序将值传递给模块,不是吗?
答案 1 :(得分:2)
必须在用户进程的上下文中调用get_user
。
既然你写了“我也确保过程没有终止,因为我让它睡了200秒......”我有一种感觉你不遵守那个规则。对于对get_user的调用是在用户进程的上下文中,您将不得不从该进程进行系统调用,并且不需要让该进程休眠。
因此,您需要让您的用户进程进行系统调用(ioctl
没问题)并从该系统调用调用get_user
。