导入文件中的冲突类型

时间:2014-01-07 13:12:25

标签: c linux-kernel debian driver

我正在编写一个内核模块,它应该充当一个充当循环FIFO设备的字符设备,但是当我尝试编译它时,我有一些我不知道如何解决的错误,这是我的来源。我很抱歉,如果我的英语不好,如果我不写更多信息,我是Linux模块中的C新手,我使用debian 6,我认为这是包含的问题,“cbuffer_t是循环FIFO(已经提供给我,不应该有问题。

我收到的汇编信息:

make
make -C /lib/modules/2.6.39.4.mikernel/build M=/home/dsouser/Escritorio/Prac3/ParteB modules
make[1]: se ingresa al directorio `/usr/src/linux-headers-2.6.39.4.mikernel'
  CC [M]  /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.o
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:3:19: error: fcntl.h: No existe el fichero o el directorio
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:27:1: warning: "KERNEL_DS" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:18:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:28:1: warning: "USER_DS" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:22:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:80:1: warning: "access_ok" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:40:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:95: error: redefinition of ‘struct exception_table_entry’
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:155:1: warning: "get_user" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:219:1: warning: this is the location of the previous definition
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:221: error: conflicting types for ‘__put_user_bad’
include/asm-generic/uaccess.h:177: note: previous declaration of ‘__put_user_bad’ was here
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:250:1: warning: "put_user" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:163:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:491:1: warning: "__get_user" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:179:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:514:1: warning: "__put_user" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:143:1: warning: this is the location of the previous definition
In file included from /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:571,
                 from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:45: error: conflicting types for ‘__copy_to_user’
include/asm-generic/uaccess.h:108: note: previous definition of ‘__copy_to_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:83: error: redefinition of ‘__copy_to_user’
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:45: note: previous definition of ‘__copy_to_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:90: error: conflicting types for ‘__copy_from_user’
include/asm-generic/uaccess.h:78: note: previous definition of ‘__copy_from_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:138: error: redefinition of ‘__copy_from_user’
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:90: note: previous definition of ‘__copy_from_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:188: error: conflicting types for ‘copy_to_user’
include/asm-generic/uaccess.h:253: note: previous definition of ‘copy_to_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:203: error: conflicting types for ‘copy_from_user’
include/asm-generic/uaccess.h:243: note: previous definition of ‘copy_from_user’ was here
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘init_module’:
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:67: warning: assignment from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘cleanup_module’:
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:95: warning: passing argument 1 of ‘destroy_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:19: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘device_read’:
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:156: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:163: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:164: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:164: warning: value computed is not used
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:177: warning: passing argument 1 of ‘remove_items_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:43: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘device_write’:
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:205: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:207: warning: passing argument 1 of ‘insert_items_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:37: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:211: warning: passing argument 1 of ‘nr_gaps_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:25: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:212: warning: passing argument 1 of ‘insert_items_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:37: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
make[2]: *** [/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.o] Error 1
make[1]: *** [_module_/home/dsouser/Escritorio/Prac3/ParteB] Error 2
make[1]: se sale del directorio `/usr/src/linux-headers-2.6.39.4.mikernel'
make: *** [all] Error 2

这是源头。很抱歉长篇文章,但我不知道如何解决它。我已经阅读了内核模块编程指南,我还没有理解它的一半,并没有帮助我修复这个源。

#define MAX_BUFFER_SIZE 1024

#include <fcntl.h>
#include "cbuffer.h"
#include <linux/string.h>
#include <asm-generic/uaccess.h>
#include <linux/spinlock.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>    /* for put_user */
#include <linux/semaphore.h>

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Driver Module for DSO");
MODULE_AUTHOR("Kaostias");

/*  
 *  Prototypes - this would normally go in a .h file
 */
int init_module(void);
void cleanup_module(void);
static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);

#define SUCCESS 0
#define DEVICE_NAME "characterDevice"   /* Dev name as it appears in /proc/devices   */
#define BUF_LEN 80          /* Max length of the message from the device */

/* 
 * Global variables are declared as static, so are global within the file. 
 */

static int Major;       /* Major number assigned to our device driver */
static int Device_Open = 0; /* Is device open?  
                 * Used to prevent multiple access to device */
static char msg[BUF_LEN];   /* The msg the device will give when asked */
static char *msg_Ptr;
struct cbuffer_t * buf;

/*semaphore_t fifoR = */DEFINE_SEMAPHORE(fifoR);
/*semaphore_t fifoW = */DEFINE_SEMAPHORE(fifoW);

static struct file_operations fops = {
    .read = device_read,
    .write = device_write,
    .open = device_open,
    .release = device_release
};

/*
 * This function is called when the module is loaded
 */
int init_module(void)
{
        Major = register_chrdev(0, DEVICE_NAME, &fops);

    if (Major < 0) {
      printk(KERN_ALERT "Registering char device failed with %d\n", Major);
      return Major;
    }
    /*
     * Creation of buffer;
     */
    if( (buf = create_cbuffer_t(MAX_BUFFER_SIZE)) != NULL){
        printk(KERN_ALERT "Error when creating the FIFO device.");
    }
    printk(KERN_INFO "Buffer created without error.\n");
    printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major);
    printk(KERN_INFO "the driver, create a dev file with\n");
    printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major);
    printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n");
    printk(KERN_INFO "the device file.\n");
    printk(KERN_INFO "Remove the device file and module when done.\n");

    return SUCCESS;
}

/*
 * This function is called when the module is unloaded
 */
void cleanup_module(void)
{
    /* 
     * Unregister the device 
     */
    /*int ret = */unregister_chrdev(Major, DEVICE_NAME);
/*  if (ret < 0)
        printk(KERN_ALERT "Error in unregister_chrdev\n");//, ret);*/
    /*
     * Destroys the FIFO buffer
     */
    destroy_cbuffer_t (buf);

}

/*
 * Methods
 */

/* 
 * Called when a process tries to open the device file, like
 * "cat /dev/mycharfile"
 */
static int device_open(struct inode *inode, struct file *file)
{

    static int counter = 0;
    if (Device_Open)
        return -EBUSY;
    Device_Open++;
    sprintf(msg, "The device %s has been open %d times.\n",DEVICE_NAME ,counter++);
    msg_Ptr = msg;
    try_module_get(THIS_MODULE);

    return SUCCESS;
}

/* 
 * Called when a process closes the device file.
 */
static int device_release(struct inode *inode, struct file *file)
{

    Device_Open--;      /* We're now ready for our next caller */
    /* 
     * Decrement the usage count, or else once you opened the file, you'll
     * never get get rid of the module. 
     */
    module_put(THIS_MODULE);

    return SUCCESS;
}

/* 
 * Called when a process, which already opened the dev file, attempts to
 * read from it.
 */
static ssize_t device_read(struct file *filp,   /* see include/linux/fs.h   */
               char *buffer,    /* buffer to fill with data */
               size_t length,   /* length of the buffer     */
               loff_t * offset)
{
    int i =0;
    /*
     * Number of bytes actually written to the buffer 
     */
    int bytes_read = 0;

    /*
     * If we're at the end of the message, 
     * return 0 signifying end of file 
     */
    if (size_cbuffer_t(buf)<=0)
        return 0; //It should not be able to be less than 0 but just in case    

    /* 
     * If the size is higher than the current content, the size of lecture gets 
     * changed
     */
    if(size_cbuffer_t(buf) < length)
        length == size_cbuffer_t(buf);  


    /* 
     * The buffer is in the user data segment, not the kernel 
     * segment so "*" assignment won't work.  We have to use 
     * put_user which copies data from the kernel data segment to
     * the user data segment. 
     */



     //Se quita la cadena del buffer
    remove_items_cbuffer_t (buf, msg_Ptr, length);
    while ((i = length)> 0){
        put_user(*(msg_Ptr++), buffer++);
        length--;
        bytes_read++;
    }

    /* 
     * Most read functions return the number of bytes put into the buffer
     */
    return bytes_read;
}

/*  
 * Called when a process writes to dev file: echo "hi" > /dev/hello 
 */
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
    //char[BUF_LEN]  aux;
    int ret = len;
    if (sizeof(buff) == 0 || buff == NULL) 
        return -EINVAL;

    while (len) {
        get_user(*(msg_Ptr++), buff++);
        len--;
    }
    if(size_cbuffer_t(buf) >= ret){ 

        insert_items_cbuffer_t (buf, msg_Ptr, ret);

    }else{
        //strcpy(aux, msg_Ptr, size_cbuffer_t(buf));
        ret = nr_gaps_cbuffer_t(buf);
        insert_items_cbuffer_t(buf, msg_Ptr, ret);
    }
return ret;
}

我的makefile是

obj-m = driverPersonal.o 
all :
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean :
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

2 个答案:

答案 0 :(得分:0)

找不到头文件 fcntl.h ... 将其添加到包含路径。编译器标志是-Idir_name。

您确定可以使用内核代码中的libc头文件吗?

答案 1 :(得分:0)

我发布这个是因为那些人​​有同样的问题

我遇到了一些问题,尽管有很多错误的代码,主要的失败是fcntl.h,这是一个简单的问题,因为它来自以前的版本并且它未被使用所以我只是删除了

#include <fcntl.h>

冲突类型错误是一对包含冲突。

//Those includes cannot be together
#include <asm-generic/uaccess.h>
#include <asm/uaccess.h>

我有很多代码需要修复,但是目前我已经删除了syncrone机制,我将在以后的版本中添加&#39;我目前的代码是:

#define MAX_BUFFER_SIZE 1024

//#include <fcntl.h>
#include "cbuffer.h"
#include <linux/string.h>
#include <asm-generic/uaccess.h>
#include <asm-generic/errno.h>
//#include <linux/spinlock.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
//#include <asm/uaccess.h>  /* for put_user */
#include <linux/semaphore.h>

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Driver Module for DSO");
MODULE_AUTHOR("Kaostias");

/*  
 *  Prototypes - this would normally go in a .h file
 */
int init_module(void);
void cleanup_module(void);
static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);

#define SUCCESS 0
#define DEVICE_NAME "fifodev"   /* Dev name as it appears in /proc/devices   */
#define BUF_LEN 80          /* Max length of the message from the device */

/* 
 * Global variables are declared as static, so are global within the file. 
 */

static int Major;       /* Major number assigned to our device driver */
static int Device_Open = 0; /* Is device open?  
                 * Used to prevent multiple access to device */
static char *msg_Ptr;
cbuffer_t * buf;

struct semaphore prod_queue,cons_queue;
struct semaphore mtx;
int nr_prod_waiting,nr_cons_waiting;
static struct file_operations fops = {
    .read = device_read,
    .write = device_write,
    .open = device_open,
    .release = device_release
};

/*
 * This function is called when the module is loaded
 */
int init_module(void)
{
        Major = register_chrdev(0, DEVICE_NAME, &fops);

    if (Major < 0) {
      printk(KERN_ALERT "Registering char device failed with %d\n", Major);
      return -Major;
    }
    /*
     * Creation of buffer;
     */
    if( (buf = create_cbuffer_t(MAX_BUFFER_SIZE)) == NULL){
        printk(KERN_ALERT "Error when creating the FIFO device.");
        return -EINVAL;
    }
    /*sema_init(&prod_queue,0);
    sema_init(&cons_queue,0);
    sema_init(&mtx,1);
    nr_prod_waiting=nr_cons_waiting=0;*/

    printk(KERN_INFO "Buffer created without error.\n");
    printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major);
    printk(KERN_INFO "the driver, create a dev file with\n");
    printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major);
    printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n");
    printk(KERN_INFO "the device file.\n");
    printk(KERN_INFO "Remove the device file and module when done.\n");

    return SUCCESS;
}

/*
 * This function is called when the module is unloaded
 */
void cleanup_module(void)
{
    /* 
     * Unregister the device 
     */
    /*int ret = */unregister_chrdev(Major, DEVICE_NAME);
/*  if (ret < 0)
        printk(KERN_ALERT "Error in unregister_chrdev\n");//, ret);*/
    /*
     * Destroys the FIFO buffer
     */
    destroy_cbuffer_t (buf);

}

/*
 * Methods
 */

/* 
 * Called when a process tries to open the device file, like
 * "cat /dev/mycharfile"
 */
static int device_open(struct inode *inode, struct file *file)
{

    static int counter = 0;
    /*if (Device_Open)
        return -EBUSY;*/
    Device_Open++;
    printk(KERN_ALERT "The device %s has been open %d times.\n",DEVICE_NAME ,++counter);
/*  sprintf(msg, "The device %s has been open %d times.\n",DEVICE_NAME ,counter++);
    msg_Ptr = msg;*/
    try_module_get(THIS_MODULE);

    return SUCCESS;
}

/* 
 * Called when a process closes the device file.
 */
static int device_release(struct inode *inode, struct file *file)
{

    Device_Open--;      /* We're now ready for our next caller */
    /* 
     * Decrement the usage count, or else once you opened the file, you'll
     * never get get rid of the module. 
     */
    module_put(THIS_MODULE);

    return SUCCESS;
}

/* 
 * Called when a process, which already opened the dev file, attempts to
 * read from it.
 */
static ssize_t device_read(struct file *filp,   /* see include/linux/fs.h   */
               char *buffer,    /* buffer to fill with data */
               size_t length,   /* length of the buffer     */
               loff_t * offset)
{
    char aux[BUF_LEN];





    /*if (size_cbuffer_t(buf)<=0)
        return 0; //It should not be able to be less than 0 but just in case    */
    if (size_cbuffer_t(buf)<length){
        return -EINVAL;
    }   

    remove_items_cbuffer_t (buf,aux, length);
    copy_to_user(buffer, aux, length);

    return length;
}

/*  
 * Called when a process writes to dev file: echo "hi" > /dev/hello 
 */
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
    char aux[BUF_LEN];
    int ret = len;
    copy_from_user(aux,buff,ret);
    if(nr_gaps_cbuffer_t(buf)<ret){ 
        printk(KERN_ALERT "Error, no hay espacio para la cadena");
        return -EINVAL;
    }
    insert_items_cbuffer_t (buf, msg_Ptr, ret);

/*
    while (len) {
        get_user(*(msg_Ptr++), buff++);
        len--;
    }
*/  

    return ret;
}