获取:"unable to handle kernel paging request" 尝试阅读时

getting: "unable to handle kernel paging request" when trying to read

我试图将数据从内核 space 传递给用户 space,但我在控制台中看到的只是 'killed',当我尝试查看 dmesg 我明白了: unable to handle kernel paging request

我的内核模块初始化函数:

static int __init module_init_function(void) {

    struct file_operations fops = {
        .owner = THIS_MODULE
    };

    struct class *m_c;
    struct device *dev;
    DEVICE_ATTR(fw_dev, 0777, show_func, store_func);

    /* Create the user interface device */

    major = register_chrdev(0, "fw_status", &fops);
    m_c = class_create(THIS_MODULE, "fw_class");
    dev = device_create(m_c, NULL, MKDEV(major, 0), NULL, "fw_dev");
    device_create_file(dev, &dev_attr_fw_dev);

    return 0;

}

这是我的展示功能:

static ssize_t show_func(struct device *dev, struct device_attribute *attr, char *buf) {

    return snprintf(buf,PAGE_SIZE, "%d,%d", accepted_packets, dropped_packets);

}

我做错了什么?

DEVICE_ATTR 宏创建一个 device_attribute in the scope it's called. 因为它在你的 init 函数中,所以 device_attribute 在模块初始化后丢失。 (在旁注中,即使它在 init 函数中是静态的,它仍然会被删除。由于您的 init 函数具有 __init,该函数将在模块初始化后从内存中清除)

尝试全局调用 DEVICE_ATTR

file_operations也一样,也应该是全局的。内核将它们存储为指针,不会复制整个结构,以便您稍后修改。

您可以浏览kernel source以查看其他模块是如何实现的。快速搜索显示 DEVICE_ATTR 始终在全局使用。

另外,你可能不需要snprintf(9)"%d,%d"反正不会超过buf的大小。