转换和copy_to_user宏

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

但是,我收到一个令人讨厌的编译器警告( copy_long_to_usercopy_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转换为long,那么如何在使用copy_to_user的上下文中执行此操作? 我的猜测是这样的: (copy_long_to_user(&info_array[num_filled_kernel].pid, &((long)curr_task->pid)))

在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)); ...... } 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)) ......

您需要一个辅助变量来正确执行此操作。

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

获取辅助变量的地址是合法的,临时(由演员生成)的地址不是。