#include #include #include #define MAX_BUFSIZE 4096 #define MAX_BUFNUM 4 int flgOpen = 0; unsigned char memdev_buf0[MAX_BUFNUM][MAX_BUFSIZE]; static int memdev_buflen = 0; static int __init init_memdev(void); static void __exit exit_memdev(void); static int memdev_open(void); static int memdev_release(void); static ssize_t memdev_write(struct file *fp, const char __user *buf, size_t size, loff_t *pos); static int memdev_read(struct file *fp, char __user *buf, size_t size, loff_t *pos); static struct file_operations memdev_fops = { .owner = THIS_MODULE, .open = memdev_open, .release = memdev_release, .read = memdev_read, .write = memdev_write, }; static int __init init_memdev(void) { printk("loading memdev...\n"); register_chrdev(99, "/dev/memdev", &memdev_fops); } static void __exit exit_memdev(void) { printk("unloading memdev...\n"); unregister_chrdev(99, "/dev/memdev"); } static int memdev_open(void) { flgOpen = 1; return 0; } static int memdev_release(void) { flgOpen = 0; return 0; } static ssize_t memdev_write(struct file *fp, const char __user *buf, size_t size, loff_t *pos) { char *memdev_buf; struct inode *inode = fp->f_path.dentry->d_inode; unsigned int minor = iminor(inode); memdev_buf = memdev_buf0[minor]; if(size >= MAX_BUFSIZE) return 0; /* because of '\0' */ if (copy_from_user(memdev_buf, buf, size)) { printk("copy_from_user failed...\n"); return 0; /* kakikometa data size */ } else { memdev_buflen = size; printk(KERN_INFO "copy_from_user succeeded...\n"); return size; } } static int memdev_read(struct file *fp, char __user *buf, size_t size, loff_t *pos) { char *memdev_buf; struct inode *inode = fp->f_path.dentry->d_inode; unsigned int minor = iminor(inode); memdev_buf = memdev_buf0[minor]; if (memdev_buflen == 0 ) return 0; if (copy_to_user(buf, memdev_buf, size)) { printk("copy_to_user failed...\n"); return 0; /* yomikometa data size */ } else { return size; } } module_init(init_memdev) module_exit(exit_memdev)