BUG: невозможно обработать запрос подкачки ядра при ошибке для примера модуля ядра - PullRequest
0 голосов
/ 14 февраля 2019

Я пишу пример модуля ядра, который читает данные, отправленные через вызов ioctl из приложения, и печатает их.

Я передаю структуру "ioctl_struct" через ioctl из приложения, и в модуле ядра я будупечать его переменных-членов.

это отлично работает на нескольких машинах.В некоторых машинах

"BUG: невозможно обработать запрос на подкачку ядра в"

, возникает ошибка при обращении к "name" и id1 testStruct id1и id2 ".

Я не думаю, что этот модуль зависит от оборудования / ядра.Я не уверен, где это идет не так.любая помощь будет оценена.спасибо.

Модуль ядра Driver.c

static const char DEVICE_NAME[]="testipc";
static struct proc_dir_entry * proc_ipc = NULL;

struct test
{
        int id1;
        int id2;
};

struct ioctl_struct
{
    __user struct test *testStruct;
    __user int * id;
    __user char * name;
        int cmd;
};


static int __init etx_driver_init(void);
static void __exit etx_driver_exit(void);
static long etx_ioctl(struct file *file, unsigned int cmd, unsigned long arg);

static struct file_operations fops =
{
        .owner          = THIS_MODULE,
        .read           = etx_read,
        .write          = etx_write,
        .open           = etx_open,
        .unlocked_ioctl = etx_ioctl,
        .release        = etx_release,
        .unlocked_ioctl = etx_ioctl,
};


static long etx_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    printk("reached ioctl....\n");
    struct ioctl_struct   buf;

         if (copy_from_user(&buf, (void *)arg, sizeof(buf)))
        return -EFAULT;

    printk("succes..2\n");
    printk("id %d\n",buf.id);
    printk("cmd %d\n",buf.cmd);
    printk("filename %s\n",buf.name);
    printk("token %d\n",buf.testStruct->id1);
    printk("token %d\n",buf.testStruct->id2);
        return 0;
}


static int __init etx_driver_init(void)
{
    printk("new test driver loaded..");
        proc_ipc = proc_create(DEVICE_NAME, 0, NULL, &fops);
        if (!proc_ipc)
        {
                printk(KERN_ALERT "Unable to create /proc/%s\n", DEVICE_NAME);
                return 1;
        }

        return 0;

}

void __exit etx_driver_exit(void)
{
          if (proc_ipc)
                proc_remove(proc_ipc);

        proc_ipc = NULL;

}

module_init(etx_driver_init);
module_exit(etx_driver_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("lin");
MODULE_DESCRIPTION("A simple driver");
MODULE_VERSION("1.0");

и следующий файл моего приложения

#include <stdio.h>
#include<sys/ioctl.h>
# define __user 

static int fd=NULL;

#define TEST_IOCTL _IOWR('z', 80, struct ioctl_struct)

struct test
{
    int id1;
    int id2;
};

struct ioctl_struct
{
    __user struct test *testStruct;
    __user int * id;
    __user char * name;
    int cmd;
};

void init()
{
        printf("\nOpening Driver\n");
        fd = open("/proc/testipc", O_RDWR);
        if(fd < 0) {
                printf("Cannot open device file...\n");
                return 0;
        }
}

void send()
{
    int id=5;
    int *pid=id;    
    char name[10]={'H','e','l','l','o'};
    struct test testStruct;
    testStruct.id1=44;
    testStruct.id2=33;

    struct ioctl_struct request;
    request.name = name ;
    request.id = pid;
    request.cmd = 33;
    request.testStruct = &testStruct;
    ioctl(fd, TEST_IOCTL, &request);
}

void finish()
{
        printf("Closing Driver\n");
        close(fd);
}

int main()
{
    init();
    send();
    finish();
    return 0;
}

В dmesg, id 5, cmd 33, Hello, 44,33, должно быть напечатано

...