[linux device driver] Chapter 04:使用/proc文件系统查询调试

来源:互联网 发布:s7总决赛 知乎 编辑:程序博客网 时间:2024/05/15 22:32
首先看代码:

scull的read proc方法

int scull_read_procmem(char *buf, char **start, off_t offset,   int count, int *eof, void *data){int i, j, len = 0;int limit = count - 80; /* Don't print more than this */for (i = 0; i < scull_nr_devs && len <= limit; i++) {struct scull_dev *d = &scull_devices[i];struct scull_qset *qs = d->data;if (down_interruptible(&d->sem))return -ERESTARTSYS;len += sprintf(buf+len,"\nDevice %i: qset %i, q %i, sz %li\n",i, d->qset, d->quantum, d->size);for (; qs && len <= limit; qs = qs->next) { /* scan the list */len += sprintf(buf + len, "  item at %p, qset at %p\n",qs, qs->data);if (qs->data && !qs->next) /* dump only the last item */for (j = 0; j < d->qset; j++) {if (qs->data[j])len += sprintf(buf + len,"    % 4i: %8p\n",j, qs->data[j]);}}up(&scull_devices[i].sem);}*eof = 1;return len;}
通过上述函数,scull将数据输出到用户可见的/proc文件夹下的某个文件。
那么如何在/proc中实现相应的文件呢?通过调用内核定义的创建proc函数可以实现:

static inline 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){struct proc_dir_entry *res=create_proc_entry(name,mode,base);if (res) {res->read_proc=read_proc;res->data=data;}return res;}

那么scull是如何结合两者呢?代码如下:

static void scull_create_proc(void){struct proc_dir_entry *entry;create_proc_read_entry("scullmem", 0 /* default mode */,NULL /* parent dir */, scull_read_procmem,NULL /* client data */);entry = create_proc_entry("scullseq", 0, NULL);if (entry)entry->proc_fops = &scull_proc_ops;}
这样就会在/proc目录下创建一个scullmem文件,当用户读取它的时候会调用scull_read_procmem,输出相应的数据。

如果要删除该文件,可以调用这个函数:
static void scull_remove_proc(void){/* no problem if it was not registered */remove_proc_entry("scullmem", NULL /* parent dir */);remove_proc_entry("scullseq", NULL);}



0 0
原创粉丝点击