1、 完成Demo虚拟驱动程序
demo.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>/* everything... */
#include <linux/poll.h>/* COPY_TO_USER */
#define DEVICE_NAME "demo"
#define demo_MAJOR 249
#define demo_MINOR 0
#define MAX_BUF_LEN 40
static char drv_buf[MAX_BUF_LEN];
static unsigned char demo_inc=0;
static int demo_open(struct inode *inode, struct file *file)
{
demo_inc++;
sprintf(drv_buf,"device open sucess!\n");
printk("device open sucess!\n");
return 0;
}
static int demo_release(struct inode *inode, struct file *filp)
{
demo_inc--;
printk("device release\n");
return 0;
}
static ssize_t demo_write(struct file *filp,const char *buffer,size_t count)
{
copy_from_user(drv_buf,buffer,count);
printk("user write data to driver\n");
return count;
}
static ssize_t demo_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{
if(count>MAX_BUF_LEN)
{
count=MAX_BUF_LEN;
copy_to_user(buffer,drv_buf,count);
printk("user read data from driver\n");
return count;
}
}
/*************************************************************************************/
static struct file_operations demo_fops = {
owner: THIS_MODULE,
write: demo_write,
read: demo_read,
open: demo_open,
release: demo_release,
};
/*************************************************************************************/
#ifdef CONFIG_DEVFS_FS
static devfs_handle_t devfs_demo_dir,devfs_demoraw;
#endif
static int __init demo_init(void)
{
#ifdef CONFIG_DEVFS_FS
devfs_demo_dir = devfs_mk_dir(NULL,"demo",NULL);
devfs_demoraw = devfs_register(devfs_demo_dir,"0",DEVFS_FL_DEFAULT,
demo_MAJOR,demo_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,
&demo_fops,NULL);
#else
int result;
//修改
//SET_MODULE_OWNER(&demo_fops);
result = register_chrdev(demo_MAJOR,"demo",&demo_fops);
if(result<0)return result;
#endif
printk(DEVICE_NAME " initialized\n");
return 0;
}
/*************************************************************************************/
static void __exit demo_exit(void)
{
unregister_chrdev(demo_MAJOR,"demo");
//kfree(demo_devices);
printk(DEVICE_NAME "unloaded\n");
}
/*************************************************************************************/
module_init(demo_init);
module_exit(demo_exit);
代码做了少许改动,删去了代码SET_MODULE_OWNER(&demo_fops);因为不删除去出现如下错误,可以知道该函数属于隐式声明函数。最后删去了这段代码。
Makefile
ifneq ($(KERNELRELEASE),)
obj-m:=demo.o
else
PWD :=$(shellpwd)
KERNELDIR:=/usr/src/kernels/2.6.32-279.el6.i686
all:
$(MAKE)-C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf*.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
endif
Makefile的代码文件当然也需要修改一下,因为内核源码的位置是不一样的,所以KERNELDIR存放的地址改为你源码存放的地方。两者准备好了以后就可以make了,实验过程如下:
运行make命令后,就会生成驱动程序demo.ko,然后