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里是没有的。