在内核模式下运行的Get_user会返回错误

时间:2010-04-28 05:11:22

标签: linux-kernel

我遇到了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返回错误。我想知道是什么问题......

谢谢!

- 方凯

2 个答案:

答案 0 :(得分:3)

这可能是因为您试图从不同的用户空间中获取价值。你得到的地址来自简单程序的地址空间,而你可能正在使用另一个程序将值传递给模块,不是吗?

答案 1 :(得分:2)

必须在用户进程的上下文中调用get_user

既然你写了“我也确保过程没有终止,因为我让它睡了200秒......”我有一种感觉你不遵守那个规则。对于对get_user的调用是在用户进程的上下文中,您将不得不从该进程进行系统调用,并且不需要让该进程休眠。

因此,您需要让您的用户进程进行系统调用(ioctl没问题)并从该系统调用调用get_user