c - 为什么在 get_user 中取消引用用户空间是正确的?
问题描述
比如在SYSCALL_DEFINE2
linux内核的函数中(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
之前不需要使用?
解决方案
&args->set.nbytes
是一个地址。即使您实际上无法读取它,也允许计算某个成员的地址——编译器只是将set.nbytes
成员的偏移量添加union pl_args
到传入的地址中args
。然后它将该地址传递给get_user
,它从用户空间进行实际复制。
推荐阅读
- maven-3 - mvn 依赖项:由于范围版本冲突,多模块项目上的树失败
- git - Git在合并后显示错误的作者
- python - 句子中的独立子句没有任何协调
- android - Android:两个单行 TextView 并排 - 挤压和/或裁剪任何一个
- html - 同一个 Boostrap 3 页面上的两个不同风格的 FontAwesome Twitter 图标
- javascript - 如何根据样式值选择元素?
- javascript - 电子商务; 如何创建用于计算的权重因子(基于产品类别)?
- elixir - 直接从凤凰路由器重定向
- javascript - 如何从 Kuzzle 插件响应发送 pdf 文件?
- php - OneSignal 推送通知的特定 URL