使用/proc 调试

来源:互联网 发布:松下空调 知乎 编辑:程序博客网 时间:2024/05/01 00:35


2015年 11月 25日 星期三 13:43:12 CST

=============================================================================
使用/proc

在linux系统中,/proc文件系统它被用于内核向用户导出信息。/proc文件系统是
一个虚拟文件系统,通过它可以使用一种新的方法在linux内核空间和用户空间之间
进行通信。在/proc文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行
通信的一种手段,与普通文件不同的是,这些虚拟文件的内容都是动态创建的。
=============================================================================

一:
在linux系统中,可用如下函数创建/proc节点:
函数所在的头文件声明:xx/include/linux/proc_fs.h

************
struct proc_dir_entry *create_proc_entry(const char *name,
        mode_t mode, struct proc_dir_entry *parent);
************
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目录:
struct proc_dir_entry *proc_mkdir(const char *name,
        struct proc_dir_entry *parent);

三:
    上述创建/proc节点和/proc目录的函数的返回值为如下结构体:
    struct proc_dir_entry
    {
        ...
        read_proc_t *read_proc;
            write_proc_t *write_proc;
        ...    
    };
    
    proc_dir_entry结构体中包含了/proc节点的读函数指针 read_proc_t*read_proc;
    写函数指针write_proc_t *write_proc;以及父节点,子节点信息等。
    
    ************************
    /proc节点的读写函数的类型分别为:
    typedef int (read_proc_t)(char *page, char **start, off_t off,
                          int count, int *eof, void *data);
    
    typedef int (write_proc_t)(struct file *file, const char __user *buffer,
                           unsigned long count, void *data);
    
    *读函数中page指针指向用于写入数据的缓冲区,start用于返回实际的数据写到内存
     页的位置,eof是用于返回读结束标志,offset是读的偏移,count是要读的数据长
     度。
        start参数比较复杂,对于/proc只包含简单数据的情况,通常不需要在读函数
     中设置*start,意味着内核将认为数据保存在内存页偏移0的地方。如果将*start
     设置为非0值,意味着内核将认为*start指向的数据是offset偏移处的数据*
    
    *写函数与file_operations中的write()成员类似,需要一次从用户缓冲区到内存空
     间的复制过程                                 *

四:
    linux系统中可用如下函数删除/proc节点:

    void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
0 0
原创粉丝点击