You should donwload the files (code examples) of the book: http://examples.oreilly.com/linuxdrive2/ There you can find a load of Makefiles that you can get ideas from and/or use them directly for your own modules. You can also use the Makefiles that are printed in the book (that's how I started). Dave On Sat, 2004-06-19 at 02:24, Gaurav Dhiman wrote: > Hi > > I am a Newbie in Kernel Programming and just now subscribed to this > list. Writing my first kernel module and reading Alessandros book on > Linux Device Driver. > > When I compile my simple module with gcc, it throughs al bunch of > errors. > > As far as I think the errors are because the gcc could not find the > defination of few of the structure used, like struct file, struct > inode and struct file_operations etc. I have included the linux/fs.h > file and have also define the required macros like MODULE and > __KERNEL__, but still not able to compile it successfully. > > For debugging, I ran the macro option (-E) of gcc to get the output of > Macro, so that I could know what exactly is included in file before > compilation. In the Macro output I could not find the definations of > above mentioned structure, although they are defined in linux/fs.h and > I have included that file in my source. > > I am pasting the output of gcc below. > > Also pasting the source of my module. > > Please have a look at it and help me if you can. > > In source I have left few of the functions like open, release etc, > blank. I have just started writing it and will complete it once I get > through this problem. > > Details of my system: > > Single Processor > > Redhat Enterprise 3.1 > > Kernel: linux-2.4.21-4 > > Compiler : gcc 3.2.3.20 > > > I have one more this to say, when I cteared the simple "Hello World" > module and compiled it, it compiled without any problem, but when I > tried to load that module in kernel, insmod command gave me versioning > error. It said that you are trying to load the module against > different kernel version. Well I know it can happen, but my question > on this is, is it possible that the runnning kernel might be different > from the kernel in source tree. I did not downloaded the source, Its > the default source which comes with installation. > > Anyway, please take a look at the errors and source to help me out. > > > > ************************************************************************************************ > > Output of gcc > > ************************************************************************************************ > > main.c:27: warning: `struct file' declared inside parameter list > > main.c:27: warning: its scope is only this definition or declaration, > which is probably not what you want > > main.c:27: warning: `struct inode' declared inside parameter list > > main.c:28: warning: `struct file' declared inside parameter list > > main.c:29: warning: `struct file' declared inside parameter list > > main.c:30: warning: `struct file' declared inside parameter list > > main.c:31: warning: `struct file' declared inside parameter list > > main.c:31: warning: `struct inode' declared inside parameter list > > main.c: In function `fifo_init_module': > > main.c:71: invalid use of undefined type `struct file_operations' > > main.c:72: invalid use of undefined type `struct file_operations' > > main.c:73: invalid use of undefined type `struct file_operations' > > main.c:73: `write' undeclared (first use in this function) > > main.c:73: (Each undeclared identifier is reported only once > > main.c:73: for each function it appears in.) > > main.c:74: invalid use of undefined type `struct file_operations' > > main.c:75: invalid use of undefined type `struct file_operations' > > main.c:77: warning: implicit declaration of function `register_chrdev' > > main.c:80: warning: implicit declaration of function `printk' > > main.c:80: `KERN_EMERG' undeclared (first use in this function) > > main.c:80: syntax error before string constant > > main.c: In function `fifo_cleanup_module': > > main.c:101: warning: implicit declaration of function > `unregister_chrdev' > > main.c:101: `fifo_f_ops' has an incomplete type > > main.c: At top level: > > main.c:122: warning: `struct file' declared inside parameter list > > main.c:122: warning: `struct inode' declared inside parameter list > > main.c:122: conflicting types for `fifo_open' > > main.c:27: previous declaration of `fifo_open' > > main.c:140: warning: `struct file' declared inside parameter list > > main.c:140: conflicting types for `fifo_read' > > main.c:28: previous declaration of `fifo_read' > > main.c:160: warning: `struct file' declared inside parameter list > > main.c:160: conflicting types for `fifo_write' > > main.c:29: previous declaration of `fifo_write' > > main.c:175: warning: `struct file' declared inside parameter list > > main.c:175: conflicting types for `fifo_llseek' > > main.c:30: previous declaration of `fifo_llseek' > > main.c:194: warning: `struct file' declared inside parameter list > > main.c:194: warning: `struct inode' declared inside parameter list > > main.c:194: conflicting types for `fifo_release' > > main.c:31: previous declaration of `fifo_release' > > main.c:203: warning: type defaults to `int' in declaration of > `module_init' > > main.c:203: warning: parameter names (without types) in function > declaration > > main.c:203: warning: data definition has no type or storage class > > main.c:204: warning: type defaults to `int' in declaration of > `module_exit' > > main.c:204: warning: parameter names (without types) in function > declaration > > main.c:204: warning: data definition has no type or storage class > > main.c:44: storage size of `fifo_f_ops' isn't known > > > > ************************************************************************************************ > > Main.c > > ************************************************************************************************ > > /*Simple FIFO Module*/ > > #define MODULE > > #define __KERNEL__ > > #include<linux/config.h> > > #ifdef CONFIG_SMP > > #define __SMP__ > > #endif > > #include<linux/fs.h> > > #include<linux/kernel.h> > > #include<linux/module.h> > > #include<linux/wrapper.h> > > #include<linux/types.h> > > /*#include<linux/init.h>*/ > > /*#include<linux/kernel.h>*/ > > #define MAJOR_NUM 0 > > #define DRIVER_NAME "my_fifo" > > /*======================================== > > Function Declerations > > =========================================*/ > > int fifo_init_module(void); > > void fifo_cleanup_module(void); > > int fifo_open(struct inode* fifo_inode_p, struct file* fifo_file_p); > > int fifo_read(struct file* fifo_file_p, char* fifo_read_buffer, int > fifo_num_char, loff_t* fifo_file_position_p); > > size_t fifo_write(struct file* fifo_file_p, char* fifo_write_buffer, > size_t fifo_num_char, loff_t* fifo_file_position_p); > > int fifo_llseek(struct file* fifo_file_p, loff_t fifo_file_position); > > int fifo_release(struct inode* fifo_inode_p, struct file* > fifo_file_p); > > /*======================================== > > Global Declerations > > =========================================*/ > > /*struct file_operations fifo_f_ops = { > > llseek: fifo_lseek, > > read: fifo_read, > > write: fifo_write, > > open: fifo_open > > };*/ > > struct file_operations fifo_f_ops; > > /*this flag will be used for tracking and reverting back > > in initialization phase, in case some thing goes wrong in initilizing > module*/ > > int fifo_init_flag = 0; > > int fifo_major_num = MAJOR_NUM; > > MODULE_PARM(fifo_major_num, "i"); > > /*======================================== > > Functions Defination > > =========================================*/ > > /*==================================================================== > > Name: fifo_init_module() > > =====================================================================*/ > > int fifo_init_module(void){ > > int retval = 0; > > fifo_f_ops.llseek = fifo_llseek; > > fifo_f_ops.read = fifo_read; > > fifo_f_ops.write = write; > > fifo_f_ops.open = fifo_open; > > fifo_f_ops.release = fifo_release; > > retval = register_chrdev(fifo_major_num, DRIVER_NAME, &fifo_f_ops); > > if (retval < 0){ > > printk(KERN_EMERG "fifo driver could not get the free major > number.\n"); > > return retval; > > } > > fifo_major_num = fifo_major_num?fifo_major_num:retval; > > fifo_init_flag = 1; > > } > > /*==================================================================== > > Name: fifo_clear_module() > > =====================================================================*/ > > void fifo_cleanup_module(void){ > > switch(fifo_init_flag){ > > case 1: > > unregister_chrdev(DRIVER_NAME, fifo_f_ops); > > break; > > }; > > } > > /*==================================================================== > > Name: fifo_open() > > =====================================================================*/ > > int fifo_open(struct inode* fifo_inode_p, struct file* fifo_file_p){ > > } > > > > /*==================================================================== > > Name: fifo_read() > > =====================================================================*/ > > int fifo_read(struct file* fifo_file_p, char* fifo_read_buffer, int > fifo_num_char, loff_t* fifo_file_position_p){ > > } > > > > > > /*==================================================================== > > Name: fifo_write() > > =====================================================================*/ > > size_t fifo_write(struct file* fifo_file_p, char* fifo_write_buffer, > size_t fifo_num_char, loff_t* fifo_file_position_p){ > > } > > > > /*==================================================================== > > Name: fifo_lseek() > > =====================================================================*/ > > int fifo_llseek(struct file* fifo_file_p, loff_t fifo_file_position){ > > } > > > > /*==================================================================== > > Name: fifo_release() > > =====================================================================*/ > > int fifo_release(struct inode* fifo_inode_p, struct file* > fifo_file_p){ > > } > > /*==================================================================== > > Explicitly mentioning the initialization and cleanup function of this > > driver module. > > =====================================================================*/ > > module_init(fifo_init_module); > > module_exit(fifo_cleanup_module); > > > > Regards, > > Gaurav > > > > ______________________________________________________________________ > Do you Yahoo!? > Yahoo! Mail - 50x more storage than other providers!
Attachment:
signature.asc
Description: This is a digitally signed message part