樹莓派的內核模塊編程之proc文件系統

樹莓派的內核模塊編程之proc文件系統

引言

在linux系統中,/proc目錄下的文件提供了linux系統在運行過程中的相關信息,但/proc是虛擬文件系統,只存儲在內存中。/proc文件系統也是實現內核空間與用戶空間通信的重要方式,因此本文對/proc文件系統進行講解。

一、proc文件系統介紹

proc文件和我們熟悉的文檔文件不同,我們通常所用的文檔文件存儲在外存中,也就是硬盤或者優盤中,其中所存儲的數據不會隨著斷電而丟失;而proc文件存儲在內存中,其中所存儲的數據斷電後即會被刪除。用戶可以通過proc文件得到與系統相關的信息以及正在運行的進程信息。下圖是/proc目錄下的文件內容:

樹莓派的內核模塊編程之proc文件系統

從上圖我們可以看到,/proc目錄下有兩種文件名,一種是以數字命名的文件,還有一種是以字母命名的文件。以數字命名的文件存儲了對應進程號的信息,字母命名的文件存儲了系統相關信息。例如,/proc/sys/kernel/hostname存儲了主機名稱,我們可以使用cat命令訪問,使用方法如下:

樹莓派的內核模塊編程之proc文件系統

二、proc文件系統模塊編程

proc文件系統的編程與字符設備編程類似,首先都要創建一個proc文件,隨後通過定義file_operations結構體定義文件操作函數,最後定義proc文件移除操作。

在之前內核版本中可以使用create_proc_entry()函數,但在當前內核版本中,創建一個proc文件只能使用proc_create()函數。proc_create()函數原型如下:

static inline structproc_dir_entry *proc_create( const char *name, umode_t mode, structproc_dir_entry *parent, const struct file_operations *proc_fops)

上述函數中,name參數就是要創建的proc文件名;mode參數表示proc文件的訪問權限,採用UGO的方式表示;parent參數所要建立的proc文件的父文件夾,通常該參數設置為NULL;proc_fops參數是文件的操作函數。

如果要清除所創建的proc文件,則需要使用remove_proc_entry()函數。remove_proc_entry()函數原型如下:

void remove_proc_entry(const char*name, struct proc_dir_entry *parent)

name參數和parent參數均與proc_create()一樣。

為了讓我們創建的proc文件具有讀寫功能,我們需要通過file_operations結構體來為proc文件定義讀寫函數,這裡與字符設備驅動編程相同,具體內容可以參考之前發佈的文章《樹莓派的內核模塊編程之字符設備驅動器》。

三、程序示例

本文所使用的代碼可通過如下鏈接下載:

鏈接:https://pan.baidu.com/s/12bTIwh-dJ08YPdp2xx7UFg

提取碼:6q8p

樹莓派的內核模塊編程之proc文件系統

如上圖所示,將下載的代碼保存在一個文件夾內。

隨後進入該文件夾,執行以下命令來編譯與安裝內核模塊:

樹莓派的內核模塊編程之proc文件系統

隨後查看/proc目錄,我們會發現該目錄下多了個PROCTEST文件,這就是我們通過代碼生成的proc文件,如下圖所示:

樹莓派的內核模塊編程之proc文件系統

隨後我們需要修改PROCTEST文件的權限,並對其做讀寫操作,命令如下圖所示:

樹莓派的內核模塊編程之proc文件系統

最後我們需要卸載該模塊,命令如下:

樹莓派的內核模塊編程之proc文件系統


分享到:


相關文章: