亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: proc文件系統(tǒng)剖析 [打印本頁]

作者: dreamice    時(shí)間: 2008-11-12 15:44
標(biāo)題: proc文件系統(tǒng)剖析
Proc file system
dreamice.jiang@gmail.com
1、重要的數(shù)據(jù)結(jié)構(gòu):
struct proc_dir_entry {
        unsigned int low_ino;
        unsigned short namelen;
        const char *name;
        mode_t mode;
        nlink_t nlink;
        uid_t uid;
        gid_t gid;
        loff_t size;
        const struct inode_operations *proc_iops;
        /*
         * NULL ->proc_fops means "PDE is going away RSN" or
         * "PDE is just created". In either case, e.g. ->read_proc won't be
         * called because it's too late or too early, respectively.
         *
         * If you're allocating ->proc_fops dynamically, save a pointer
         * somewhere.
         */
        const struct file_operations *proc_fops;
        get_info_t *get_info;
        struct module *owner;
        struct proc_dir_entry *next, *parent, *subdir;
        void *data;
        read_proc_t *read_proc;
        write_proc_t *write_proc;
        atomic_t count;                /* use count */
        int pde_users;        /* number of callers into module in progress */
        spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
        struct completion *pde_unload_completion;
        shadow_proc_t *shadow_proc;
};

2、創(chuàng)建函數(shù):
struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
                                                struct proc_dir_entry *parent);
name: 要?jiǎng)?chuàng)建的文件名稱;
mode: 該文件的保護(hù)掩碼;
parent: 確定文件所在目錄,如果置NULL,則位置為/proc下。

3、讀proc:
int read_proc(char *page, char **start, off_t off,
                          int count, int *eof, void *data);
page:指示用來寫入數(shù)據(jù)的緩沖區(qū);
off和count:與read函數(shù)對(duì)應(yīng)的參數(shù)相同;
start和eof:用于讀取大于1個(gè)page數(shù)據(jù)時(shí)實(shí)現(xiàn)。

4、寫proc:
int write_proc(struct file *file, const char __user *buffer,
                           unsigned long count, void *data);
filp 參數(shù)實(shí)際上是一個(gè)打開文件結(jié)構(gòu)(可以忽略這個(gè)參數(shù))。Buffer 參數(shù)是用戶空間要寫入的數(shù)據(jù)。緩沖區(qū)地址實(shí)際上是一個(gè)用戶空間的緩沖區(qū),不能直接讀取它。len 參數(shù)定義了在 buffer 中有多少數(shù)據(jù)要被寫入。data 參數(shù)是一個(gè)指向私有數(shù)據(jù)的指針。

5、實(shí)現(xiàn)一個(gè)proc文件
(1)調(diào)用create_proc_entry創(chuàng)建一個(gè)struct proc_dir_entry,作為一個(gè)全局量。
(2)對(duì)創(chuàng)建的struct proc_dir_entry進(jìn)行賦值:read_proc,mode,owner,size,write_proc等等。
示例:
proc_hello.c
#include <linux/module.h> /* Specifically, a module */
#include <linux/kernel.h> /* We're doing kernel work */
#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
#define procfs_name "helloworld"

struct proc_dir_entry *Our_Proc_File;
int
procfile_read(char *buffer,
        char **buffer_location,
        off_t offset, int buffer_length, int *eof, void *data)
{
        int ret;
        printk(KERN_INFO "procfile_read (/proc/%s) called\n", procfs_name);
/*
* We give all of our information in one go, so if the
* user asks us if we have more information the
* answer should always be no.
*
* This is important because the standard read
* function from the library would continue to issue
* the read system call until the kernel replies
* that it has no more information, or until its
* buffer is filled.
*/
        if (offset > 0) {
                printk(KERN_INFO "offset > 0\n");
/* we have finished to read, return 0 */
                ret = 0;
        } else {
/* fill the buffer, return the buffer size */
                printk(KERN_INFO "offset <= 0\n");
                ret = sprintf(buffer, "HelloWorld!\n");
        }
        return ret;
}
int init_module()
{
        Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
        if (Our_Proc_File == NULL) {
                remove_proc_entry(procfs_name, &proc_root);
                printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",
                        procfs_name);
                return -ENOMEM;
        }
        Our_Proc_File->read_proc = procfile_read;
        Our_Proc_File->owner = THIS_MODULE;
        Our_Proc_File->mode = S_IFREG | S_IRUGO;
        Our_Proc_File->uid = 0;
        Our_Proc_File->gid = 0;
        Our_Proc_File->size = 37;
        printk(KERN_INFO "/proc/%s created\n", procfs_name);
        return 0; /* everything is ok */
}
void cleanup_module()
{
        remove_proc_entry(procfs_name, &proc_root);
        printk(KERN_INFO "/proc/%s removed\n", procfs_name);
}

Makefile:
obj-m := proc_hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
        $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
        $(RM) *.o *.mod.c *.ko *.symvers

本示例只實(shí)現(xiàn)了一個(gè)簡單的讀proc操作。
編譯后,執(zhí)行:
# insmod proc_hello.ko
# dmesg
  /proc/helloworld created
# cat /proc/ helloworld
  HelloWorld!
# dmesg
  procfile_read (/proc/helloworld) called
offset <= 0
procfile_read (/proc/helloworld) called
offset > 0
procfile_read (/proc/helloworld) called
offset > 0
# rmmod proc_hello
  /proc/helloworld

為什么在調(diào)用cat /proc/ helloworld后,會(huì)看到procfile_read被執(zhí)行了三次,且只有第一次讀到了數(shù)據(jù)?
因?yàn)橥ǔat,dd等,都是通過標(biāo)準(zhǔn)庫函數(shù)來實(shí)現(xiàn)的,標(biāo)準(zhǔn)庫函數(shù)往往會(huì)多次調(diào)用系統(tǒng)調(diào)用來讀寫數(shù)據(jù),所以我們看到調(diào)用了3次。具體cat以及dd等調(diào)用一次,讀取或?qū)憯?shù)據(jù)大小,這個(gè)需要具體查證一下。
我寫了一個(gè)test程序,來驗(yàn)證這個(gè)多次讀操作不是在系統(tǒng)調(diào)用里面實(shí)現(xiàn)的:
test.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define PROC_FILE       "/proc/helloworld"

int main()
{
        char buf[50];
        int fd = open(PROC_FILE, O_RDONLY);
        if (fd == -1) {
                printf("open err\n");
                return -1;
        }
        if (read(fd, buf, sizeof("HelloWorld")) > 0) {
                printf("read: %s\n", buf);
        }
        close(fd);
}

編譯:
# gcc test.c –o test
加載模塊后,執(zhí)行
# ./test
然后,執(zhí)行:
# dmesg
  procfile_read (/proc/helloworld) called
offset <= 0
確實(shí)只執(zhí)行了一次,這說明多次調(diào)用procfile_read是在系統(tǒng)之上做的。
6、注意點(diǎn)
(1)切記不能訪問已經(jīng)卸載的一個(gè)proc文件,否則會(huì)導(dǎo)致kernel panic;
(2)注意不要?jiǎng)h除正在調(diào)用的問proc文件。因?yàn)槲募娜肟陧?xiàng)不存在關(guān)聯(lián)的作者,文件的調(diào)用也并沒有作用到模塊的引用計(jì)數(shù)上;
(3)勿注冊兩個(gè)同名的proc文件,這樣將導(dǎo)致入口項(xiàng)無法區(qū)分。

以上這些都是proc文件的缺點(diǎn),也是使用時(shí)必須注意的地方。所以,現(xiàn)在推薦使用seq_file 和sys_fs。

proc.pdf

73.55 KB, 下載次數(shù): 1456


作者: dreamice    時(shí)間: 2008-11-12 15:46
具體proc的介紹我就不說了,到處都可以查到。
上面我也說到了與歌德巴赫兄討論的系統(tǒng)調(diào)用與標(biāo)準(zhǔn)庫函數(shù)實(shí)現(xiàn)之間的差異。
作者: Godbach    時(shí)間: 2008-11-12 15:55
剖析的很好啊,F(xiàn)在很多時(shí)候做模塊開發(fā)還是離不開proc文件的。
作者: Godbach    時(shí)間: 2008-11-12 15:57
dreamice兄什么時(shí)候也研究一下sysfs,寫個(gè)例程讓大家學(xué)習(xí)一下啊。LDD3中比較推薦使用這個(gè)。
作者: Godbach    時(shí)間: 2008-11-12 16:01
dreamice兄是不是以前學(xué)習(xí)的過程中都做了很多總結(jié),寫成文章了啊。最近一下子這么多精華的文章,真是讓兄弟應(yīng)接不暇啊。

贊一個(gè)!
作者: llbox    時(shí)間: 2008-11-12 16:08
awesome
作者: dreamice    時(shí)間: 2008-11-12 16:13
原帖由 Godbach 于 2008-11-12 16:01 發(fā)表
dreamice兄是不是以前學(xué)習(xí)的過程中都做了很多總結(jié),寫成文章了啊。最近一下子這么多精華的文章,真是讓兄弟應(yīng)接不暇啊。

贊一個(gè)!


沒有,今天剛寫好就拿出來分享了,我這個(gè)人是藏不住東西的,呵呵。
爭取明天分析個(gè)seq_file,sysfs稍后再說,呵呵。多謝支持。
作者: dreamice    時(shí)間: 2008-11-12 16:17
呵呵,你可以給我加分啊,權(quán)限真大,哈哈
作者: Godbach    時(shí)間: 2008-11-12 17:32
原帖由 dreamice 于 2008-11-12 16:17 發(fā)表
呵呵,你可以給我加分啊,權(quán)限真大,哈哈


呵呵,好像是積分達(dá)到一定程度就可以給被人加分減分。我頭一次使用,呵呵。
作者: dreamice    時(shí)間: 2008-11-12 17:50
原帖由 Godbach 于 2008-11-12 17:32 發(fā)表


呵呵,好像是積分達(dá)到一定程度就可以給被人加分減分。我頭一次使用,呵呵。




你的處女分都給我了啊
作者: Godbach    時(shí)間: 2008-11-12 19:38
原帖由 dreamice 于 2008-11-12 17:50 發(fā)表




你的處女分都給我了啊

偶的第一次啊。。。。
作者: changzi100    時(shí)間: 2008-11-12 19:57
使勁看!
作者: scutan    時(shí)間: 2008-11-12 21:00
原帖由 Godbach 于 2008-11-12 15:57 發(fā)表
dreamice兄什么時(shí)候也研究一下sysfs,寫個(gè)例程讓大家學(xué)習(xí)一下啊。LDD3中比較推薦使用這個(gè)。


那本深入理解linux網(wǎng)絡(luò)內(nèi)幕中好像講了一點(diǎn)sysfs的東西.

頂樓主.
作者: scutan    時(shí)間: 2008-11-12 21:01
原帖由 Godbach 于 2008-11-12 15:57 發(fā)表
dreamice兄什么時(shí)候也研究一下sysfs,寫個(gè)例程讓大家學(xué)習(xí)一下啊。LDD3中比較推薦使用這個(gè)。


那本深入理解linux網(wǎng)絡(luò)內(nèi)幕中好像講了一點(diǎn)sysfs的東西.

頂樓主.
作者: dreamice    時(shí)間: 2008-11-12 21:29
原帖由 scutan 于 2008-11-12 21:01 發(fā)表


那本深入理解linux網(wǎng)絡(luò)內(nèi)幕中好像講了一點(diǎn)sysfs的東西.

頂樓主.


我去看一下,多謝提醒!
作者: xuxd32    時(shí)間: 2008-11-12 21:40
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
作者: sharpshootor    時(shí)間: 2008-11-13 08:50
好東西,先存起來
作者: luo118    時(shí)間: 2008-11-13 13:41
dreamice兄 有沒有容易了解D架,偶、對(duì)內(nèi)核方面還不懂
作者: dreamice    時(shí)間: 2008-11-13 13:43
原帖由 luo118 于 2008-11-13 13:41 發(fā)表
dreamice兄 有沒有容易了解D架,偶、對(duì)內(nèi)核方面還不懂


D架???是什么東西
作者: dreamice    時(shí)間: 2008-11-13 13:47
我不知道你得基礎(chǔ)怎樣,C語言基礎(chǔ)很重要,操作系統(tǒng)的概念最好能熟悉,這些事基礎(chǔ)知識(shí);
其次,你得熟悉linux的系統(tǒng)操作吧,一些常用的指令;
然后,就是結(jié)合一些書來實(shí)踐了。應(yīng)用程序的APUE2;內(nèi)核入門的我建議看LKD,接著看情景分析和ULK;
驅(qū)動(dòng)的話,就看LDD3。這些都懂了,我覺得就是牛人了,至少我現(xiàn)在還沒看完,呵呵。
作者: luo118    時(shí)間: 2008-11-13 13:55
原帖由 dreamice 于 2008-11-13 13:47 發(fā)表
我不知道你得基礎(chǔ)怎樣,C語言基礎(chǔ)很重要,操作系統(tǒng)的概念最好能熟悉,這些事基礎(chǔ)知識(shí);
其次,你得熟悉linux的系統(tǒng)操作吧,一些常用的指令;
然后,就是結(jié)合一些書來實(shí)踐了。應(yīng)用程序的APUE2;內(nèi)核入門的我建 ...


C語言基礎(chǔ)  現(xiàn)在學(xué)校學(xué)過,不現(xiàn)好少用,基本語法還記得一些

操作系統(tǒng)的概念最好能熟悉,這些事基礎(chǔ)知識(shí);
其次,你得熟悉linux的系統(tǒng)操作吧,一些常用的指令

這些不是問題,偶自已認(rèn)為這些應(yīng)比較熟了。是進(jìn)攻內(nèi)核過時(shí)候了

APUE2   LKD EN 太多了好多偶看不明白,即使用輕件翻譯,偶EN不好, 托累了學(xué)習(xí)水平提高。

有本LKD 中文版就好了
,

[ 本帖最后由 luo118 于 2008-11-13 14:00 編輯 ]
作者: dreamice    時(shí)間: 2008-11-13 14:06
原帖由 luo118 于 2008-11-13 13:55 發(fā)表


C語言基礎(chǔ)  現(xiàn)在學(xué)校學(xué)過,不現(xiàn)好少用,基本語法還記得一些

操作系統(tǒng)的概念最好能熟悉,這些事基礎(chǔ)知識(shí);
其次,你得熟悉linux的系統(tǒng)操作吧,一些常用的指令

這些不是問題,偶自已認(rèn)為這些應(yīng)比較熟了 ...


這些書都有中文版的,問題不大
作者: luo118    時(shí)間: 2008-11-13 14:14
標(biāo)題: 回復(fù) #22 dreamice 的帖子
我在google 中沒找到啊,BZ 如果有的send 比我OK?
作者: dreamice    時(shí)間: 2008-11-13 14:21
原帖由 luo118 于 2008-11-13 14:14 發(fā)表
我在google 中沒找到啊,BZ 如果有的send 比我OK?


買紙版的吧,又不貴。
作者: luo118    時(shí)間: 2008-11-13 14:42
標(biāo)題: 回復(fù) #24 dreamice 的帖子
OK 晚上去書城看看,
作者: dreamice    時(shí)間: 2008-11-13 14:50
標(biāo)題: 回復(fù) #25 luo118 的帖子
加油,前途是光明的,道路是曲折的
作者: luo118    時(shí)間: 2008-11-13 15:19
謝謝BZ 支持
作者: ubuntuer    時(shí)間: 2008-11-13 19:41
頂LZ
頂Godbach的第一次
作者: kns1024wh    時(shí)間: 2008-11-13 20:15
標(biāo)題: 回復(fù) #1 dreamice 的帖子
還是好好學(xué)習(xí)一下的
作者: victorgreat    時(shí)間: 2008-11-14 15:16
支持!
作者: yizuwei520    時(shí)間: 2008-11-14 16:40
BZ我在學(xué)習(xí)linux系統(tǒng)管理,電腦安裝的是FC8,請(qǐng)問我需要掌握什么才能做一名優(yōu)秀的系統(tǒng)管理員呢?
作者: dreamice    時(shí)間: 2008-11-14 17:24
原帖由 yizuwei520 于 2008-11-14 16:40 發(fā)表
BZ我在學(xué)習(xí)linux系統(tǒng)管理,電腦安裝的是FC8,請(qǐng)問我需要掌握什么才能做一名優(yōu)秀的系統(tǒng)管理員呢?


我對(duì)系統(tǒng)管理這一塊不是很熟悉,我知道好像紅帽什么的有類似的認(rèn)真考試
建議你可以關(guān)注一下,呵呵
作者: llzzccc    時(shí)間: 2008-11-15 00:30
標(biāo)題: 回復(fù) #31 yizuwei520 的帖子
系統(tǒng)管理員一定要學(xué)習(xí)bash語言。而且要非常熟練的寫bash腳本。
作者: yizuwei520    時(shí)間: 2008-11-15 19:57
標(biāo)題: 回復(fù) #33 llzzccc 的帖子
原來是這樣啊,難怪我在學(xué)習(xí)過程中,看到書上老有什么腳本之類的詞。學(xué)習(xí)了
作者: dreamice    時(shí)間: 2008-11-15 21:13
標(biāo)題: 回復(fù) #34 yizuwei520 的帖子
是這樣的,一定要非常精通腳本語言。
作者: yizuwei520    時(shí)間: 2008-11-20 14:37
標(biāo)題: 回復(fù) #35 dreamice 的帖子
BZ我去看了有關(guān)寫腳本的版塊了,好像大家對(duì)python,perl有好評(píng),你覺得我是先學(xué)bash還是python呢?
作者: dreamice    時(shí)間: 2008-11-20 15:38
原帖由 yizuwei520 于 2008-11-20 14:37 發(fā)表
BZ我去看了有關(guān)寫腳本的版塊了,好像大家對(duì)python,perl有好評(píng),你覺得我是先學(xué)bash還是python呢?


腳本語言總體來說是比較類似的,只是在特定應(yīng)用各有所長,可能正則表達(dá)式在腳本語言中是最難理解的。
作者: yizuwei520    時(shí)間: 2008-11-20 16:05
標(biāo)題: 回復(fù) #37 dreamice 的帖子
正則表達(dá)式確實(shí)很抽象,php里面也有正則表達(dá)式,python里面也有類似,我是決定努力把linux系統(tǒng)學(xué)下去的,不想放棄!
作者: dreamice    時(shí)間: 2008-11-20 16:11
原帖由 yizuwei520 于 2008-11-20 16:05 發(fā)表
正則表達(dá)式確實(shí)很抽象,php里面也有正則表達(dá)式,python里面也有類似,我是決定努力把linux系統(tǒng)學(xué)下去的,不想放棄!


其實(shí)說的籠統(tǒng)一點(diǎn),php,python,perl這些都可以統(tǒng)歸為腳本語言。呵呵,這是我個(gè)人看法。
作者: eveson    時(shí)間: 2008-11-20 17:46
同意。
作者: zlwww1227    時(shí)間: 2008-11-21 11:42
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
作者: snow888    時(shí)間: 2008-11-22 13:35
標(biāo)題: 回復(fù) #26 dreamice 的帖子
你就可勁兒忽悠吧。



上了賊船,要下船就不容易了。



到現(xiàn)在,內(nèi)核場景還沒看完呢。



那玩意兒入門容易,深入難啊。

作者: dreamice    時(shí)間: 2008-11-22 18:18
標(biāo)題: 回復(fù) #42 snow888 的帖子
不知道兄弟這個(gè)回復(fù)是什么意思
作者: _LoveLinux    時(shí)間: 2008-11-22 22:26
支持一下版主!可惜現(xiàn)在還沒有學(xué)到文件系統(tǒng),先收藏了,希望到時(shí)候可以用的上!
作者: 打死也不說2009    時(shí)間: 2010-09-14 22:41
我查源代碼   proc_dir_entry  中  少了很多項(xiàng), 比如owner等  為什么 阿   呵呵!
作者: dreamice    時(shí)間: 2010-09-15 13:59
我查源代碼   proc_dir_entry  中  少了很多項(xiàng), 比如owner等  為什么 阿   呵呵!
打死也不說2009 發(fā)表于 2010-09-14 22:41



    版本遷移變化,很多結(jié)構(gòu)體成員和API都有變化,這個(gè)是正常的。
所以,跟蹤linux內(nèi)核也是比較繁瑣的事情
作者: 98189    時(shí)間: 2010-09-19 21:19
收藏了
作者: tetjasontrip    時(shí)間: 2011-02-12 16:27
kan ka n
作者: zyfriend2004    時(shí)間: 2011-07-12 23:09
很不錯(cuò)的一篇文章
作者: zjsx133    時(shí)間: 2011-09-08 13:45
謝了,正需要
作者: zachary027    時(shí)間: 2011-09-28 16:31
請(qǐng)問大大么,在linux內(nèi)核態(tài)獲得cpu寄存器的值的方法有哪些??
作者: zachary027    時(shí)間: 2011-09-28 16:35
回復(fù) 43# dreamice


    dreamice,如果我想通過proc文件系統(tǒng)打印cpu寄存器的值,有沒有什么方法么?
作者: dreamice    時(shí)間: 2011-09-28 17:46
打印寄存器,恐怕沒辦法。我不知道你打印寄存器有什么用途,寄存器的值每個(gè)時(shí)刻都在變化的,尤其是通用寄存器。
作者: 伊人鵬    時(shí)間: 2011-09-28 23:20
真的很好!。!
作者: dreamice    時(shí)間: 2011-09-30 12:36
回復(fù)  dreamice


    dreamice,如果我想通過proc文件系統(tǒng)打印cpu寄存器的值,有沒有什么方法么?
zachary027 發(fā)表于 2011-09-28 16:35



    我昨天查了一下,你可以考慮用kprobe的方式,打印你想要的信息。詳細(xì)可以參考內(nèi)核源碼document下的相關(guān)說明。
作者: jjwjzj    時(shí)間: 2014-02-23 13:03
回復(fù) 2# dreamice

分析很清晰,學(xué)習(xí)了


   
作者: 電子學(xué)習(xí)員    時(shí)間: 2014-02-24 10:52
贊一個(gè)!很好哦
作者: yiltoncent    時(shí)間: 2018-02-12 11:18
最近在看proc文件系統(tǒng),能不能講一講proc文件系統(tǒng)的演變情況,如proc_dir_entry在后面的內(nèi)核版本中去掉了*read_proc和*write_proc指針,也采用了seq_file機(jī)制,這一系列變化的根源是什么,是從何考慮的。相信了解這些變遷歷史能夠讓我們對(duì)于linux內(nèi)核有更深的理解。





歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2