簡單的proc動態檔案系統模組

2021-07-27 09:36:26 字數 3628 閱讀 7823

又開學了呢..寒假在家沉迷血源,並沒怎麼看書.新學期繼續努力吧.

最近在看檔案系統相關的東西,於是想起之前寫的讀取/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檔案的內容時,會呼叫核心的函式,從而改變核...