开发者

Get_user running at kernel mode returns error

开发者 https://www.devze.com 2022-12-28 15:54 出处:网络
I have a problem with get_user() macro. What I did is as follows: I run the following program int main()

I have a problem with get_user() macro. What I did is as follows:

I run the following program

int main() 
{ 
    int a = 20; 
    printf("address of a: %p", &a); 
    sleep(200); 
    return 0; 
} 

When the program runs, it outputs the address of a, say, 0xbff91914.

Then I pass this address to a module running in Kernel Mode that retrieves the contents at this address (at the time when I did this, I al开发者_开发百科so made sure the process didn't terminate, because I put it to sleep for 200 seconds... ):

The address is firstly sent as a string, and I cast them into pointer type.

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); 

However, res is always not 0, meaning that get_user returns error. I am wondering what is the problem....

Thank you!!

-- Fangkai


That is probably because you're trying to get value from a different user space. That address you got is from your simple program's address space, while you're probably using another program for passing the value to the module, aren't you?


The call to get_user must be made in the context of the user process.

Since you write "I also made sure the process didn't terminate, because I put it to sleep for 200 seconds..." I have a feeling you are not abiding by that rule. For the call to get_user to be in the context of the user process, you would have had to make a system call from that process and there would not have been a need to sleep the process.

So, you need to have your user process make a system call (an ioctl would be fine) and from that system call make the call to get_user.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号