一. 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信息