【发布时间】:2012-08-21 06:35:22
【问题描述】:
我正在尝试将结构从用户空间传递到内核空间。我已经尝试了好几个小时,但它不起作用。这是我到目前为止所做的..
int device_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg){
int ret, SIZE;
switch(cmd){
case PASS_STRUCT_ARRAY_SIZE:
SIZE = (int *)arg;
if(ret < 0){
printk("Error in PASS_STRUCT_ARRAY_SIZE\n");
return -1;
}
printk("Struct Array Size : %d\n",SIZE);
break;
case PASS_STRUCT:
struct mesg{
int pIDs[SIZE];
int niceVal;
};
struct mesg data;
ret = copy_from_user(&data, arg, sizeof(*data));
if(ret < 0){
printk("PASS_STRUCT\n");
return -1;
}
printk("Message PASS_STRUCT : %d\n",data.niceVal);
break;
default :
return -ENOTTY;
}
return 0;
}
我在定义结构时遇到了麻烦。定义它的正确方法是什么?我想要 int pIDs[SIZE]。 int *pIDs 会这样做吗(在用户空间中它被定义为 pIDs[SIZE])?
编辑:
通过上述更改,我得到了这个错误?错误:“结构”之前的预期表达式有什么想法吗?
【问题讨论】:
-
关于 PASS_STRUCT 情况,您应该将“数据”定义为 struct ,而不是指向 struct 的指针,然后将大小正确传递给 copy_from_user。你的问题更有可能是 C。恕我直言,在挖掘内核之前你应该对 C 有更多的经验。
-
你觉得我应该如何定义这个函数,#define PASS_STRUCT _IOW(MY_MAGIC, 2, struct mesg*)?
-
我将数据定义为结构,(struct mesg data;)。但是给出了错误错误:'data'的存储大小未知..有什么想法吗?
-
这个错误很可能是switch语句中的问题,而不是宏中的问题。是哪一行?如果您认为宏有问题,请尝试使用 gcc -E 选项进行编译,看看预处理后会发生什么。
-
@sardok 是的,问题不在于宏..我在更改 mesg 结构后检查了它,它编译了..
标签: linux linux-kernel linux-device-driver ioctl