首页 > 解决方案 > 为什么在 get_user 中取消引用用户空间是正确的?

问题描述

比如在SYSCALL_DEFINE2linux内核的函数中(https://elixir.bootlin.com/linux/v4.15.3/source/arch/alpha/kernel/osf_sys.c#L657):

SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
        union pl_args __user *, args)
{
  long error;
  ...
  get_user(error, &args->set.nbytes)
  ...
}

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

标签: clinux

解决方案


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


推荐阅读