Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在get_user中取消引用用户空间是正确的?_C_Linux - Fatal编程技术网

C 为什么在get_user中取消引用用户空间是正确的?

C 为什么在get_user中取消引用用户空间是正确的?,c,linux,C,Linux,例如,在linux内核的SYSCALL_DEFINE2函数中: 为什么在args上使用箭头和点之前不需要使用copy_from_user呢?get_user函数将从用户空间进行实际复制,因此它将处理危险部分。仔细看看这个: &args->set.nbytes 这实际上并没有取消引用任何指针,只是计算新的指针值。指针实际上只是无符号整数值。所以上面的一行写着:给我部分数据的地址,它是从结构开始的偏移量。结构的开头是args,偏移量是set.nbytes。执行此操作不需要实际访问用户空间内存。get

例如,在linux内核的SYSCALL_DEFINE2函数中:

为什么在args上使用箭头和点之前不需要使用copy_from_user呢?

get_user函数将从用户空间进行实际复制,因此它将处理危险部分。仔细看看这个:

&args->set.nbytes

这实际上并没有取消引用任何指针,只是计算新的指针值。指针实际上只是无符号整数值。所以上面的一行写着:给我部分数据的地址,它是从结构开始的偏移量。结构的开头是args,偏移量是set.nbytes。执行此操作不需要实际访问用户空间内存。

get\u user函数将从用户空间执行实际复制,因此它将处理危险部分。仔细看看这个:

&args->set.nbytes


这实际上并没有取消引用任何指针,只是计算新的指针值。指针实际上只是无符号整数值。所以上面的一行写着:给我部分数据的地址,它是从结构开始的偏移量。结构的开头是args,偏移量是set.nbytes。执行此操作不需要实际访问用户空间内存。

&args->set.nbytes是一个地址。它允许计算某些成员的地址,即使您实际上无法读取它-编译器只是将union pl_args的set.nbytes成员的偏移量添加到传入args的地址中。然后它将该地址传递给get_user,该用户从用户空间进行实际复制。

&args->set.nbytes是一个地址。它允许计算某些成员的地址,即使您实际上无法读取它-编译器只是将union pl_args的set.nbytes成员的偏移量添加到传入args的地址中。然后,它将该地址传递给get_user,该用户从用户空间进行实际复制。

您…将输出函数的实际名称!我不明白,函数实际上被称为SYSCALL_DEFINE2不,它不是,SYSCALL_DEFINE2是一个定义函数的宏,函数的名称是宏的第一个参数:在本例中,它是osf_proplist_SYSCALL。您……请写出函数的实际名称!我不明白,函数实际上被称为SYSCALL_DEFINE2不,它不是,SYSCALL_DEFINE2是一个定义函数的宏,函数的名称是宏的第一个参数:在本例中,它是osf_proplist_SYSCALL。
SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
        union pl_args __user *, args)
{
  long error;
  ...
  get_user(error, &args->set.nbytes)
  ...
}