Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95635
  • 博文数量: 16
  • 博客积分: 359
  • 博客等级: 一等列兵
  • 技术积分: 279
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-24 22:08
文章分类
文章存档

2014年(3)

2012年(13)

我的朋友

分类: LINUX

2012-03-25 11:13:41

2012年3月25日  Sunday
 
1、内核版本号2.6.33.20
 
2、proc文件系统简单示例
 
3、驱动模块源文件proc_dev.c

点击(此处)折叠或打开

  1. #include <linux/init.h>
  2. #include <linux/kernel.h>
  3. #include <linux/module.h>

  4. #include <linux/fs.h>
  5. #include <linux/errno.h>
  6. #include <linux/types.h>
  7. #include <linux/fcntl.h>

  8. #include <asm/uaccess.h>
  9. #include <asm/io.h>

  10. #include <linux/stat.h>
  11. #include <linux/proc_fs.h>

  12. struct proc_dir_entry *sumproc_root_fp =NULL;
  13. struct proc_dir_entry *sumproc_val1_fp =NULL;
  14. struct proc_dir_entry *sumproc_val2_fp =NULL;
  15. struct proc_dir_entry *sumproc_result_fp =NULL;

  16. char sumproc_str1[PAGE_SIZE-80]={0,};
  17. char sumproc_str2[PAGE_SIZE-80]={0,};

  18. int read_sumproc_val(char *page,char **start,
  19.         off_t off,int count,
  20.         int *eof,void *data_unused)
  21. {
  22.     char *buf;
  23.     char *realdata;
  24.     
  25.     realdata=(char*)data_unused;
  26.     buf=page;
  27.     buf+=sprintf(buf,"Value=[%s]\n",realdata);
  28.     
  29.     *eof=1;
  30.     return buf-page;
  31. }

  32. int write_sumproc_val(struct file *filp,const char __user *buffer,
  33.         unsigned long count,void *data)
  34. {
  35.     int len;
  36.     char *realdata;
  37.     
  38.     realdata=(char*)data;
  39.     
  40.     if(copy_from_user(realdata,buffer,count)){
  41.         return -EFAULT;
  42.     }
  43.     
  44.     realdata[count]='\0';
  45.     len=strlen(realdata);
  46.     if(realdata[len-1]=='\n'){
  47.         realdata[--len]=0;
  48.     }
  49.     return count;
  50. }

  51. int read_sumproc_result(char *page,char **start,
  52.         off_t off,int count,
  53.         int *eof,void *data_unused)
  54. {
  55.     char *buf;
  56.     int a,b,sum;
  57.     buf=page;
  58.     
  59.     a=simple_strtoul(sumproc_str1,NULL,10);
  60.     b=simple_strtoul(sumproc_str2,NULL,10);
  61.     
  62.     sum=a+b;
  63.     buf+=sprintf(buf,"Result[%d+%d=%d]\n",a,b,sum);
  64.     
  65.     *eof=1;
  66.     return buf-page;
  67. }

  68. int sumproc_init(void)
  69. {
  70.     sumproc_root_fp =proc_mkdir("sumproc",0);
  71.     
  72.     sumproc_val1_fp=create_proc_entry("val1",S_IFREG|S_IRWXU,sumproc_root_fp);
  73.     
  74.     if(sumproc_val1_fp){
  75.         sumproc_val1_fp->data=sumproc_str1;
  76.         sumproc_val1_fp->read_proc=read_sumproc_val;
  77.         sumproc_val1_fp->write_proc=write_sumproc_val;
  78.     }
  79.     
  80.     sumproc_val2_fp=create_proc_entry("val2",S_IFREG|S_IRWXU,sumproc_root_fp);
  81.     
  82.     if(sumproc_val2_fp){
  83.         sumproc_val2_fp->data=sumproc_str2;
  84.         sumproc_val2_fp->read_proc=read_sumproc_val;
  85.         sumproc_val2_fp->write_proc=write_sumproc_val;
  86.     }
  87.     
  88.     sumproc_result_fp=create_proc_entry("result",S_IFREG|S_IRWXU,sumproc_root_fp);
  89.     
  90.     if(sumproc_root_fp){
  91.         sumproc_result_fp->read_proc=read_sumproc_result;
  92.     }
  93.     
  94.     return 0;
  95. }

  96. void sumproc_exit(void)
  97. {
  98.     remove_proc_entry("result",sumproc_root_fp);
  99.     remove_proc_entry("val1",sumproc_root_fp);
  100.     remove_proc_entry("val2",sumproc_root_fp);
  101.     remove_proc_entry("sumproc",0);
  102. }

  103. module_init(sumproc_init);
  104. module_exit(sumproc_exit);

  105. MODULE_LICENSE("Gual BSD/GPL");

4、Makefile

点击(此处)折叠或打开

  1. obj-m += proc_dev.o

  2. CURRENT_PATH := $(shell pwd)

  3. LINUX_KERNEL := $(shell uname -r)

  4. LINUX_KERNEL_PATH := /usr/src/linux-$(LINUX_KERNEL)

  5. all:
  6.     make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
  7. clean:
  8.     #make -C $(LINUX_KERNEL_PAHT) M=$(CURRENT_PATH) clean
  9.     rm *.mod.*
  10.     rm *.order
  11.     rm *.o
  12.     rm *.symvers

5、执行方法及结果

点击(此处)折叠或打开

  1. ~/proc_test# make //编译驱动模块
  2. ~/proc_test# make clean //清理不用到的生成文件
  3. ~/proc_test# insmod proc_dev.ko //插入驱动模块
  4. ~/proc_test# lsmod |grep proc_dev //查看驱动模块是否插入成功
  5. proc_dev 9562 0
  6. ~/proc_test# echo "100" > /proc/sumproc/val1 //用echo向val1文件输入值
  7. ~/proc_test# cat /proc/sumproc/val1 //查看是否输入成功
  8. Value=[100]
  9. ~/proc_test# echo "10" > /proc/sumproc/val2 //用echo向val2文件输入值
  10. ~/proc_test# cat /proc/sumproc/result //查看result文件中的运算结果
  11. Result[100+10=110]

6、移除模块

  1. ~/proc_test# rmmod proc_dev //移除驱动模块

阅读(1009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~