как исправить проблему с инициализацией из несовместимого типа указателя - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь создать модуль ядра, который создает подкаталог в каталоге / pro c и содержит файл, который можно записывать и читать из пространства пользователя.

Но всегда, когда я при компиляции модуля я получаю те же ошибки:

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);

1 Ответ

1 голос
/ 13 апреля 2020
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,

Ожидаемая подпись функции чтения:

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() не соответствует вообще. Я предполагаю, что это возможно, что это ближе к праву для какой-то другой версии ядра, чем описанная мной do c. Ваша write_proc() функция ближе, но unsigned long, вероятно, не того же типа, что и size_t, а void *, вероятно, не того же типа, что и loff_t *. Любого из этих расхождений достаточно для несоответствия типов указателей, и они могут вызвать подлинные поведенческие проблемы.

error: dereferencing pointer to incomplete type ‘struct proc_dir_entry’
     Our_Proc_File->read_proc = read_proc;

Нет необходимости иметь определение struct proc_dir_entry для объявления указатель на этот тип, но необходимо , чтобы иметь определение для доступа к членам экземпляра, через такой указатель или иным образом. В тот момент, когда вы пытаетесь сделать

    Our_Proc_File->read_proc = read_proc;

, такое определение не входит в сферу применения. Возможно, вы забыли включить соответствующий заголовок. Кроме того, возможно, вы ошиблись тегом структуры.

...