上節主要說明了proc下的內容,從本節開始解析proc的實現。與普通檔案系統一樣,proc當然需要虛擬檔案系統的支援,所以它必須具備檔案系統的幾個主要的資料結構。
1.proc_dir_entry
在proc檔案系統中,每個entry的例項是由proc_dir_entry來描述的,其結構如下:
struct proc_dir_entry ;大部分元素根據其名字就知道表達的意思。需要注意的get_info,read_proc,write_proc三個介面。
get_info:當使用者向proc檔案讀取的資料小於乙個頁面大小時,可以使用這個函式向使用者返回資料。
read_proc_t *read_proc 和write_proc_t *write_proc:這兩個函式提供了對proc檔案進行操作的簡單介面。我們知道,對於proc檔案,我們可以從中讀取核心資料,還可以向其中寫入資料,因此,對於一些功能比較簡單的proc檔案,我們只要實現這兩個函式(或其中之一)即可,而不用設定inode_operations結構,這樣, 整個操作比較簡單。實際上,我們會在後面的分析中看到,在註冊proc檔案的時候,會自動為proc_fops設定乙個預設的 file_operations結構,如果我們只實現了上面提到的兩個讀寫操作,而沒有設定自己file_operations結構,那麼,會由預設的 inode_operations結構中的讀寫函式檢查呼叫這兩個函式。
2.proc inodes
核心中提供了乙個名為proc_inode的結構來描述proc檔案系統的inode結構。該結構如下:
union proc_op ;
struct proc_inode ;
proc_inode的作用是建立proc的資料與vfs層之間的聯絡。
在該結構中,有幾個比較詭異的地方,首先是最後乙個域是struct inode vfs_inode,
一般情況下乙個結構要建立與另外乙個結構的鏈結,只需乙個指向另外乙個結構的例項的指標,而此處確實乙個結構例項。也就是說proc_inode結構的乙個例項形式如下:
在linux中可以使用container機制獲取proc_inode結構,這是由乙個函式完成的。
static inline struct proc_inode *proc_i(const struct inode *inode)
proc_get_link 和 proc_read函式在乙個union的原因是,在同一時間內只可能使用乙個函式。proc_read用來獲取程序相關的資訊,proc_get_link用來建立指向vfs檔案系統中與程序相關的資料的鏈結。
以上元素的用法和具體含義到後邊與程序相關的資訊一節還會詳細解釋。
原文**:
proc原始碼解析(三) proc初始化
在使用proc之前,我們必須首先初始化並掛載proc,並在核心記憶體中建立資料結構來描述檔案系統。但是,不同的體系結構擁有不同的proc內容,所以,在初始化階段並不完全建立子目錄的內容,有些檔案要等到系統執行時動態建立。proc檔案系統初始化的流程圖如下 proc root init的定義定義如下 ...
proc原始碼解析(三) proc初始化
在使用proc之前,我們必須首先初始化並掛載proc,並在核心記憶體中建立資料結構來描述檔案系統。但是,不同的體系結構擁有不同的proc內容,所以,在初始化階段並不完全建立子目錄的內容,有些檔案要等到系統執行時動態建立。proc檔案系統初始化的流程圖如下 proc root init的定義定義如下 ...
proc原始碼解析(六) proc檔案讀寫函式
前邊說過目錄項建立時一般都使用預設的讀寫函式,本節就來看看預設的檔案操作函式的定義。前邊已經引用過該定義,此處再次引用 static const struct file operations proc file operations proc file read的實現 從proc檔案中讀取資料需要經...