此程序,是抄自网上,特地记录下,备以后回看。
- #ifndef __KERNEL__
- #define __KERNEL__
- #endif
- #ifndef __MODULE__
- #define __MODULE__
- #endif
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/fs.h>
- #include <asm/uaccess.h>
- #include <asm/io.h>
- #include <linux/delay.h>
- #define VIRTUAL_CHAR_MAJOR 240
- #define VIRTUAL_CHAR_DEVICE_NAME "myvcd"
- static int virtual_char_open(struct inode* inode, struct file* file)
- {
- printk("++++++++++++++++++/n");
- printk("pid is %d, comm is %s/n", current->pid, current->comm);
- (file->private_data) = (void*)0x76543210;
- return 0;
- }
- static int virtual_char_close(struct inode* inode, struct file* file)
- {
- printk("virtual char close/n");
- return 0;
- }
- static ssize_t virtual_char_read(struct file* file, char* buf, size_t count, loff_t* offset)
- {
- int res;
- printk("virtual_char read /n");
- res = copy_to_user((void __user*)buf, (void*)(file->private_data), sizeof(unsigned int));
- if (res == 0)
- {
- printk("virtual char can not copy to user %d/n", res);
- return -EFAULT;
- }
- return count;
- }
- static ssize_t virtual_char_write(struct file* file, const char* buf, size_t count, loff_t* offset)
- {
- printk("virtual char write %d byte/n", count);
- return count;
- }
- static loff_t virtual_char_llseek(struct file* file, loff_t offset, int whence)
- {
- printk("virtual char device llseek/n");
- return 0;
- }
- static struct file_operations virtual_char_fops =
- {
- .llseek = virtual_char_llseek,
- .read = virtual_char_read,
- .write = virtual_char_write,
- .open = virtual_char_open,
- .release= virtual_char_close,
- .ioctl = NULL,
- };
- static int virtual_char_init(void)
- {
- int res = register_chrdev(VIRTUAL_CHAR_MAJOR, VIRTUAL_CHAR_DEVICE_NAME, &virtual_char_fops);
- if (res < 0)
- {
- printk("virtual char init failure/n");
- return res;
- }
- printk("virtual char init success/n");
- return 0;
- }
- static void virtual_char_cleanup(void)
- {
- printk("virtual char cleanup/n");
- unregister_chrdev(VIRTUAL_CHAR_MAJOR, VIRTUAL_CHAR_DEVICE_NAME);
- }
- module_init(virtual_char_init);
- module_exit(virtual_char_cleanup);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("yijunjun");