又開學了呢..寒假在家沉迷血源,並沒怎麼看書.新學期繼續努力吧.
最近在看檔案系統相關的東西,於是想起之前寫的讀取/proc下的檔案監控系統資料的程式,proc也是一種檔案系統,不過他只存在於記憶體中,所以叫做偽檔案系統.也是早期使用者能簡單和核心進行互動的方式之一,現在也許用在除錯核心程式比較多(?).
還是以模組的形式載入我們製作的動態檔案系統.先是註冊模組,
#include
#include
#include
#include
#include
#define proc_name "hello_proc"
static
int __init my_proc_init(void)
static
void __exit my_proc_exit(void)
module_license("gpl");
module_init(my_proc_init);
module_exit(my_proc_exit);
註冊my_proc_init為模組的入口,在載入的時候就會呼叫my_proc_init函式,同理解除安裝的時候呼叫my_proc_exit.
之後呼叫proc_create這個介面為我們在/proc下建立乙個名為hello_proc的檔案.
此外看了下網上還有使用create_proc_entry的方法,但是我這邊無法編譯說找不到這個函式定義,差了下這個方法在3.10以上的版本的核心中已經被棄用了.so..//
先來看看這個函式的定義
static
inline
struct proc_dir_entry *proc_create(
const
char *name,
mode_t mode,
struct proc_dir_entry *parent,
const
struct file_operations *proc_fops)
第乙個name是你的proc檔案的名字,第二個是你建立的檔案的許可權,我們填0表示的許可權是是0444,安裝之後是這樣的:
[root@localhost
proc]# ls /proc/hello_proc -la
-r--r--r--. 1 root root 0 feb 23
17:25 /proc/hello_proc
第三個引數是你建立的檔案位置(可以這麼說吧),你可以通過proc_mkdir現在/proc下建立乙個資料夾專案,在把這個資料夾傳入給parent,這樣proc檔案就生成在了你建立的目錄項下了.null就表示直接建立.
最後乙個file_operations就是該檔案的操作函式了.我們通過乙個結構體來定義.
static const struct file_operations hello_proc_fops = ;
想看完整結構在linux/include/linux/fs.h中.
下面三個基本不會變,主要是有乙個.open和.write,分別記錄檔案被讀取和寫入時的動作.
static
int hello_proc_show(struct seq_file *m, void *v)
static
int hello_proc_open(struct inode *inode, struct file *file)
先用seq_file物件開啟檔案,再使用seq_file中定義的標準輸出的方法輸出字元.
至於這個seq_file是個司馬東西,大致就是雖然以前就有proc系統的存在,但是在資料大小使用方面很有侷限性,於是某人就想了這個方法,用迭代器的形式迭代遍歷元素,比如你有乙個結構體的陣列,就可以用pos來記錄迭代的位置.
乙個很典型的例子就是/proc/device,如果你cat這個檔案就會列印出所有的裝置名.看下源**
#include
#include
#include
#include
static
int devinfo_show(struct seq_file *f, void *v)
#ifdef config_block
else
#endif
return0;}
static
void *devinfo_start(struct seq_file *f, loff_t *pos)
static
void *devinfo_next(struct seq_file *f, void *v, loff_t *pos)
static
void devinfo_stop(struct seq_file *f, void *v)
static
const
struct seq_operations devinfo_ops = ;
static
int devinfo_open(struct inode *inode, struct file *filp)
static
const
struct file_operations proc_devinfo_operations = ;
static
int __init proc_devices_init(void)
module_init(proc_devices_init);
devinfo_ops中記錄著迭代的操作,順序時start->show->next->show….一直到結束呼叫stop.在next中每次把*pos++記錄迴圈的次數,然後返回給static int devinfo_show(struct seq_file *f, void *v)中的v.
當然如果資料夠小也可以直接用for進行迴圈,這樣就和我們平時寫的沒什麼區別了.
之後寫個makefile編譯成模組.
source = procfs.c
obj-m
+= procfs.o
proc-objs
:= $(source:.c=
.o)all:
make -c /usr/src/kernels/$(shell uname -r)/build m=$(pwd) modules
clean:
make -c /lib/modules/$(shell uname -r)/build m=$(pwd) clean
如果說找不到目錄的話請檢查下/usr/src/kernels/$(shell uname -r)/build指向的位址再把上面替換調(神tm核心版本和kernel-headers版本是不一樣的.)
[root@localhost
proc]# insmod procfs.ko
[root@localhost
proc]# cat /proc/
[root@localhost
proc]# cat /proc/hello_proc
hello proc!
有興趣可以讀下寫的方法比較全.
結束結束.
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檔案的內容時,會呼叫核心的函式,從而改變核...