proc檔案系統簡介
最初開發/proc 檔案系統是為了提供有關系統中程序的資訊。但是由於這個檔案系統非常有用,因此核心中的很多元素也開始使用它來報告資訊,或啟用動態執行時配置。
/proc 檔案系統包含了一些目錄(用作組織資訊的方式)和虛擬檔案。虛擬檔案可以向使用者呈現核心中的一些資訊,也可以用作一種從使用者空間向核心傳送資訊的手段。實際上我們並不會同時需要實現這兩點,但是本文將向您展示如何配置這個檔案系統進行輸入和輸出。
順便說一下,/proc 檔案系統並不是gnu/linux 系統中的惟一乙個虛擬檔案系統。在這種系統上,sysfs
是乙個與/proc 類似的檔案系統,但是它的組織更好(從/proc 中學習了很多教訓)。不過/proc 已經確立了自己的地位,因此即使sysfs 與/proc 相比有一些優點,/proc 也依然會存在。還有乙個 debugfs
檔案系統,不過(顧名思義)它提供的更多是除錯介面。debugfs 的乙個優點是它將乙個值匯出給使用者空間非常簡單(實際上這不過是乙個呼叫而已)。
核心模組簡介
可載入核心模組(lkm )是用來展示/proc 檔案系統的一種簡單方法,這是因為這是一種用來動態地向linux 核心新增或刪除**的新方法。lkm 也是linux 核心中為裝置驅動程式和檔案系統使用的一種流行機制。
如果您曾經重新編譯過linux 核心,就可能會發現在核心的配置過程中,有很多裝置驅動程式和其他核心元素都被編譯成了模組。如果乙個驅動程式被直接編譯到了核心中,那麼即使這個驅動程 序沒有執行,它的**和靜態資料也會佔據一部分空間。但是如果這個驅動程式被編譯成乙個模組,就只有在需要記憶體並將其載入到核心時才會真正占用記憶體空間。 有趣的是,對於lkm 來說,我們不會注意到有什麼效能方面的差異,因此這對於建立乙個適應於自己環境的核心來說是一種功能強大的手段,這樣可以根據可用硬體和連線的裝置來載入 對應的模組。
核心程式設計師可以使用的標準api ,lkm 程式設計師也可以使用。lkm 甚至可以匯出核心使用的新變數和函式。有關api 的完整介紹已經超出了本文的範圍,因此我們在這裡只是簡單地介紹後面在展示乙個更有用的lkm 時所使用的幾個元素。
一篇好文章:
建立proc 檔案
struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent);
name: 要建立的檔名稱;
mode: 該檔案的保護掩碼;
parent: 確定檔案所在目錄,如果置null ,則位置為/proc 下。
2、
proc_mkdir
建立目錄
/* 該函式在父目錄parent 下建立乙個目錄name* */
struct proc_dir_entry * proc_mkdir (const char *name,struct proc_dir_entry *parent);
@name : 要建立的目錄名
@parent : 這個目錄的父目錄
3、
proc
路徑快捷變數
proc_dir_entry 在檔案系統中的位置
proc_root_fs /proc
proc_net /proc/net
proc_bus /proc/bus
proc_root_driver /proc/driver
4、remove_proc_entry
刪除檔案或目錄
/* 這個函式從proc 檔案系統中刪除乙個檔案或目錄。
* 注意:1 。是通過引數name ,而不是通過建立時返回的指標來刪除的。
* 2 。該函式不會遞迴刪除目錄下的檔案。
* 3 。data 變數儲存了分配的記憶體,要先釋放對應記憶體,再刪除該檔案。
* */
void remove_proc_entry (const char *name,struct proc_dir_entry *parent);
@name : 要刪除的檔案或目錄名
@parent : 所在的父目錄
5、
create_proc_read_entry
建立唯讀proc 檔案
struct proc_dir_entry * create_proc_read_entry (const char
*name,mode_t mode,struct proc_dir_entry *parent,read_proc_t*
read_proc,void *data);
@name : 要建立的檔名
@mode : 要建立的檔案的屬性 預設0755
@parent : 這個檔案的父目錄
@read_proc : 當使用者讀這個檔案時,核心呼叫的函式
@data : 傳給read_proc 的引數
6、
read_func
讀函式
int read_func (char *buffer,char **stat,off_t off,int count,int *peof,void *data);
@buffer : 把要返回給使用者的資訊寫在buffer 裡,最大不超過page_size (一般4k )
@stat : 一般不使用
@off :buffer 的偏移量
@count : 使用者要取的位元組數
@peof : 讀到檔案尾時,把peof 指向的位置置1
@data : 被多個proc 檔案定義為讀時,通過data 傳遞引數
注意:返回值必須是sprintf 返回的長度值,如果返回0 在讀取的時候會讀不到結果。
7
、寫函式write_func
/* 該函式最多從buffer 中讀取count 個位元組的資料。
* 注意:buffer 位址在使用者空間,需要先用copy_from_user() 把這些資料拷貝到核心中。* */
int write_func (struct file *file,const char *buffer,unsigned long count,void *data);
@file : 該proc 檔案對應的file 結構,一般忽略。
@buffer : 待寫的資料所在的位置
@count : 待寫資料的大小
@data : 同read_func
注意:返回值應該是實際寫入的字串長度。
檔案gx_proc.c
makefile檔案:
Proc檔案系統
include static struct proc dir entry proc null int read proc char page,char start,off t off,int count,int eof,void data len sprintf page len,debug mod...
proc檔案系統
linux 將一切事物都看成檔案,硬體裝置在檔案系統中也有相應的條目。我們使用底層系統呼叫這樣一種特殊方式通過 dev目錄中的檔案來訪問硬體。控制硬體的軟體驅動程式通常可以以某種特定方式配置,或者能夠報告相關資訊。用於與裝置驅動程式進行通訊的工具在過去就已經十分常見,近來年,傾向於提供更一致的方式來...
proc檔案系統
proc檔案系統是由核心實現的檔案系統。當使用者態訪問 proc下檔案時,實際上是呼叫核心中和該檔案對應的特定函式。一般用proc檔案來實現核心 驅動的呼叫。大部分proc檔案是唯讀的,用於獲取核心資訊 還有一些proc檔案是可寫的,當使用者態改變了proc檔案的內容時,會呼叫核心的函式,從而改變核...