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