首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从不兼容指针类型修复初始化问题

如何从不兼容指针类型修复初始化问题
EN

Stack Overflow用户
提问于 2020-04-13 12:48:27
回答 1查看 1.5K关注 0票数 0

我正在尝试创建一个内核模块,它在/proc目录中创建一个子目录,并包含一个可以从用户空间写入和读取的文件。

但是,在编译模块时,总是会出现相同的错误:

代码语言:javascript
复制
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;

代码:

代码语言:javascript
复制
#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);
EN

回答 1

Stack Overflow用户

发布于 2020-04-13 13:08:51

错误:从不兼容指针类型初始化-Werror=不兼容-指针-类型.read = read_proc,错误:从不兼容指针类型初始化-Werror=不兼容指针-类型.write = write_proc,

读取函数的预期签名是

代码语言:javascript
复制
ssize_t R (struct file *, char __user *, size_t, loff_t *);

预期写入函数的签名是

代码语言:javascript
复制
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的定义来声明指向该类型的指针,但是必须有一个定义才能通过这样的指针或其他方式访问实例的成员。当你试图做的时候

代码语言:javascript
复制
    Our_Proc_File->read_proc = read_proc;

,没有这样的定义的范围。可能您忘记了包括适当的标题。或者,您可能拼错了结构标签。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61188251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档