标签:blog io ar os for on div log ad
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/moduleparam.h>
#include <asm/uaccess.h>
struct mem_dev
{
unsigned long size;
char *data;
struct cdev cdev;
};
static int major,minor;
module_param(major,int,S_IRUGO);
struct mem_dev mem_dev[2];
int mem_open(struct inode *inode, struct file *file)
{
struct mem_dev *dev;
dev = container_of(inode->i_cdev, struct mem_dev, cdev);
file->private_data = dev;
return 0;
}
ssize_t mem_read(struct file *file,char __user *buf,size_t size, loff_t *loff)
{
loff_t lof = *loff;
int ret;
size_t sizet = size;
struct mem_dev *p;
if(lof > 4096)
return 0;
if(sizet > 4096 - lof)
sizet = 4096 - lof;
p = file->private_data;
if(copy_to_user(buf,(void *)(p->data + lof),sizet))
{
ret = -EFAULT;
}
else
{
loff += sizet;
ret = sizet;
printk(KERN_CRIT "read %d byte(s) from mem_dev %d.\n",ret, lof);
}
return ret;
}
loff_t mem_llseek(struct file *file,loff_t loff,int whence)
{
loff_t new;
switch(whence)
{
case 0:
new = loff;
break;
case 1:
new = file->f_pos + loff;
break;
case 2:
new = 4096-1 + loff;
break;
default:
new = -EINVAL;
break;
}
if(new >= 4096 ||new < 0)
{
return new;
}
file->f_pos = new;
return new;
}
ssize_t mem_write(struct file *file, const char __user *buf, size_t size,loff_t *loff)
{
loff_t lof = *loff;
int ret;
size_t sizet = size;
struct mem_dev *p;
if(lof > 4096)
return 0;
if(sizet > 4096 - lof)
sizet = 4096 - lof;
p = file->private_data;
if(copy_from_user((void *)(p->data + lof),buf,sizet))
{
ret = -EFAULT;
}
else
{
loff += sizet;
ret = sizet;
printk(KERN_CRIT "write %d byte(s) from mem_dev %d.\n",ret, lof);
}
return ret;
}
int mem_release(struct inode *inode,struct file *file)
{
return 0;
}
struct file_operations fops =
{
.owner = THIS_MODULE,
.open = mem_open,
.read = mem_read,
.write = mem_write,
.llseek = mem_llseek,
.release = mem_release,
};
static void setup_cdev(struct mem_dev *dev,int index)
{
int err,devno = MKDEV(major,minor + index);
cdev_init(&dev->cdev,&fops);
dev->cdev.owner = THIS_MODULE;
dev->cdev.ops = &fops;
err = cdev_add(&(dev->cdev),devno,1);
if(err)
printk(KERN_NOTICE "Error %d adding cdev%d.\n",err, index);
}
dev_t dev;
static int mem_init(void)
{
int result,i;
if(major)
{
dev = MKDEV(major,0);
result = register_chrdev_region(dev,2,"memdev");
}
else
{
result = alloc_chrdev_region(&dev,0,2,"memdev");
major = MAJOR(dev);
}
if(result < 0)
return result;
setup_cdev(&mem_dev[0],0);
setup_cdev(&mem_dev[1],1);
for(i = 0;i < 2;i++)
{
mem_dev[i].size = 4096;
mem_dev[i].data = kmalloc(mem_dev[i].size,GFP_KERNEL);
memset(mem_dev[i].data,0,mem_dev[i].size);
}
printk(KERN_ALERT "mem_dev setup success.");
return 0;
}
static void mem_exit(void)
{
cdev_del(&mem_dev[0].cdev);
cdev_del(&mem_dev[1].cdev);
unregister_chrdev_region(dev,2);
}
MODULE_LICENSE("GPL");
module_init(mem_init);
module_exit(mem_exit);
标签:blog io ar os for on div log ad
原文地址:http://www.cnblogs.com/tolimit/p/4109394.html