2012-08-26 139 views
2

我想将用户空间的结构传递给内核空间。我一直在尝试很多小时,但它不工作。这是我迄今为止所做的...通过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'之前的期望表达式有什么想法?

+0

有关PASS_STRUCT的情况下,你应该定义“数据”结构,而不是一个指向结构,然后正确地将大小传递给copy_from_user。你的问题更可能是C. imho,在挖掘内核之前你应该对C有更多的经验。 – sardok

+0

您认为我应该如何定义这个函数,#define PASS_STRUCT _IOW(MY_MAGIC,2,struct mesg *)? – user340

+0

我将数据定义为struct,(struct mesg data;)。但给出了错误的错误:'数据'的存储大小不知道..任何想法? – user340

回答

1

在你的问题中有两种结构变体。

struct mesg1{ 
    int *pIDs; 
    int niceVal; 
}; 

struct mesg2{ 
    int pIDs[SIZE]; 
    int niceVal; 
}; 

它们是不同的;在mesg1的情况下,你有指向int数组的指针(它在结构之外)。在其他情况下(mesg2)结构中有int数组。

如果您的SIZE是固定的(在您的模块的API中;在用户空间和内核空间中使用相同的值),您可以使用第二个变体(mesg2)。

要使用结构(mesg1)的第一变体可能会添加字段size到本身的结构,如:

struct mesg1{ 
    int pIDs_size; 
    int *pIDs; 
    int niceVal; 
}; 

,并与整数计数,通过*pIDs指出填充它。

PS:而且请,从来没有在结构体(也称为VLAIS)的中间使用具有可变大小数组的结构。这是GCC编译器专有的,奇怪的,buggy和C语言的扩展。根据国际C标准,只有结构的最后一个字段可以是array with variable size(VLA)。这里的一些例子:12

PPS:

您可以声明您结构与VLA(如果只有具有可变大小单个阵列):

struct mesg2{ 
    int niceVal; 
    int pIDs[]; 
}; 

但分配内存时你要小心对于这样的结构与VLA

+0

嗯,我想使用mesg2类型。在传递结构之前,我计划传递SIZE。它会起作用吗? – user340

+0

不,你应该在设计阶段修正SIZE,然后永远不要通过它。或者你应该以这样的方式重写你的结构,使得数组将成为结构的最后一个字段。 – osgx

+0

专有? :根据[Merriam-Webster](http://www.merriam-webster.com/dictionary/proprietary)定义的:“) – Igor

相关问题