2014-01-07 3 views
0

Я программирую модуль ядра, который должен действовать как символьное устройство, которое действует как циклическое устройство FIFO, но когда я пытаюсь его скомпилировать, у меня есть некоторые ошибки, которые я не знаю, как исправить , вот мой источник. Извините, если мой английский плохой, и если я не пишу больше информации, я новичок в C в модулях linux, я использую 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 

а вот Source Извините за длинный пост, но я не знаю, как это исправить. Я прочитал руководство по программированию модуля ядра, и я не понял его половины, и он не помог мне восстановить этот источник.

#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 
+0

Err. Вы можете перевести ошибку компиляции на английском языке? _No existe el fichero o el directorio_ –

+0

Да, это то, что это значит – Kaostias

ответ

0

Я отправляю это из-за людей, которые coud имеют ту же проблему

У меня было несколько проблем, несмотря на то, много неправильного кода, главная неудача fcntl.h, это была легкая задача, потому что он пришел из предыдущей версии, и это было неиспользованным, так что я только что удалил

#include <fcntl.h> 

ошибки конфликтующих типа в том, что пара включает были противоречивая.

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

У меня есть много кода для ремонта, но в данный момент я извлекал механизмы Syncrone, я добавлю «Em в более поздних версиях, мой текущий код заключается в следующем:

#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; 
} 
0

Файл заголовка fcntl.h не был найден ... Добавить это включаемого путь. Флагом компилятора является -Idir_name.

Вы уверены, что можете использовать файлы заголовков libc из кода ядра?

+0

Я не понимаю, ¿Что вы имеете в виду? – Kaostias

+0

Исправлен ответ. – egur

+0

какой путь имеет fcntl.h? где я должен добавить флаг компилятора? Я не уверен ни в чем, hahaha – Kaostias

Смежные вопросы