九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 3154|回复: 0
打印 上一主题 下一主题

x4412&ibox项目实战65-使用proc虚拟文件系统调试内核(二)

[复制链接]
跳转到指定楼层
楼主
发表于 2014-12-12 17:40:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本小节通过实例讲述create_proc_entry函数的用法。在/kernel/drivers/char/x4412目录下新建x4412-proc.c文件,编辑内容如下:
  1. #include<linux/init.h>
  2. #include<linux/module.h>
  3. #include<linux/kernel.h>
  4. #include<linux/proc_fs.h>
  5. #include <asm/uaccess.h>

  6. static int val = 0x55aa;
  7. static struct proc_dir_entry *proc_entry;
  8. ssize_t x4412_proc_read(char *buf, char **start, off_t offset, int count, int *eof, void *data)
  9. {
  10.     int len = 0;
  11.     len = sprintf(buf, "0x%x\r\n",val);
  12.     *eof = 1;
  13.     return len;
  14. }
  15. ssize_t x4412_proc_write(struct file *filp, const char __user *buff,unsigned long len, void *data)
  16. {
  17.          char k_buf[8];
  18.          char *endp;
  19.          unsigned long new;
  20.          int count = min(8, len);
  21.          int ret;
  22.          if (copy_from_user(k_buf, buff, count))//用户空间->内核空间
  23.          {
  24.                    ret = - EFAULT;
  25.                    goto err;
  26.          }
  27.          else
  28.          {
  29.                    new = simple_strtoul(k_buf, &endp, 16); //字符串转化为整数
  30.                    if (endp == k_buf)//无效的输入参数
  31.                    {
  32.                             ret = - EINVAL;
  33.                             goto err;
  34.                    }
  35.                    val = new;
  36.                    return count;
  37.          }
  38.          err:
  39.          return ret;
  40. }
  41. static int __init x4412_proc_init(void)
  42. {
  43.          proc_entry = create_proc_entry("x4412_proc", 0666, NULL); //创建/proc
  44.          if (proc_entry == NULL)
  45.          {
  46.                    printk(KERN_INFO "Couldn't create proc entry\n");
  47.                    goto err;
  48.          }
  49.          else
  50.          {
  51.                    proc_entry->read_proc = x4412_proc_read;
  52.                    proc_entry->write_proc = x4412_proc_write;
  53.          }
  54.          return 0;
  55. err:
  56.          return - ENOMEM;
  57. }
  58. static void __exit x4412_proc_exit(void)
  59. {
  60.     remove_proc_entry("x4412_proc", NULL);
  61.     printk("x4412_proc Exit!\n");
  62. }
  63. module_init(x4412_proc_init);
  64. module_exit(x4412_proc_exit);
  65. MODULE_LICENSE("GPL");
复制代码
    程序的开始定义了一个整形变量val,其值为0x55aa,在初始化函数x4412_proc_init中通过create_proc_entry函数创建设备节点x4412_proc,同时指定该节点的读写函数分别为x4412_proc_read和x4412_proc_write。在读函数中,通过sprintf函数将节点内容显示出来,在写函数中,首先通过copy_from_user函数从用户空间读取写入的数据,再通过函数simple_strtoul将读取的字符串转化为整数,最后保存到全局变量val中。这时,我们再调用读函数时,它的值已经更新过来了。
       kernel/drivers/char/x4412/Makefile下增加如下语句:
  1. obj-$(CONFIG_X4412_PROC_DRIVER) += x4412-proc.o
复制代码
       kernel/drivers/char/x4412/Kconfig下增加如下语句:
  1. config X4412_PROC_DRIVER
  2.          tristate "x4412 proc driver"
  3.          default m
  4.          help
  5.          compile for x4412 proc driver,y for kernel,m for module.
复制代码
       编译内核,将会在kernel/drivers/char/x4412目录下生成x4412-proc.ko文件。加载该ko文件后,可以在/proc目录下看到新建的节点x4412_proc,通过cat指令可查看节点的内容,执行界面如下:
  1. root@android:/proc # insmod /mnt/extsd/x4412-proc.ko                     
  2. root@android:/proc # ls x4412_proc -la                                       
  3. -rw-rw-rw- root     root            0 1970-01-02 00:25 x4412_proc
  4. root@android:/proc # cat x4412_proc                                            
  5. 0x55aa
  6. root@android:/proc # echo 0x1234 > x4412_proc                                 
  7. root@android:/proc # cat x4412_proc                                          
  8. 0x1234
  9. root@android:/proc #
复制代码
       通过insmod命令加载驱动后,通过ls命令可以查看到在/proc目录下生成了节点x4412_proc,而且具有可读可写权限。通过cat指令查看该节点的内容为0x55aa,即程序的开始定义的全局变量val的值。通过echo指令给该节点写入一个新的值后,再通过cat指令查看,发现值已经更新过来了,这和我们驱动的目的不谋而合。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-11-23 20:28 , Processed in 0.017590 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表