1. 程式人生 > >Linux核心中的Proc檔案系統(一)

Linux核心中的Proc檔案系統(一)

(1)/proc檔案系統的特點和/proc檔案的說明
/proc檔案系統是一種特殊的、由軟體建立的檔案系統,核心使用它向外界匯出資訊,/proc系統只存在記憶體當中,而不佔用外存空間。
/proc下面的每個檔案都綁定於一個核心函式,使用者讀取檔案時,該函式動態地生成檔案的內容。也可以通過寫/proc檔案修改核心引數
(2)/proc目錄下的檔案分析
/proc/$pid 
關於程序$pid的資訊目錄。每個程序在/proc 下有一個名為其程序號的目錄。例:

$>strings -f /proc/[0-9]*/cmdline

/proc/cmdline
核心啟動的命令列
/proc/cpuinfo 
處理器資訊,如型別、製造商、型號和效能。 
/proc/devices 
列出字元和塊裝置的主裝置號,以及分配到這些裝置號的裝置名稱
/proc/dma 
顯示當前使用的DMA通道。 
/proc/filesystems 
列出了可供使用的檔案系統型別,通常是編入核心的檔案系統型別,但可以通過模組加入新的型別
/proc/interrupts
顯示使用的中斷號,中斷名稱,以及這些中斷從系統啟動後產生的次數
/proc/ioports 
當前使用的I/O埠。 
/proc/kallsyms 
核心符號表。安裝新的模組後,會在這裡體現出來 
/proc/kcore 
系統實體記憶體映象。與實體記憶體大小完全一樣,但不實際佔用這麼多記憶體;(記住:除非拷貝到檔案中,/proc下沒有任何東西佔用任何磁碟空間) 
/proc/kmsg 
核心輸出的訊息。也被送到syslog。 
/proc/loadavg 
系統的平均負載,前3個是過去1分鐘,5分鐘,15分鐘的負載,然後是正在執行的任務數和總任務數,最後是上次執行的程序號
/proc/meminfo 
儲存器使用資訊,包括實體記憶體和swap。 
/proc/modules 
當前載入了哪些核心模組。 
/proc/partitions
系統當前掛載硬碟的分割槽資訊
/proc/pci
系統的pci匯流排資訊
/proc/net 
網路協議狀態資訊。 
/proc/self 
到檢視/proc的程式的程序目錄的符號連線。當2個程序檢視/proc時,是不同的連線。這主要便於程式得到它自己的程序目錄。
/proc/slabinfo
系統中slab快取的分配資訊
/proc/stat 
系統的一些狀態資訊
/proc/swaps
系統採用的交換區資訊
/proc/sysrq-trigger
用於啟動sysRq鍵
$>echo 1 > sysrq-trigger
/proc/uptime
系統啟動的時間長度和空閒的時間長度。供uptime使用
/proc/version 

核心版本

(3)自行實現一個/proc檔案

需包含標頭檔案<linux/proc_fs.h>,函式定義在/fs/proc/generic.c
a.在/proc下建立目錄
呼叫:
struct proc_dir_entry *proc_mkdir(const char *name,

struct proc_dir_entry *parent)

在/proc下建立檔案:

struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
struct proc_dir_entry *parent)


struct proc_dir_entry *create_proc_read_entry(
        const char *name,
        mode_t mode, 
        struct proc_dir_entry *base,
        read_proc_t *read_proc, 
        void * data)
b.解除安裝/proc下的檔案
採用remove_proc_entry解除安裝proc檔案
void remove_proc_entry(
        const char *name, 
        struct proc_dir_entry *parent);
c.定義返回資料的函式
在程序讀取/proc檔案時,核心會分配一個記憶體頁(即PAGE_SIZE個位元組的記憶體塊),驅動將要寫的資料通過這個記憶體頁返回到使用者空間。
typedef int (read_proc_t)(char *page, char **start, off_t off,
int count, int *eof, void *data);

思考一下,它還可以有什麼作用?

在實際工作中,一般由原廠提供的驅動,有一部分廠商會在proc下建立對應的目錄,用proc檔案系統來進行管理,比如:現在有一家觸控式螢幕驅動的廠商,他們寫的驅動的版本號,一般就會放在proc目錄下對應廠商的目錄,然後建立一個類似/proc/version的檔案,在應用層,通過cat  /proc/xxxx/version就可以獲取到該廠商觸控式螢幕驅動的版本資訊。

下一節,我們將結合4412來實現一下。