Proc檔案系統

2022-08-20 01:06:13 字數 3917 閱讀 5365

proc檔案系統是一種無儲存的檔案系統,當讀其中的檔案時,其內容動態生成,當寫檔案時,檔案所關聯的寫函式被呼叫。每個proc檔案都關聯的位元組特定的讀寫函式,因而它提供了另外的一種和核心通訊的機制:核心部件可以通過該檔案系統向使用者空間提供介面來提供查詢資訊、修改軟體行為,因而它是一種比較重要的特殊檔案系統。

由於proc檔案系統以檔案的形式向使用者空間提供了訪問介面,這些介面可以用於在執行時獲取相關部件的資訊或者修改部件的行為,因而它是非常方便的乙個介面。核心中大量使用了該檔案系統。proc檔案系統就是乙個檔案系統,它可以掛載在目錄樹的任意位置,不過通常掛載在/proc下,它大致包含了如下資訊:

這些資訊幾乎涵蓋核心的所有部分,因而改檔案系統是了解系統資訊的乙個很重要的部件。由於proc檔案系統的檔案的內容取決於實現該檔案的核心部件,因而各個檔案的實現可能存在很大的不同。

由於proc檔案系統是以檔案的形式存在的,因而我們可以通過cat,echo等命令來直接訪問檔案(當然是在遵循檔案訪問許可權的前提下)

比如我們可以通過「cat /proc/cmdline 」檢視系統的啟動命令

boot_image=/vmlinuz-3.5.0-40-generic root=uuid=80730516-33e7-420e-ae95-7d82bdfadb25 ro quiet splash vt.handoff=7

可以通過「cat /proc/2629/io 」檢視特定程序的io資訊

rchar: 6906149866

wchar: 14016909787

syscr: 5354112

syscw: 10764514

read_bytes: 7827566592

write_bytes: 14870413312

cancelled_write_bytes: 4096

可以通過「echo 7> /proc/sys/kernel/printk」來修改核心的log等級

需要說明的是,雖然使用/proc很方便,但是在linux核心開發中,已經不建議使用它了, 原因在於它的內容太龐雜了,很難管理和理解。

使用proc檔案系統之前必須將其初始化並且掛載到系統中。proc檔案系統的的初始化主要完成:

呼叫proc_init_inodecache建立proc檔案系統所使用的專用緩衝區

呼叫register_filesystem註冊proc檔案系統,這裡會提供proc檔案系統自己的file_system_type,其中包括了用於mount的函式指標。在執行mount的時候會用到這些資訊,並最終找到mount函式進行掛載操作

呼叫proc_mkdir建立一些proc檔案目錄

在sys檔案系統下註冊proc檔案系統的相關資訊

在proc的mount函式中會呼叫proc_fill_super,它會給出proc檔案系統超級塊所需要的資訊(比如檔案系統的超級塊操作函式指標,超級塊大小等),並且會建立proc檔案系統的根目錄,在建立根目錄時也會指定與之對應的inode_operations和file_operations,有了這些資訊後,vfs就可以在該檔案系統上進行各種操作了(建立、刪除、查詢檔案)。

proc檔案及目錄在核心中用proc_dir_entry來表示。它在proc檔案系統內部包含了proc檔案的所有資訊。其資料結構如下所示:

struct proc_dir_entry ;  

核心還提供了乙個資料結構proc_inode用於將特定於proc的資料與檔案所對應的inode關聯起來,其定義如下:

struct proc_inode ;  

借助該資料結構,核心可以方便的在inode和與該inode相關的proc資料之間進行轉換。

struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);

該函式用於在proc檔案系統中建立乙個目錄項,大多數時候,當我們期望實現自己的proc檔案時,都要先建立乙個自己的目錄,然後在該目錄裡建立自己的檔案,當然我們也可以直接在已經存在的proc檔案系統目錄裡建立自己的檔案。

該函式的各個引數含義如下:

void proc_remove(struct proc_dir_entry *de);

該函式用於刪除乙個目錄。

struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops);

該函式用於在proc檔案系統中建立乙個proc檔案,其引數含義如下:

這些引數提供了乙個檔案所需要的關鍵資訊,包括檔名,訪問模式,目錄項(用於指定檔案在檔案系統中的位置),以及檔案操作指標。

當要刪除乙個檔案時,需要使用api:

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

引數的含義是顯然的,該函式用於從proc檔案系統的指定目錄刪除指定的proc檔案。還有一些其它的api,都定義在include/linux/prof_fs.h中。

在proc檔案系統中建立檔案或者目錄時,最終都會調到proc_register,該函式會為新建立的檔案或目錄指定正確的file_operations和inode_operations,它們將在訪問檔案時被使用。

首先要開啟檔案,對於proc檔案系統來說,它要做的是:找到檔案的,在找到檔案後檔案資料結構的的file_operations會被初始化為檔案的inode中的file_operations(參考路徑do_filp_open->path_openat->do_last->nameidata_to_filp->__dentry_open->fops_get)。之後就可以呼叫檔案的開啟操作了。

寫檔案,這一步也很簡單, 檔案資料結構中的寫操作即可。

這個過程也很好理解, 因為對於任何檔案系統,它們都存在inode,inode被用來表示乙個檔案,它包含了很多有用的資訊,它用於維護檔案自身而不涉及檔案的內容。對於儲存在儲存器上的檔案系統,其inode的有些資訊是儲存在儲存器上的,但是仍有一部分是動態生成的;對於無儲存器的檔案系統,比如proc檔案系統,其inode都是動態生成的。再使用乙個檔案時,其inode就會被載入到記憶體中以供使用,如果還不存在相關的inode,則就會建立乙個新的。每個檔案系統的超級塊的super_operations包含了為本檔案系統建立和刪除inode節點的函式指標,在inode的操作函式集中包含了操作inode節點的函式指標,其中包括了查詢inode節點的函式。開啟乙個檔案時,如果inode緩衝中還沒有該檔案的inode,則經vfs處理後最終會呼叫lookup_real,它會呼叫inode操作函式集中的lookup函式用於查詢所要開啟的檔案的inode;如果該檔案的inode已經存在則會從快取中得到該檔案對應的inode,這部分工作由do_lookup完成。

簡單的說,檔案操作第一步時找到inode資訊(如果沒有就建立並初始化),然後用inode資訊初始化檔案的file結構。再用file結構對檔案進行操作。

對於/proc/sys目錄,該目錄在proc_sys_init中被建立:

int __init proc_sys_init(void)  

然後在使用該目錄下的檔案時,需要先找到該檔案對應的inode,使用inode_operations中的lookup函式即proc_sys_lookup:

static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry,  

struct nameidata *nd)  

而sysctl_table_root即為/proc/sys對應的ctl_table_root結構,它儲存了/proc/sys下內容的入口資訊,register_sysctl_paths用於向/proc/sys新增內容,/proc/sys/net等等就是通過該呼叫新增到/proc/sys下的,然後通過lookup函式即可找到起對應的內容(比如ctl_table_header)。

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檔案的內容時,會呼叫核心的函式,從而改變核...