读书人

(void _user *)arg这是什么意思?解决

发布时间: 2012-04-22 18:34:46 作者: rapoo

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


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是什么意思?没看明白,谢了!

[解决办法]
指定你的变量地址在用户空间而不是内核空间。
[解决办法]
(void __user *)arg 指的是arg值是一个用户空间的地址,不能直接进行拷贝等,要使用例如copy_from_user,copy_to_user等函数。
[解决办法]
linux/compiler.h 里有这么一个定义
# define __user__attribute__((noderef, address_space(1)))
[解决办法]
正解,__attribute__是GNU C里的扩展语法,标准C里是没有的。

探讨

linux/compiler.h 里有这么一个定义
# define __user__attribute__((noderef, address_space(1)))

读书人网 >驱动开发

热点推荐