(void __user *)arg这是什么意思?

zhangzhao123 2012-02-16 10:06:10


static int nvme_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
unsigned long arg)
{
struct nvme_ns *ns = bdev->bd_disk->private_data;

switch (cmd) {
case NVME_IOCTL_ID:
return ns->ns_id;
case NVME_IOCTL_ADMIN_CMD:
return nvme_user_admin_cmd(ns, (void __user *)arg);
case NVME_IOCTL_SUBMIT_IO:
return nvme_submit_io(ns, (void __user *)arg);
default:
return -ENOTTY;
}
}

疑问:在上面的这个Linux块驱动ioctl代码中,(void __user *)arg是什么结构啊?_user是什么意思?没看明白,谢了!
...全文
899 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanglinux 2012-03-31
  • 打赏
  • 举报
回复
正解,__attribute__是GNU C里的扩展语法,标准C里是没有的。

[Quote=引用 9 楼 的回复:]

linux/compiler.h 里有这么一个定义
# define __user __attribute__((noderef, address_space(1)))
[/Quote]
jemofh159 2012-03-20
  • 打赏
  • 举报
回复
linux/compiler.h 里有这么一个定义
# define __user __attribute__((noderef, address_space(1)))
csdd1105 2012-03-19
  • 打赏
  • 举报
回复
搭车进来,学习了。谢谢。
falloutmx 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhangzhao123 的回复:]

没有看到想要的答案,我知道是用户空间的地址,但是具体为什么能这样用?有这种强制性转换?
[/Quote]
用户空间和内核空间的物理地址是不同的。
dq 2012-03-18
  • 打赏
  • 举报
回复
默认是内核空间,因为这是驱动,是在内核空间运行的。
zhangzhao123 2012-03-17
  • 打赏
  • 举报
回复
没有看到想要的答案,我知道是用户空间的地址,但是具体为什么能这样用?有这种强制性转换?
jjlmonkey 2012-02-24
  • 打赏
  • 举报
回复
(void __user *)arg 指的是arg值是一个用户空间的地址,不能直接进行拷贝等,要使用例如copy_from_user,copy_to_user等函数。
xuyinglin 2012-02-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lq651659889 的回复:]

指定你的变量地址在用户空间而不是内核空间。
[/Quote]那默认是用户空间还是内核空间呢 还有这两者有什么区别啊
lq651659889 2012-02-20
  • 打赏
  • 举报
回复
指定你的变量地址在用户空间而不是内核空间。
project2502 2012-02-18
  • 打赏
  • 举报
回复
你去看看nvme_user_admin_cmd 这个函数和nvme_submit_io这个函数的定义里第二个参数是什么

__user应该是个类似 IN、 OUT 这样的空的宏

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧