已經沒法再精簡,適合入門。node
1 #include<linux/module.h> 2 #include<linux/init.h> 3 4 #include<asm/uaccess.h> 5 #include <linux/types.h> 6 #include<linux/fs.h> 7 #include<linux/cdev.h> 8 struct mengc_dev{ 9 char data[64]; 10 struct cdev cdev; 11 }; 12 int mengmajor; 13 struct mengc_dev meng_device; 14 15 void exit_mengc_dev(void) 16 { 17 dev_t devno = MKDEV(mengmajor,1); 18 cdev_del(&meng_device.cdev); 19 unregister_chrdev_region(devno,1); 20 } 21 int meng_open(struct inode*inode,struct file *filep) 22 { 23 return 0; 24 } 25 int meng_release(struct inode*inode,struct file *filep) 26 { 27 return 0; 28 } 29 30 ssize_t meng_read(struct file*filep,char __user*buf,size_t count,loff_t*f_ops) 31 { 32 if(*f_ops>=strlen(meng_device.data)) 33 return 0; 34 if(copy_to_user(buf,meng_device.data,strlen(meng_device.data))) 35 { 36 return -1; 37 } 38 *f_ops+=strlen(meng_device.data); 39 return strlen(meng_device.data); 40 } 41 42 ssize_t meng_write(struct file*filep,const char __user*buf,size_t count,loff_t*f_ops) 43 { 44 if(count>63) 45 count=63; 46 if(copy_from_user(meng_device.data,buf,count)) 47 { 48 return -EFAULT; 49 } 50 return count; 51 } 52 53 54 struct file_operations meng_fops= 55 { 56 .read=meng_read, 57 .write=meng_write, 58 .open=meng_open, 59 .release=meng_release 60 }; 61 int init_mengc_dev(void) 62 { 63 int re; 64 dev_t dev=0; 65 re=alloc_chrdev_region(&dev,1,1,"mengcdev"); 66 if(re<0) 67 { 68 printk("meng_devc register failed.\n"); 69 return re; 70 } 71 mengmajor=MAJOR(dev); 72 memset(&meng_device,0,sizeof(meng_device)); 73 cdev_init(&meng_device.cdev,&meng_fops); 74 meng_device.cdev.owner=THIS_MODULE; 75 meng_device.cdev.ops=&meng_fops; 76 re=cdev_add(&meng_device.cdev,dev,1); 77 if(re) 78 { 79 printk("mengdevc add faild.\n"); 80 } 81 return 0; 82 } 83 module_init(init_mengc_dev); 84 module_exit(exit_mengc_dev);
將上面的文件保存成mengcdev.clinux
而後在相同目錄下創建一個Makefile文件,文件內容以下(只需這一行):測試
obj-m :=mengcdev.oui
而後在此目錄下執行 make -C /lib/modules/`uname -r`/build/ M=`pwd` 這條命令執行成功的前天是安裝了源代碼包,具體能夠參閱其餘資料,Ubuntu只需apt-get install 幾個包,Redhat系列只需yuminstall 幾個。固然須要有開發環境了,即gcc之類的。spa
一旦編譯完成便可生成mengcdev.ko 這個模塊code
用root插入這個模塊 insmod mengcdev.koblog
而後去/proc/device中找相應的設備號 開發
cat /proc/devices |grep mengget
若是輸出以下:it
248 mengcdev
則執行
mknod /dev/mengcdev c 248 1,注意把248換成實際輸出的值
而後就能夠進行測試了 echo hello >/dev/mengcdev
cat /dev/mengcdev