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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2014-12-12 17:16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在linux系统中,proc文件系统可以用于内核向用户导出信息。proc文件系统是一个虚拟的文件系统,它可以完全有别于IOCTL,实现linux内核空间与应用空间之间的通信。在proc文件系统中,我们可以对虚拟文件的读写作为与内核中实体进行通信的一种手段,与普通文件不同的是,这些文件都是动态创建的。
我们可以通过如下函数在/proc路径下创建节点:
  1. struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent);
  2. struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode,struct proc _ dir _ entry *base, read _ proc _ t *read _ proc,void * data);
复制代码
create_proc_entry()函数用于创建/proc 节点,而create_proc_read_entry()调用create_proc_entry()创建只读的/proc节点。参数name为/proc节点的名称,parent/base为父目录的节点,如果为NULL,则指/proc目录,read_proc是/proc节点的读函数指针。当read()系统调用在/proc文件系统中执行时,它映像到一个数据产生函数,而不是一个数据获取函数。
下列函数用于创建/proc 目录:
  1. struct  proc_dir_entry  *proc_mkdir(const  char  *name,  struct  proc_dir_entry *parent);
复制代码
如下函数删除/proc节点:
  1. void  remove_proc_entry(const char *name, struct proc_dir_entry  *parent);
复制代码
Linux系统中已经定义好的可使用的/proc节点宏包括:proc_root_fs(/proc)、proc_net (/proc/net)、proc_bus(/proc/bus)、proc_root_driver(/proc/driver)等,proc_root_fs实际就是NULL。
       这里通过实例讲述create_proc_read_entry函数的用法。在kernel/drivers/char/x4412目录下新建x4412-read-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 char str[] = "www.9tripod.com";
  7. ssize_t x4412_proc_read(char *buf, char **start, off_t offset, int count, int *eof, void *data)
  8. {
  9.     int len = 0;
  10.     len = sprintf(buf, "%s\r\n",str);
  11.     *eof = 1;
  12.     return len;
  13. }
  14. static int __init x4412_proc_init(void)
  15. {
  16.          create_proc_read_entry("x4412-read-proc",0,NULL,x4412_proc_read,NULL);
  17.      printk("x4412_proc Init!\n");
  18.      return 0;
  19. }
  20. static void __exit x4412_proc_exit(void)
  21. {
  22.     remove_proc_entry("x4412-read-proc", NULL);
  23.     printk("x4412_proc Exit!\n");
  24. }
  25. module_init(x4412_proc_init);
  26. module_exit(x4412_proc_exit);
  27. MODULE_LICENSE("GPL");
复制代码
       在程序的开头定义了一个字符串数组str,在初始化函数x4412_proc_init中调用create_proc_read_entry函数在/proc下创建一个名为x4412-read-proc的只读的节点,并关联到读函数x4412_proc_read中,在读函数中通过sprintf函数将字符串数组str打印出来。
       kernel/drivers/char/x4412/Makefile下增加如下语句:
  1. obj-$(CONFIG_X4412_READ_PROC_DRIVER) += x4412-read-proc.o
复制代码
       kernel/drivers/char/x4412/Kconfig下增加如下语句:
  1. config X4412_READ_PROC_DRIVER
  2.          tristate "x4412 read proc driver"
  3.          default m
  4.          help
  5.          compile for x4412 read proc driver,y for kernel,m for module.
复制代码
       编译内核,将会在kernel/drivers/char/x4412目录下生成x4412-read-proc.ko文件。加载该ko文件后,可以在/proc目录下看到新建的节点x4412-read-proc,通过cat指令可查看节点的内容,执行界面如下:
  1. insmod  /mnt/extsd/x4412-read-proc.ko                                                   
  2. x4412_proc Init!
  3. root@android:/proc # ls x4412-read-proc                                       
  4. x4412-read-proc
  5. root@android:/proc # cat x4412-read-proc                                       
  6. www.9tripod.com
  7. root@android:/proc #
  8. root@android:/proc # echo abc > x4412-read-proc                              
  9. 1|root@android:/proc # cat x4412-read-proc                                    
  10. www.9tripod.com
  11. root@android:/proc #
复制代码
       首先通过insmod指令加载ko文件,然后通过ls指令可以查看到/proc目录下存在新建的文件节点x4412-read-proc。通过cat指令可以查看里面的内容为程序最前面声明的数组内容,即www.9tripod.com。我们尝试通过echo指令给该文件写入数据abc,再查看文件里面的内容时,发现内容并没有改变,说明该文件只具备读的权限。

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 13:22 , Processed in 0.018744 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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