我想将用户空间的结构传递给内核空间。我一直在尝试很多小时,但它不工作。这是我迄今为止所做的...通过IOCTL将结构传递给设备驱动程序
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 pid [SIZE]。将int * pIDs做到这一点(在用户空间它定义为pIDs [SIZE])?
编辑:
随着上述变化,我得到这个错误?错误:'struct'之前的期望表达式有什么想法?
有关PASS_STRUCT的情况下,你应该定义“数据”结构,而不是一个指向结构,然后正确地将大小传递给copy_from_user。你的问题更可能是C. imho,在挖掘内核之前你应该对C有更多的经验。 – sardok
您认为我应该如何定义这个函数,#define PASS_STRUCT _IOW(MY_MAGIC,2,struct mesg *)? – user340
我将数据定义为struct,(struct mesg data;)。但给出了错误的错误:'数据'的存储大小不知道..任何想法? – user340