一. Proc文件系统简介
Proc文件系统是一种无存储的文件系统,当读其中的文件时,其内容动态生成,当写文件时,文件所关联的写函数被调用。每个Proc文件都关联特定的读写函数,因而它提供了另外的一种和内核通信的机制:内核部件可以通过该文件系统向用户空间提供接口来提供查询信息、修改软件行为,因而它是一种比较重要的特殊文件系统。
二. SylixOS中Proc文件系统的内容
由于Proc文件系统以文件的形式向用户空间提供了访问接口,这些接口可以用于在运行时获取相关部件的信息或者修改部件的行为,因而它是非常方便的一个接口。内核中大量使用了该文件系统。Proc文件系统可以挂载在目录树的任意位置,不过通常挂载在/proc下,它大致包含了如下信息:
- 内存管理;
- 每个进程的相关信息;
- 文件系统;
- 设备驱动程序;
- 系统总线;
- 电源管理;
- 终端;
- 系统控制参数;
- 网络。
这些信息几乎涵盖内核的所有部分,因而改文件系统是了解系统信息的一个很重要的部件。由于Proc文件系统的文件的内容取决于实现该文件的内核部件,因而各个文件的实现可能存在很大的不同。
由于Proc文件系统是以文件的形式存在的,因而我们可以通过cat命令来直接访问文件(当然是在遵循文件访问权限的前提下)。
SylixOS中Proc文件系统目前只支持读操作,不支持写操作。
三. Proc文件系统的初始化
使用Proc文件系统之前必须将其初始化并且挂载到系统中。Proc文件系统的初始化主要通过创建字符设备完成。
- 调用API_ProcFsDrvInstall安装procfs文件系统驱动程序,Proc文件系统提供了open、close、read、write、statget、ioctl和readlink等函数;
- 调用API_ProcFsDevCreate创建proc设备,同时初始化Proc文件系统的各个组件。
四. Proc文件系统数据结构
Proc文件系统使用结构体PLW_PROCFS_NODE_OP来向内核提供传输函数集合,其详细描述如程序清单 4.1所示。
程序清单 4.1 传输函数集
#include <SylixOS.h> typedef struct lw_procfs_node_op { SSIZETFUNCPTR PFSNO_pfuncRead; /* 读操作函数 */ SSIZETFUNCPTR PFSNO_pfuncWrite; /* 写操作函数 */ } LW_PROCFS_NODE_OP; typedef LW_PROCFS_NODE_OP *PLW_PROCFS_NODE_OP;
- PFSNO_pfuncRead:读操作函数,上层读取Proc文件系统时会直接调用此函数获取数据;
- PFSNO_pfuncWrite:写操作函数,上层向Proc文件系统写入数据时会直接调用此函数。
Proc文件系统使用结构体PLW_PROCFS_NODE_MSG来向内核提供proc节点信息,其详细描述如程序清单 4.2所示。
程序清单 4.2 proc节点信息
#include <SylixOS.h> typedef struct lw_procfs_node_message { PVOID PFSNM_pvValue; /* 文件相关私有信息 */ off_t PFSNM_oftPtr; /* 文件当前指针 */ /* 节点驱动程序不要处理此变量! */ /* * SylixOS 系统的 proc 文件系统主要用于显示操作系统内核状态, 信息量非常少. * 所以这里使用简单的缓冲结构, 而没有使用多页面缓冲. */ PVOID PFSNM_pvBuffer; /* 文件内存缓冲 */ /* (必须初始化为 NULL) */ size_t PFSNM_stBufferSize; /* 文件当前缓冲大小 */ size_t PFSNM_stNeedSize; /* 预估的需要缓冲的大小 */ size_t PFSNM_stRealSize; /* 文件真实大小 */ /* (由节点驱动程序确定) */ } LW_PROCFS_NODE_MSG; typedef LW_PROCFS_NODE_MSG *PLW_PROCFS_NODE_MSG;
- PFSNM_pvValue:文件相关私有信息;
- PFSNM_oftPtr:文件当前指针,节点驱动程序不要处理此变量;
- PFSNM_pvBuffer:文件内存缓冲;
- PFSNM_stBufferSize:文件当前缓冲大小;
- PFSNM_stNeedSize:预估的需要缓冲的大小;
- PFSNM_stRealSize:文件真实大小,由节点驱动程序确定。
五. Proc文件系统API
SylixOS提供__procFsFindNode接口查找一个节点;
SylixOS提供API_ProcFsMakeNode接口创建一个节点;
SylixOS提供__procFsRemoveNode接口删除一个节点;
SylixOS提供API_ProcFsRemoveNode接口删除一个节点,此API可能产生推迟删除;
SylixOS提供API_ProcFsAllocNodeBuffer接口为一个节点开辟缓存;
SylixOS提供API_ProcFsFreeNodeBuffer接口释放节点缓存;
SylixOS提供API_ProcFsNodeBufferSize接口获得节点缓存大小;
SylixOS提供API_ProcFsNodeBuffer接口获得节点缓存指针;
SylixOS提供API_ProcFsNodeMessageValue接口获得节点信息私有数据指针;
SylixOS提供API_ProcFsNodeSetRealFileSize接口设置实际的BUFFER大小;
SylixOS提供API_ProcFsNodeGetRealFileSize接口获取实际的BUFFER大小。
六. 文件操作过程
SylixOS中可以通过cat命令查看Proc文件系统中保存的信息。
比如,Proc文件系统中提供的cpuinfo可以用来获取CPU信息,如图 6.1所示。
图 6.1 /prco/cpuinfo信息