Linux内核之/proc节点

时间:2021-08-06 16:28:34

 

 1.arm-linux-nm:将可执行程序生成对应的符号表,
   arm-linux-as:
 2.使用/proc
 3.看门狗(wdt)定时器驱动

**********************************************************************************
* 在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);