获取:"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的大小。
我试图将数据从内核 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的大小。