- 论坛徽章:
- 0
|
源程序:
#define _NO_VERSION
#include <linux/module.h>
#include <linux/config.h>
#include <linux/version.h>
#include <asm/uaccess.h>
char kernel_version[] =UTS_RELEASE;
#define KERNEL
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/segment.h>
#define SUCCESS 0
#define DEVICE_NAME "char_dev"
static int Device_Open=0;
unsigned int test_major=0;
static int open_test(struct inode *inode,struct file *file){
#ifdef DEBUG
printk("device_open(%p)\n",file);
#endif
if(Device_Open)
return -EBUSY;
Device_Open++;
MOD_INC_USE_COUNT;
return SUCCESS;
}
static int release_test(struct inode *inode,struct file *file){
#ifdef DEBUG
printk("device_release(%p,%p)\n",inode,file);
#endif
Device_Open--;
MOD_DEC_USE_COUNT;
return 0;
}
static ssize_t read_test(struct file *file,char *buf,size_t count,loff_t *f_pos){
int left;
if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )
return -EFAULT;
for(left = count ;left > 0;left--)
{ _put_user(1,buf);
buf++;
}
return count;
}
static struct file_operations tdd_fops = {
read:read_test,
open pen_test,
release:release_test,
};
int init_module(void)
{
int result;
result = register_chrdev(0, "char_dev", &tdd_fops);
if (result < 0) {
printk("char_dev: can't get major number\n" ;
return result;
}
if (test_major == 0)
test_major = result; /* dynamic */
printk("Hello,I'm in kernel mode\n" ;
return 0;
}
void cleanup_module(void)
{
printk("<0>""Hello,I'm going to out\n" ;
unregister_chrdev(test_major,"test" ;
}
编译命令:gcc -D_KERNEL_ -DMODULE -DLINUX -I/usr/src/linux-2.4.20-8/include -c -o CharDriver.o CharDriver.c
结果:
CharDriver.c: At top level:
CharDriver.c:17: warning: `struct inode' declared inside parameter list
CharDriver.c:36: warning: `struct file' declared inside parameter list
CharDriver.c:36: warning: `struct inode' declared inside parameter list
CharDriver.c:48: warning: `struct file' declared inside parameter list
CharDriver.c:58: variable `tdd_fops' has initializer but incomplete type
CharDriver.c:59: unknown field `read' specified in initializer
CharDriver.c:59: warning: excess elements in struct initializer
CharDriver.c:59: warning: (near initialization for `tdd_fops')
CharDriver.c:60: unknown field `open' specified in initializer
CharDriver.c:60: warning: excess elements in struct initializer
CharDriver.c:60: warning: (near initialization for `tdd_fops')
CharDriver.c:61: unknown field `release' specified in initializer
CharDriver.c:61: warning: excess elements in struct initializer
CharDriver.c:61: warning: (near initialization for `tdd_fops')
CharDriver.c:58: storage size of `tdd_fops' isn't known
我的linux为Red Hat linux 9,我认为这里出现上述的问题主要是因为链接到了/usr/include/linux/fs.h |
|