tech-sjh

2010年5月28日 星期五

linux kernel read_proc() in procfs

在 ~linux/fs/proc/generic.c 中找 __proc_file_read() 的實作
可以看到相關說明:

/*
* How to be a proc read function
* ------------------------------
* Prototype:
* int f(char *buffer, char **start, off_t offset,
* int count, int *peof, void *dat)
*
* Assume that the buffer is "count" bytes in size.
*
裡面有三種讀 read_proc 的方式說明,底下就是說明的程式碼,
也可以搜尋其他 driver使用 read_proc 的範例。
比如 ~linux/drivers/char/efirtc.c。
*/
n = dp->read_proc(page, &start, *ppos,
count, &eof, dp->data);
...


這邊是當 kernel 讀取 proc 檔呼叫 driver read_proc callback 的
地方,也就是用法。因此可以倒推回去我們的 callback function
如何實作:

第一種是 driver 要回傳的資料量小於 read_proc 中的 buffer size(PAGE_SIZE)。
此時不管 *start,將 driver 要傳給 filesystem 的資料擺在 buffer 的 offset 位置,
我們只看 offset 跟上次 callback 讀到的 buffer size, n 的差值,
在接到的 offset 跟剩餘要傳的 n 差值(n - offset) 為零時,告知
filesystem 我們的 driver 已經傳完資料,才設定 *peof = 1;
否則繼續 callback。

第三種跟第一種一樣,只是把 offset 代換成 *start

第二種是當你有大量資料要傳輸時使用。
將 *start 設定為介於 buffer 跟零 之間的值,資料是從 buffer 起始位址
開始填,return 每次要填的資料長度,如果你的資料還沒填完,第二次
進入 read_proc 時 offset 值會增加 *start 的長度,直到你填完資料後再
設定 *peof = 1; 就可以完成傳輸大量資料了。

相關連結:

procfs-guide.pdf 3.1 Reading data

linux kernel source:
~linux/fs/proc/generic.c
~linux/drivers/char/efirtc.c

Linux Modules (3) - procfs

沒有留言:

張貼留言

版權宣告、免責聲明


姓名標示、非商業性、相同方式分享3.0台灣授權條款授權。
免責聲明: 本文所載資料僅供參考,並不構成投資建議,
讀者閱讀或使用該資料所導致結果需要自擔風險與責任,
作者概不承擔閱讀人行為之任何風險與責任。
除非有特別宣稱,作者言論並不代表所屬任何團體、公司、或其他人意見。