LInux 字符设备驱动程序

  
  
  
  
  1. #include <linux/module.h> 
  2.  
  3. #include <linux/init.h> 
  4.  
  5. #include <linux/fs.h> 
  6.  
  7. #include <asm/uaccess.h> 
  8.  
  9. MODULE_LICENSE("GPL");// 设置这个模块的协议为 GPL  
  10.  
  11. #define MAJOR_NUM 2918 //主设备号 
  12.  
  13. //声明Read函数 
  14. static ssize_t device_read(struct file *, char *, size_t, loff_t*); 
  15. //声明Write函数 
  16. static ssize_t device_write(struct file *, const char *, size_t, loff_t*); 
  17.  
  18. //初始化字符设备驱动的file_operations结构体 
  19.  
  20. struct file_operations device_fops = 
  21.  
  22. .read=device_read, 
  23. .write=device_write, 
  24. }; 
  25.  
  26. static int device_var = 0; //"globalvar"设备的全局变量 
  27.  
  28. static int __init device_init(void
  29. int ret; 
  30. //注册设备驱动 
  31. ret = register_chrdev(MAJOR_NUM, "device", &device_fops); 
  32. if (ret) 
  33. printk("device register failure"); 
  34. else 
  35. printk("device register success"); 
  36. return ret; 
  37.  
  38. static void __exit device_exit(void
  39. int ret = 0; 
  40. //注销设备驱动 
  41. unregister_chrdev(MAJOR_NUM, "device"); 
  42. if (ret) 
  43. printk("device unregister failure"); 
  44. else 
  45. printk("device unregister success"); 
  46. //READ 
  47. static ssize_t device_read(struct file *filp, char *buf, size_t len, loff_t *off) 
  48. //将device_var从内核空间复制到用户空间 
  49. if (copy_to_user(buf, &device_var, sizeof(int))) 
  50. return - EFAULT; 
  51. return sizeof(int); 
  52. static ssize_t device_write(struct file *filp, const char *buf, size_t len, loff_t *off) 
  53. //将用户空间的数据复制到内核空间的device_var 
  54. if (copy_from_user(&device_var, buf, sizeof(int))) 
  55. return - EFAULT; 
  56. return sizeof(int); 
  57. module_init(device_init); 
  58. module_exit(device_exit); 

编译为模块:

命令为:make -C /lib/modules/3.0.0-7-generic/build M(等号)/home/shi/c_dev/modules

Makefile为

 

  
  
  
  
  1. # From《Linux Device Drivers》3rd Edition 
  2. # Makefile 
  3. ifneq ($(KERNELRELEASE),) 
  4. # call from kernel build system 
  5.  
  6. obj-m   :device.o 
  7.  
  8. else 
  9.  
  10. KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
  11. PWD       := $(shell pwd) 
  12.  
  13. default: 
  14.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 
  15.  
  16. endif  

完成之后,讲模块加入到内核中去

sudo insmod ./device.ko

查看所有模块

lsmod

删除模块

sudo rmmod ./device.ko

测试程序

 

  
  
  
  
  1. #include <sys/types.h> 
  2. #include <sys/stat.h> 
  3. #include <stdio.h> 
  4. #include <fcntl.h> 
  5. main() 
  6. int fd,num; 
  7. //打开"/dev/device" 
  8. fd = open("/dev/device", O_RDWR, S_IRUSR | S_IWUSR); 
  9. if (fd != 0) 
  10. //初次读device 
  11. read(fd, &num, sizeof(int)); 
  12. printf("The device is %d\n", num); 
  13. //写device 
  14. printf("Please input the num written to device\n"); 
  15. scanf("%d", &num); 
  16. write(fd, &num, sizeof(int)); 
  17. //再次读device 
  18. read(fd, &num, sizeof(int)); 
  19. printf("The device is %d\n", num); 
  20. //关闭"/dev/device" 
  21. close(fd); 
  22. else 
  23. printf("Device open failure\n"); 
  24. }  

运行结果

shi@smkoo:~/c_dev$ ./test
The device is 134514219
Please input the num written to device
1
The device is 1
 

你可能感兴趣的:(linux,职场,程序,休闲)