一、proc檔案系統概述
1、proc檔案系統是 核心 和 使用者 互動的一種機制;通過proc檔案系統,可以下使用者態下查看linux核心的一些狀態,也可以通過proc檔案系統對核心做一些配置
比如: 通過 /proc/meminfo,查詢記憶體使用量的情況
二、proc檔案/子目錄 介紹
1、apm : 進階電源管理資訊
2、bus : 匯流排以及匯流排上的裝置
3、devices :可用的設別資訊
4、driver : 已經啟用的驅動資訊
5、interrupts:中斷資訊
6、ioports:連接埠使用資訊
7、version:核心版本
三、proc檔案系統的特點
1、每個檔案都規定了嚴格的許可權:嚴格規定了---可讀?可寫?哪個使用者可讀?哪個使用者可寫
2、可以用文本編輯程式讀取:more、cat、vi等
3、不僅可以有檔案還可以有子目錄
4、可以自己編寫核心程式添加一個 /proc 目錄下的檔案
5、檔案的內容都是動態建立的,並不存在於磁碟上
四、proc檔案系統的操作
1、在proc檔案系統中,一個檔案是由 一個proc_dir_entry的結構體描述的
struct proc_dir_entry{ ... ... read_proc_t * read_proc; //當使用者讀這個proc檔案時,這個回呼函數會被調用 write_proc_t * write_proc; //當使用者寫這個proc檔案時,這個回呼函數會被調用 ... ...}
2、建立一個proc檔案
struct proc_dir_entry * create_proc_entry(const char * name,mode_t mode,struct proc_dir_entry * parent);
==參數:
(1)name:要建立的檔案名稱
(2)mode:要建立的檔案的屬性 預設0755
(3)parent:這個檔案的父目錄,就是說建立的這個檔案要放在哪裡
3、建立目錄
struct proc_dir_entry * proc_mkdir(const char * name,mode_t mode,struct proc_dir_entry * parent);
==參數:
(1)name:要建立的目錄名
(2)parent:這個目錄的父目錄
4、刪除目錄/檔案
void remove_proc_entry(const char * name ,struct proc_dir_entry * parent);
==參數:
(1)name:要刪除的檔案或目錄名
(2)parent:該檔案所在的目錄名
5、讀寫:為了能讓使用者讀寫添加的proc檔案,需要掛接上讀寫回呼函數,即--> read_proc,write_proc
6、讀操作
int read_func(char * buffer,char **stat,off_t off,int count,int * peof,void *data);
==參數:
(1)buff:把要返回給使用者的資訊寫在buffer裡,最大不能超過PAGE_SIZE
(2)stat:一般不用
(3)off:位移量
(4)count:使用者要讀取的位元組數
(5)peof:讀到檔案尾時,需要把*peof置1
(6)data:一般不用
7、寫操作
int write_func(struct file *file,const char * buffer,unsigned long count,void * data);
==參數:
(1)file:該proc檔案對應的file結構,一般忽略
(2)buffer:待寫的資料所在的位置
(3)count:待寫資料的大小
(4)data:一般不用
五、實現一個proc檔案的流程
1、調用create_proc_entry建立一個 struct proc_dir_entry
2、對建立的 struct proc_dir_entry 進行賦值:read_proc,mode,owner,size,write_proc等等
六、proc在開發中的應用:
1、我們可以在驅動中提供一個proc介面,這樣就可以讓使用者來配置驅動程式,對裝置進行配置。這就是一種讓使用者來配置核心的機制