青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小默

『轉(zhuǎn)』文件結(jié)構(gòu)體struct file(Linux 2.6.23內(nèi)核)

struct file結(jié)構(gòu)體定義在/linux/include/linux/fs.h(Linux 2.6.11內(nèi)核)中,其原型是:
struct file {
        /*
         * fu_list becomes invalid after file_free is called and queued via
         * fu_rcuhead for RCU freeing
         */
        union {
                struct list_head        fu_list;
                struct rcu_head         fu_rcuhead;
        } f_u;
        struct path             f_path;
#define f_dentry        f_path.dentry
#define f_vfsmnt        f_path.mnt
        const struct file_operations    *f_op;
        atomic_t                f_count;
        unsigned int            f_flags;
        mode_t                  f_mode;
        loff_t                  f_pos;
        struct fown_struct      f_owner;
        unsigned int            f_uid, f_gid;
        struct file_ra_state    f_ra;
        unsigned long           f_version;
#ifdef CONFIG_SECURITY
        void                    *f_security;
#endif
        /* needed for tty driver, and maybe others */
        void                    *private_data;
#ifdef CONFIG_EPOLL
        /* Used by fs/eventpoll.c to link all the hooks to this file */
        struct list_head        f_ep_links;
        spinlock_t              f_ep_lock;
#endif /* #ifdef CONFIG_EPOLL */
        struct address_space    *f_mapping;
};
文件結(jié)構(gòu)體代表一個打開的文件,系統(tǒng)中的每個打開的文件在內(nèi)核空間都有一個關(guān)聯(lián)的struct file。它由內(nèi)核在打開文件時創(chuàng)建,并傳遞給在文件上進行操作的任何函數(shù)。在文件的所有實例都關(guān)閉后,內(nèi)核釋放這個數(shù)據(jù)結(jié)構(gòu)。在內(nèi)核創(chuàng)建和驅(qū)動源碼中,struct file的指針通常被命名為file或filp。一下是對結(jié)構(gòu)中的每個數(shù)據(jù)成員的解釋:
一、
union {
    struct list_head fu_list;
    struct rcu_head rcuhead;
}f_u;
其中的struct list_head定義在 linux/include/linux/list.h中,原型為:
struct list_head {
        struct list_head *next, *prev;
};
用于通用文件對象鏈表的指針。
struct rcu_head定義在linux/include/linux/rcupdate.h中,其原型為:
/**
* struct rcu_head - callback structure for use with RCU
* @next: next update requests in a list
* @func: actual update function to call after the grace period.
*/
struct rcu_head {
        struct rcu_head *next;
        void (*func)(struct rcu_head *head);
};
RCU(Read-Copy Update)是Linux 2.6內(nèi)核中新的鎖機制,具體在這里有介紹:
http://www.ibm.com/developerworks/cn/linux/l-rcu/
二、
struct path             f_path;
被定義在linux/include/linux/namei.h中,其原型為:
struct path {
        struct vfsmount *mnt;
        struct dentry *dentry;
};
在早些版本的內(nèi)核中并沒有此結(jié)構(gòu),而是直接將path的兩個數(shù)據(jù)成員作為struct file的數(shù)據(jù)成員,
struct vfsmount *mnt的作用是指出該文件的已安裝的文件系統(tǒng),
struct dentry *dentry是與文件相關(guān)的目錄項對象。
三、
const struct file_operations    *f_op;
被定義在linux/include/linux/fs.h中,其中包含著與文件關(guān)聯(lián)的操作,如:
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
等。當(dāng)打開一個文件時,內(nèi)核就創(chuàng)建一個與該文件相關(guān)聯(lián)的struct file結(jié)構(gòu),其中的*f_op就指向的是
具體對該文件進行操作的函數(shù)。例如用戶調(diào)用系統(tǒng)調(diào)用read來讀取該文件的內(nèi)容時,那么系統(tǒng)調(diào)用read最終會陷入內(nèi)核調(diào)用sys_read函數(shù),而sys_read最終會調(diào)用于該文件關(guān)聯(lián)的struct file結(jié)構(gòu)中的f_op->read函數(shù)對文件內(nèi)容進行讀取。
四、
atomic_t                f_count;
atomic_t被定義為:
typedef struct { volatile int counter; } atomic_t;
volatile修飾字段告訴gcc不要對該類型的數(shù)據(jù)做優(yōu)化處理,對它的訪問都是對內(nèi)存的訪問,而不是對寄存器的訪問。 
本質(zhì)是int類型,之所以這樣寫是讓編譯器對基于該類型變量的操作進行嚴(yán)格的類型檢查。此處f_count的作用是記錄對文件對象的引用計數(shù),也即當(dāng)前有多少個進程在使用該文件。
五、
unsigned int            f_flags;
當(dāng)打開文件時指定的標(biāo)志,對應(yīng)系統(tǒng)調(diào)用open的int flags參數(shù)。驅(qū)動程序為了支持非阻塞型操作需要檢查這個標(biāo)志。
六、
mode_t                  f_mode;
對文件的讀寫模式,對應(yīng)系統(tǒng)調(diào)用open的mod_t mode參數(shù)。如果驅(qū)動程序需要這個值,可以直接讀取這個字段。
mod_t被定義為:
typedef unsigned int __kernel_mode_t;
typedef __kernel_mode_t         mode_t;
七、
loff_t                  f_pos;
當(dāng)前的文件指針位置,即文件的讀寫位置。
loff_t被定義為:
typedef long long       __kernel_loff_t;
typedef __kernel_loff_t         loff_t;
八、
struct fown_struct      f_owner;
struct fown_struct在linux/include/linux/fs.h被定義,原型為:
struct fown_struct {
        rwlock_t lock;          /* protects pid, uid, euid fields */
        struct pid *pid;        /* pid or -pgrp where SIGIO should be sent */
        enum pid_type pid_type; /* Kind of process group SIGIO should be sent to */
        uid_t uid, euid;        /* uid/euid of process setting the owner */
        int signum;             /* posix.1b rt signal to be delivered on IO */
};
該結(jié)構(gòu)的作用是通過信號進行I/O時間通知的數(shù)據(jù)。
九、
unsigned int            f_uid, f_gid;
標(biāo)識文件的所有者id,所有者所在組的id.
十、
struct file_ra_state    f_ra;
struct file_ra_state結(jié)構(gòu)被定義在/linux/include/linux/fs.h中,原型為:
struct file_ra_state {
        pgoff_t start;                  /* where readahead started */
        unsigned long size;             /* # of readahead pages */
        unsigned long async_size;       /* do asynchronous readahead when
                                           there are only # of pages ahead */
                                           
        unsigned long ra_pages;         /* Maximum readahead window */
        unsigned long mmap_hit;         /* Cache hit stat for mmap accesses */
        unsigned long mmap_miss;        /* Cache miss stat for mmap accesses */
        unsigned long prev_index;       /* Cache last read() position */
        unsigned int prev_offset;       /* Offset where last read() ended in a page */
};
文件預(yù)讀狀態(tài),文件預(yù)讀算法使用的主要數(shù)據(jù)結(jié)構(gòu),當(dāng)打開一個文件時,f_ra中出了perv_page(默認(rèn)為-1)和ra_apges(對該文件允許的最大預(yù)讀量)這兩個字段外,其他的所有西端都置為0。
十一、
unsigned long           f_version;
記錄文件的版本號,每次使用后都自動遞增。
十二、
#ifdef CONFIG_SECURITY
        void                    *f_security;
#endif
此處我的理解是如果在編譯內(nèi)核時配置了安全措施,那么struct file結(jié)構(gòu)中就會有void *f_security數(shù)據(jù)項,用來描述安全措施或者是記錄與安全有關(guān)的信息。
十三、
void *private_data;
系統(tǒng)在調(diào)用驅(qū)動程序的open方法前將這個指針置為NULL。驅(qū)動程序可以將這個字段用于任意目的,也可以忽略這個字段。驅(qū)動程序可以用這個字段指向已分配的數(shù)據(jù),但是一定要在內(nèi)核釋放file結(jié)構(gòu)前的release方法中清除它。
十四、
#ifdef CONFIG_EPOLL
        /* Used by fs/eventpoll.c to link all the hooks to this file */
        struct list_head        f_ep_links;
        spinlock_t              f_ep_lock;
#endif /* #ifdef CONFIG_EPOLL */
被用在fs/eventpoll.c來鏈接所有鉤到這個文件上。其中f_ep_links是文件的事件輪詢等待者鏈表的頭,f_ep_lock是保護f_ep_links鏈表的自旋鎖。
十五、struct address_space    *f_mapping;
struct address_space被定義在/linux/include/linux/fs.h中,此處是指向文件地址空間的指針。
  在驅(qū)動開發(fā)中,文件讀/寫模式mode、標(biāo)志f_flags都是設(shè)備驅(qū)動關(guān)心的內(nèi)容,而私有數(shù)據(jù)指針private_data在折本驅(qū)動中被廣泛使用,大多被指向設(shè)備驅(qū)動自定義用于描述設(shè)備的結(jié)構(gòu)體。 
驅(qū)動程序中常用如下類似的代碼來檢測用戶打開文件的讀寫方式:
if (file->f_mode & FMODE_WRITE) //用戶要求可寫
  {
  }
  if (file->f_mode & FMODE_READ) //用戶要求可讀
  {
  }
下面的代碼可用于判斷以阻塞還是非阻塞方式打開設(shè)備文件:
  if (file->f_flags & O_NONBLOCK) //非阻塞
      pr_debug("open:non-blocking\n");
  else //阻塞
      pr_debug("open:blocking\n");
參考:
Linux設(shè)備驅(qū)動開發(fā)詳解
深入理解linux內(nèi)核

posted on 2010-06-17 23:14 小默 閱讀(332) 評論(0)  編輯 收藏 引用 所屬分類: Linux

導(dǎo)航

統(tǒng)計

留言簿(13)

隨筆分類(287)

隨筆檔案(289)

漏洞

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            这里只有精品电影| 国产日韩精品在线播放| 久久精品国产一区二区电影 | 亚洲国内在线| 篠田优中文在线播放第一区| 99精品免费| 麻豆9191精品国产| 久久激情一区| 国产精品入口夜色视频大尺度| 亚洲福利一区| 伊人伊人伊人久久| 久久电影一区| 久久精品国产99国产精品澳门 | 欧美性猛片xxxx免费看久爱| 亚洲国产第一| 亚洲欧洲在线免费| 久久蜜桃资源一区二区老牛| 久久综合色播五月| 国内精品美女av在线播放| 亚洲欧美日韩另类| 亚洲欧美日韩一区在线观看| 欧美香蕉大胸在线视频观看| 99精品欧美一区二区三区| 一区二区av在线| 欧美精品一区二区三区很污很色的| 免费成人在线观看视频| 永久91嫩草亚洲精品人人| 久久久成人精品| 米奇777超碰欧美日韩亚洲| 国语自产偷拍精品视频偷| 久久九九精品| 久热精品视频在线观看| 亚洲电影免费在线观看| 欧美.www| 99国产精品99久久久久久粉嫩| 一区二区三区欧美日韩| 国产精品大片免费观看| 亚洲欧美日韩成人| 久久久久欧美精品| 一区在线观看| 欧美阿v一级看视频| 最新亚洲视频| 亚洲永久字幕| 国产三级欧美三级日产三级99| 欧美在线一区二区三区| 欧美激情一区二区三区成人| 一区二区三区视频观看| 国产麻豆日韩| 久久亚洲私人国产精品va媚药| 亚洲国产日韩综合一区| 亚洲一区二区精品视频| 国产欧美在线视频| 久久中文字幕导航| 亚洲精品视频一区二区三区| 香蕉久久夜色精品| 尹人成人综合网| 欧美日韩一区二区三区在线视频| 亚洲欧美激情诱惑| 欧美成人精品三级在线观看| 中文久久精品| 在线成人性视频| 欧美三级网址| 久久久久国产一区二区三区| 亚洲另类一区二区| 久久综合一区二区三区| 亚洲天堂av在线免费| 激情婷婷久久| 国产精品久久久久久妇女6080 | 欧美激情一区二区三区四区| 亚洲午夜av| 亚洲高清资源综合久久精品| 国产精品电影在线观看| 久久综合狠狠综合久久综合88| 亚洲社区在线观看| 亚洲第一精品影视| 久久成人一区二区| 中文国产成人精品久久一| 精品不卡一区二区三区| 国产精品人成在线观看免费 | 亚洲三级电影在线观看| 久久久99精品免费观看不卡| 在线视频欧美日韩精品| 亚洲国产清纯| 国产一区二三区| 国产精品欧美久久| 欧美精品久久久久a| 久久视频在线视频| 性伦欧美刺激片在线观看| 一区二区毛片| 亚洲精品色图| 亚洲国产高清高潮精品美女| 裸体女人亚洲精品一区| 久久九九免费视频| 欧美一区二区在线视频| 亚洲永久精品国产| 一区二区三区 在线观看视| 亚洲国产综合视频在线观看| 在线免费观看视频一区| 国产日韩欧美中文在线播放| 国产精品视频精品视频| 国产精品大片免费观看| 欧美体内she精视频在线观看| 欧美国内亚洲| 欧美伦理a级免费电影| 欧美极品aⅴ影院| 欧美精品三区| 欧美精品一区二区视频 | 亚洲一区二区三区视频播放| 99精品久久| 一区二区三区高清在线| 一道本一区二区| 一区二区三区 在线观看视| 99在线精品观看| 亚洲视频1区| 亚洲欧美综合一区| 亚洲欧美日韩精品一区二区| 午夜精品久久久久久久男人的天堂 | 久久精品91久久久久久再现| 欧美一区三区三区高中清蜜桃| 欧美影院成年免费版| 久久精品99| 欧美bbbxxxxx| 欧美色123| 国产伦精品一区二区三| 国内精品视频在线播放| 亚洲福利视频在线| 日韩午夜电影在线观看| 亚洲校园激情| 久久精品日产第一区二区三区 | 欧美1区免费| 欧美激情一区在线观看| 亚洲欧洲日产国产网站| 亚洲天堂免费观看| 欧美在线观看你懂的| 麻豆国产精品777777在线 | 欧美视频在线观看免费网址| 国产精品久久久久久久久久尿| 国产女优一区| 亚洲欧洲日本国产| 亚洲一区亚洲| 老巨人导航500精品| 亚洲人成欧美中文字幕| 亚洲无线视频| 久久婷婷影院| 国产精品porn| 在线播放日韩| 亚洲一区久久久| 欧美gay视频激情| 中文日韩在线视频| 欧美综合国产| 欧美日韩午夜在线| 一区二区视频在线观看| 亚洲一区二区三区国产| 老色批av在线精品| 日韩性生活视频| 久久久久久久综合色一本| 欧美日韩在线亚洲一区蜜芽| 激情一区二区| 先锋亚洲精品| 亚洲人体1000| 久久精品国产综合| 国产精品久久久久aaaa九色| 亚洲三级毛片| 久久综合狠狠| 亚洲欧美日韩一区二区三区在线观看 | 久久综合国产精品| 国产毛片精品视频| 中国av一区| 亚洲春色另类小说| 久久久国产精品亚洲一区 | 国产麻豆午夜三级精品| 日韩一本二本av| 欧美刺激午夜性久久久久久久| 午夜亚洲视频| 国产精品国产三级欧美二区| 亚洲免费观看高清在线观看 | 暖暖成人免费视频| 狠狠干狠狠久久| 久久精品视频一| 亚洲欧美www| 国产精品日韩| 亚洲欧美成人| 亚洲图片欧美午夜| 欧美日韩一区在线观看| 艳妇臀荡乳欲伦亚洲一区| 欧美激情精品| 美腿丝袜亚洲色图| 在线视频国内自拍亚洲视频| 久久综合一区二区三区| 欧美在线一级va免费观看| 国产亚洲人成a一在线v站| 先锋影院在线亚洲| 亚洲欧美国产精品专区久久| 国产精品a久久久久| 亚洲中午字幕| 亚洲一区二区三区四区中文 | 一区二区久久| 亚洲美女视频在线观看| 欧美日韩无遮挡| 亚洲一区二区在|