C 强制转换和复制用户宏
我需要将内核空间中的C 强制转换和复制用户宏,c,casting,linux-kernel,C,Casting,Linux Kernel,我需要将内核空间中的curr\u task->pid,一个pid\u t,复制到用户空间中的一个结构字段,该字段有很长的空间。由于这是一个不断扩大的转换,我不期待任何问题 然而,我得到了一个恼人的编译器警告(copy\u long\u to\u user与copy\u to\u user)完全相同: 这是我可以安全忽略的警告吗(编译器会为我执行强制转换吗)?如果我需要显式地将curr\u task->pid转换为long,那么如何在使用copy\u to\u user的上下文中执行该操作?我的猜
curr\u task->pid
,一个pid\u t
,复制到用户空间中的一个结构字段,该字段有很长的空间。由于这是一个不断扩大的转换,我不期待任何问题
然而,我得到了一个恼人的编译器警告(copy\u long\u to\u user
与copy\u to\u user
)完全相同:
这是我可以安全忽略的警告吗(编译器会为我执行强制转换吗)?如果我需要显式地将
curr\u task->pid
转换为long,那么如何在使用copy\u to\u user
的上下文中执行该操作?我的猜测是这样的:(将长数组复制到用户(&info\u数组[num\u filled\u kernel].pid,&((长)curr\u task->pid))
您需要一个助手变量来正确执行此操作
long curr_pid = curr_task->pid;
copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_pid);
获取助手变量的地址是合法的,而临时(由cast生成)的地址则不是。要正确执行此操作,您需要一个助手变量
long curr_pid = curr_task->pid;
copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_pid);
获取helper变量的地址是合法的,而临时(由强制转换生成)的地址则不是。在Linux内核中,pid的类型等于int,因此编译器警告您,
int*
不能强制转换为long int*
。
我不知道你是如何实现你的copy\u long\u to\u user
功能的,如果你这样写,你可能会得到错误的结果。
将_long_复制到_用户(long int*dest,long int*src){
复制到用户(dest、src、sizeof(long int));
......
}
因为sizeof(long)
=sizeof(int)
,如果sizeof(long)
sizeof(int)
,支持sizeof(long)==8
,并且sizeof(int)总是4
,您将得到错误的结果,因为当前任务-/pid
只占用dest
的4字节,但将U复制到用户(dest,src,sizeof(long int))
必须将8个字节复制到dest,因此current->pid
后面的4个字节被复制到dest
,因此dest
不能等于current->pid
。
因此,您最好编写一个名为copy\u pid\u to\u user
的函数,其代码如下:
将\u pid\u复制到\u用户(长int*dest,void*src){
复制到用户(dest、src、sizeof(curent->pid))
......
在Linux内核中,pid的类型等于int,因此编译器警告您,int*
不能强制转换为long int*
。
我不知道你是如何实现你的copy\u long\u to\u user
功能的,如果你这样写,你可能会得到错误的结果。
将_long_复制到_用户(long int*dest,long int*src){
复制到用户(dest、src、sizeof(long int));
......
}
因为sizeof(long)
=sizeof(int)
,如果sizeof(long)
sizeof(int)
,支持sizeof(long)==8
,并且sizeof(int)总是4
,您将得到错误的结果,因为当前任务-/pid
只占用dest
的4字节,但将U复制到用户(dest,src,sizeof(long int))
必须将8个字节复制到dest,因此current->pid
后面的4个字节被复制到dest
,因此dest
不能等于current->pid
。
因此,您最好编写一个名为copy\u pid\u to\u user
的函数,其代码如下:
将\u pid\u复制到\u用户(长int*dest,void*src){
复制到用户(dest、src、sizeof(curent->pid))
......
我希望您不要只是参与@ChunleiMa的部分回答,并将的第二个参数的类型复制到\u long\u用户()<代码>空> *>代码>不,答案让我意识到我做错了什么——我告诉《代码> CopyToToSuffux/Cuth>在源位置只有4字节的数据时复制8字节。我想也许像我提到的快捷方式可能是导致你的另一个相关问题:我希望你不只是接受PAR。@ChunleiMa答案的t,并将copy\u long\u的第二个参数的类型复制到\u user()
avoid*
。不,这个答案让我意识到我做错了什么——我告诉copy\u to\u user
复制8个字节,而源位置只有4个字节的数据。我想,也许我提到的一个快捷方式可能是导致其他相关问题的原因: