无法从用户空间应用程序访问struct数组

时间:2014-02-12 06:20:39

标签: c kernel ioctl

在一个公共标题中,我将结构定义为:

#define query_arg_t queryForItems

typedef struct {
   char item[50];
   char status[10];     
} queryForItems;

在内核驱动程序中,我们定义:

//初始化

queryForItems queryForItemsArray[] = {
{
.item = "A",
.status = "TRUE"
}, 
{
.item = "B",
.status = "TRUE"
},  
};

在驱动程序中使用ioctl

static long my_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
{
query_arg_t *q;

switch (cmd)
{
    case QUERY_GET_VARIABLES:
        memcpy(&q, (&queryListForItems), sizeof(queryForItemsArray));

        if (copy_to_user((query_arg_t *)arg, &q, sizeof(query_arg_t))) {
            return -EACCES;
        }
        break;

在用户应用程序中,我们将get函数定义为:

void get_vars(int fd)
{
query_arg_t *q;
//q.info = kmalloc(sizeof(???), GFP_KERNEL); // may require malloc

if (ioctl(fd, QUERY_GET_VARIABLES, &q) == -1)
{
    perror("query_apps ioctl get");
} else {    
printf("=====================\n");

printf("option: %s \n", q[1].Item);
    printf("=====================\n");
}
}

但是,我无法从用户空间应用程序访问struct数组。

1 个答案:

答案 0 :(得分:0)

[Sakthi Kumar解决] 在一个公共标题中:

添加

#define MAX_OBJ 50

 typedef struct {
int num_items;
queryForItems items[MAX_OBJ];
 } query_arg_t;

在驱动程序中

    case QUERY_GET_VARIABLES:
        q = kmalloc(sizeof(query_arg_t), GFP_KERNEL);

    q->num_items = 3;
   memcpy(q->items, queryForItems, sizeof(queryForItems) * q->num_items);

        if (copy_to_user((query_arg_t *)arg, q, sizeof(query_arg_t))) {
            return -EACCES;
        }
        break;

在用户应用中:

query_arg_t *q;
q = malloc(sizeof(query_arg_t)); 

if (ioctl(fd, QUERY_GET_VARIABLES, q) == -1)
{
    perror("query_apps ioctl get");
} else {    
printf("=====================\n");

printf("option: %s \n", q->items[i].status);