我正在尝试创建一个内核模块,它在/proc目录中创建一个子目录,并包含一个可以从用户空间写入和读取的文件。
但是,在编译模块时,总是会出现相同的错误:
error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
.read = read_proc,
error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
.write = write_proc,
error: dereferencing pointer to incomplete type ‘struct proc_dir_entry’
Our_Proc_File->read_proc = read_proc;代码:
#define __KERNEL__
#define MODULE
#include<linux/seq_file.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("1");
#define MAXBUFFSIZE 256
static char mm_buff[MAXBUFFSIZE];
static struct proc_dir_entry* Our_Proc_File;
static struct proc_dir_entry* Our_Proc_Dir;
static ssize_t read_proc( char* buffer, char** buffer_location, off_t offset,
int buffer_length, int* eof, void* data)
{
int len =0;
static int count = 1;
if(offset > 0){
*eof = 1;
return len;
}
len = sprintf(buffer,"[%d] %s\n",count++,mm_buff);
return len;
}
static ssize_t write_proc( struct file* file,const char* buffer, unsigned long count,
void *data){
if(count < (MAXBUFFSIZE-1)){
strncpy(mm_buff,buffer,count);
mm_buff[count] = '\0';
printk("Buffer: %s\n",mm_buff);
}
return count;
}
static struct file_operations myops =
{
.owner = THIS_MODULE,
.read = read_proc,
.write = write_proc,
};
static int __init simple_init(void)
{
printk("MyModule Loaded Successfully\n");
Our_Proc_Dir = proc_mkdir("Colours",NULL);
if(IS_ERR(Our_Proc_Dir)){
printk("Failed to create directory\n");
return -1;
}
Our_Proc_File = proc_create("Orange",0644,Our_Proc_Dir,&myops);
if(IS_ERR(Our_Proc_File)){
proc_remove(Our_Proc_Dir);
return -1;
}
Our_Proc_File->read_proc = read_proc;
Our_Proc_File->write_proc =write_proc;
return 0;
}
static void __exit fun(void){
if(Our_Proc_File)
proc_remove(Our_Proc_File);
if(Our_Proc_Dir)
proc_remove(Our_Proc_Dir);
printk("MyModule Exit!\n");
}
module_init(simple_init);
module_exit(fun);发布于 2020-04-13 13:08:51
错误:从不兼容指针类型初始化-Werror=不兼容-指针-类型.read = read_proc,错误:从不兼容指针类型初始化-Werror=不兼容指针-类型.write = write_proc,
读取函数的预期签名是
ssize_t R (struct file *, char __user *, size_t, loff_t *);预期写入函数的签名是
ssize_t W (struct file *, const char __user *, size_t, loff_t *);(https://linux-kernel-labs.github.io/refs/heads/master/labs/device_drivers.html)
函数的名称及其参数并不重要,但返回类型以及参数的数量、顺序和类型都是重要的。
您的read_proc()似乎根本不匹配。我想,它可能更接近于某些其他版本的内核,而不是我链接描述的文档。您的write_proc()函数更接近,但是unsigned long可能不是size_t的相同类型,void *可能不是与loff_t *相同的类型。这些差异中的任何一个都足以导致指针类型不匹配,并且它们可能导致真正的行为问题。
错误:取消引用指向不完全类型‘struct proc_dir_entry’Our_Proc_File->read_proc =read_proc的指针;
不需要使用struct proc_dir_entry的定义来声明指向该类型的指针,但是必须有一个定义才能通过这样的指针或其他方式访问实例的成员。当你试图做的时候
Our_Proc_File->read_proc = read_proc;,没有这样的定义的范围。可能您忘记了包括适当的标题。或者,您可能拼错了结构标签。
https://stackoverflow.com/questions/61188251
复制相似问题