proc原始碼解析(六) proc檔案讀寫函式

2021-06-09 14:52:51 字數 1579 閱讀 3902

前邊說過目錄項建立時一般都使用預設的讀寫函式,本節就來看看預設的檔案操作函式的定義。前邊已經引用過該定義,此處再次引用:

static const struct file_operations proc_file_operations = ;

proc_file_read的實現

從proc檔案中讀取資料需要經歷三個步驟

1.申請記憶體頁用於儲存資料

2.呼叫檔案相關的函式填充步驟1申請的記憶體頁

3.把資料從核心空間拷貝到使用者空間

很明顯,步驟2至關重要,因為這一步正是準備資料。在二.proc資料結構一節我們已經注意到struct proc_dir_entry中提供了兩個用於讀取資料的函式指標,get_info和read_proc,在proc_file_read中就需要根據不同情況選取二者其一。閒言少敘,上**說話。一如既往,**是經過簡化的。

static ssize_t proc_file_read(struct file *file, char __user *buf,

size_t nbytes, loff_t *ppos)

else if (dp->read_proc) else

break;

。。。//步驟3,將資料從核心空間拷貝到使用者空間

n -= copy_to_user(buf, start < page ? page : start, n);

。。。}

free_page((unsigned long) page);

return retval;

} 這裡有乙個函式需要說明一下,看**中紅色部分

dp = pde(inode) ;這個pde函式的實現如下:

static inline struct proc_dir_entry *pde(const struct inode *inode)

這個proc_i函式是不是很熟悉?呵呵,不錯,這不正是第二節中使用container機制獲取proc_inode結構使用的那個函式麼?現在該明白上邊介紹那個函式的用途了吧。

這種閹割後的**便於理解程式的大致流程,但是省略了很多邊界檢查,如果需要,請參考核心源**。

proc_file_write的實現

相比而言proc_file_write的實現相對簡單些,這裡就不再解釋了,直接上**,明白了proc_file_read函式,這個應該很容易就能讀懂。

static ssize_t proc_file_write(struct file *file,  const char __user *buffer,size_t count, loff_t *ppos)

proc_file_lseek實現

這個函式的實現就直接在**中注釋了

static loff_t proc_file_lseek(struct file *file, loff_t offset, int orig)

return retval;

} 到此為止,proc的管理函式就分析完畢了,核心原始碼中有乙個例子documentation/docbook/procfs_example.c,就是為了說明這節分析的內容。

proc原始碼解析(六) proc檔案讀寫函式

前邊說過目錄項建立時一般都使用預設的讀寫函式,本節就來看看預設的檔案操作函式的定義。前邊已經引用過該定義,此處再次引用 static const struct file operations proc file operations proc file read的實現 從proc檔案中讀取資料需要經...

proc原始碼解析(三) proc初始化

在使用proc之前,我們必須首先初始化並掛載proc,並在核心記憶體中建立資料結構來描述檔案系統。但是,不同的體系結構擁有不同的proc內容,所以,在初始化階段並不完全建立子目錄的內容,有些檔案要等到系統執行時動態建立。proc檔案系統初始化的流程圖如下 proc root init的定義定義如下 ...

proc原始碼解析(三) proc初始化

在使用proc之前,我們必須首先初始化並掛載proc,並在核心記憶體中建立資料結構來描述檔案系統。但是,不同的體系結構擁有不同的proc內容,所以,在初始化階段並不完全建立子目錄的內容,有些檔案要等到系統執行時動態建立。proc檔案系統初始化的流程圖如下 proc root init的定義定義如下 ...