转换和copy_to_user宏
我需要将curr_task->pid
(内核空间中的curr_task->pid
复制到用户空间中具有很长空间的结构字段。 由于这是一个不断扩大的转换,我不期待任何问题。
但是,我收到一个令人讨厌的编译器警告( 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
转换为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);
获取辅助变量的地址是合法的,临时(由演员生成)的地址不是。