2016-04-16 45 views
0

我需要将内核空间中的curr_task->pid,pid_t复制到用户空间中具有长空间的结构的字段。由于这是一个扩大转换,我不期待任何问题。强制转换和copy_to_user宏

但是,我得到一个恼人的编译器警告(copy_long_to_user是所有意图和目的一样copy_to_user):

cs300/process_ancestors.c:31:3: warning: passing argument 2 of ‘copy_long_to_user’ from incompatible pointer type [enabled by default] 
    if(copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_task->pid)) {  
^
cs300/process_ancestors.c:9:5: note: expected ‘long int *’ but argument is of type ‘pid_t *’ 

这是警告的东西,我可以放心地忽略(将编译器做演员为了我)?如果我需要明确地投入curr_task->pid,我该如何在使用copy_to_user的情况下做到这一点?我的猜测是这样的:(copy_long_to_user(&info_array[num_filled_kernel].pid, &((long)curr_task->pid)))

+0

我希望你不只是采取的@ ChunleiMa的答案的一部分,使copy_long_to_user的'第二个参数的类型()'一'无效*'。 –

+0

不是,答案让我意识到我做错了,虽然 - 当源位置中只有4个字节的数据时,我告诉'copy_to_user'复制8个字节。 – Adam

+0

我想也许像我提到的一个快捷方式可能是什么原因你其他相关的问题:http://stackoverflow.com/questions/36658863/printing-pid-with-d-vs-ld-linux –

回答

2

在Linux内核中,pid_t的类型等于int,因此编译器会警告您int*不能转换为long int*。 我不知道你怎么知道你的copy_long_to_user函数,如果你这样写,你可能会得到一个错误的结果。 copy_long_to_user(long int* dest, long int* src){ copy_to_user(dest, src, sizeof(long int)); ...... } 因为sizeof(long)> = sizeof(int),如果sizeof(long)>sizeof(int),支持sizeof(long) == 8,并且sizeof(int) always 4,你会得到一个错误的结果,因为current_task->pid只是占据dest的4个字节,但copy_to_user(dest, src, sizeof(long int))必须复制8个字节到dest,所以4按照current->pid后的字节复制到dest,所以dest不能等于current->pid。 所以你最好写一个名为copy_pid_to_user,它的代码那样的功能: copy_pid_to_user(long int* dest, void* src){ copy_to_user(dest, src, sizeof(curent->pid)) ......

4

你需要一个辅助变量来正确地做到这一点。

long curr_pid = curr_task->pid; 
copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_pid); 

取一个帮助变量的地址是合法的,一个临时地址(由演员制作)不是。