📄 mydev.c
字号:
#ifndef __KERNEL__#define __KERNEL__ #endif#ifndef MODULE#define MODULE #endif#include </home/zhangjian/ostask/linux-2.6.18/include/asm/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/kernel.h>#include <asm/uaccess.h>#define CHAR_MAJOR_NUM 300 char msgbuf[256];static int test_major= 0;static int dev_open(struct inode *, struct file *);static int dev_release(struct inode *, struct file *);static ssize_t dev_read(struct file *, char *, size_t, loff_t *);static ssize_t dev_write(struct file *, const char *, size_t, loff_t *);struct file_operations dev_fops ={ open: dev_open, release: dev_release, read: dev_read, write: dev_write,};static int dev_init(){ int result; result=register_chrdev(CHAR_MAJOR_NUM, "mydev", &dev_fops); if (result<0){ printk("mydev register failure!");return result;} if(result==0){ printk("mydev register success!");test_major=result;} return 0;}static void dev_exit(){ unregister_chrdev(CHAR_MAJOR_NUM, "mydev");}static int dev_open(struct inode *node, struct file *f){ return 0;}static ssize_t dev_release(struct inode *node, struct file *f){ return 0;}static ssize_t dev_read(struct file *f, char *buf, size_t len, loff_t *off){ int i; for(i=0;i<len;i++) { if(__put_user(msgbuf[i],buf++)) return -EFAULT; } return len;}static ssize_t dev_write(struct file *f, const char *buf,size_t len, loff_t *off){ int i; unsigned char uc; printk("Data below is from user.\n"); for(i=0;i<len;i++) { if(!get_user(msgbuf[i],buf++)) printk("%02x",uc); } return len; }module_init(dev_init);module_exit(dev_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -