BUG:无法处理错误的示例内核模块的内核分页请求

时间:2019-02-14 09:24:38

标签: linux-kernel driver ioctl

我正在编写一个示例内核模块,该模块从应用程序读取通过ioctl调用发送的数据并进行打印。

我正在从应用程序中通过ioctl传递结构“ ioctl_struct”,并且在内核模块中,我将打印其成员变量。

这在几台机器上绝对可以正常工作。在几台机器中

  
    

“错误:无法处理内核分页请求”

  

访问“名称和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中, 5号 cmd 33, 你好, 44 33, 应该打印

0 个答案:

没有答案