一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

字符設(shè)備中 重要的數(shù)據(jù)結(jié)構(gòu)

 wanwanstudy 2012-02-28
大部分字符驅(qū)動(dòng)設(shè)計(jì)三個(gè)重要的數(shù)據(jù)結(jié)構(gòu)
<linux/fs.h>
struct file_operations
struct file
struct inode
 
一、文件操作
           在之前的一篇文章中已經(jīng)有介紹了如何去生情字符設(shè)備設(shè)備號(hào),但是沒有做任何的工作,也就只能寫一個(gè)不能工作的字符設(shè)備;
struct file_operations 結(jié)構(gòu)域用來連接設(shè)備與操作,實(shí)現(xiàn)系統(tǒng)調(diào)用。
重要字段介紹:
struct file_operations {
    struct module *owner;//表示擁有這個(gè)結(jié)構(gòu)模塊的指針,幾乎所有的驅(qū)動(dòng)都會(huì)設(shè)置為THIS_MODULE<linux/module.h>
    loff_t (*llseek) (struct file *, loff_t, int);//文件讀寫位置調(diào)整函數(shù)
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//從設(shè)備讀取數(shù)據(jù)
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//項(xiàng)設(shè)備寫入數(shù)據(jù)
    unsigned int (*poll) (struct file *, struct poll_table_struct *);//查詢文件描述符上的讀取寫入是否被阻塞
    int (*mmap) (struct file *, struct vm_area_struct *);//將設(shè)備內(nèi)存映射到進(jìn)程空間
    int (*open) (struct inode *, struct file *);//對(duì)應(yīng)于打開設(shè)備
    int (*release) (struct inode *, struct file *);//對(duì)應(yīng)于關(guān)閉一個(gè)設(shè)備
    .
    .
    .
};
結(jié)構(gòu)還有很多的操作因?yàn)檫€沒有學(xué)會(huì),就沒有多做介紹,(ioctl函數(shù)操作在2.6.35之后就變成了unlocked_ioctl、compat_ioctl其實(shí)作用也不是很大 也沒有做介紹,以后有機(jī)會(huì)再做介紹)
當(dāng)open 與release置為NULL時(shí) 就以內(nèi)核默認(rèn)的方式進(jìn)行打開或者關(guān)閉,并且不會(huì)出錯(cuò),
當(dāng)其他函數(shù)沒有被定義時(shí)候,應(yīng)用程序調(diào)用會(huì)出錯(cuò)。
下邊是一個(gè)最重要的幾個(gè)設(shè)備操作方法的定義。
struct file_operations simple_fops={
    .owner   = THIS_MODULE,
    .open    = simple_open,
    .release = simple_close,
    .read    = simple_read,
    .write   = simple_write,
    .llseek  = simple_llseek,
    .poll    = simple_poll,
    .mmap    = simple_mmap,
};

二、file結(jié)構(gòu)
這里介紹的file結(jié)構(gòu)并不是C語言中的FILE結(jié)構(gòu),兩者沒有任何關(guān)聯(lián),struct file只是一個(gè)內(nèi)核的結(jié)構(gòu),每一個(gè)打開的文件,都會(huì)對(duì)應(yīng)一個(gè)struct file結(jié)構(gòu),一個(gè)文件可以對(duì)應(yīng)于不同的struct file結(jié)構(gòu)
struct file {
    struct path    f_path; //文件位置
    const struct file_operations    *f_op;.//文件操作符
    spinlock_t    f_lock; 
    atomic_long_t    f_count;
    unsigned int     f_flags;//文件標(biāo)識(shí)(O_NONBLOCK, O_RDONLY等由應(yīng)用程序傳入)
    fmode_t    f_mode;//文件模式可讀可寫
    loff_t      f_pos;//文件讀寫位置
    struct fown_struct    f_owner;
    const struct cred   *f_cred;
    struct file_ra_state  f_ra;
    .
    .
    .
    void       *private_data; //most important!! 私有數(shù)據(jù),驅(qū)動(dòng)可以使用它指向任何的數(shù)據(jù)結(jié)構(gòu)

};
三、inode結(jié)構(gòu)
linux內(nèi)核使用inode結(jié)構(gòu)表示一個(gè)文件,與file不同,file可以理解為用來表示文件描述符的結(jié)構(gòu),一個(gè)文件可以對(duì)應(yīng)很多的文件描述符,而最后只會(huì)指向同一個(gè)inode結(jié)構(gòu)

struct inode {
    ...
    dev_t       i_rdev; //保存設(shè)備號(hào)
        union {
        struct pipe_inode_info    *i_pipe;
        struct block_device   *i_bdev;
        struct cdev    *i_cdev; //指向了struct cdev結(jié)構(gòu)
    };
    ...
};

四、file 結(jié)構(gòu) 與inode結(jié)構(gòu)圖解

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲一区二区三区日韩91| 欧美人妻盗摄日韩偷拍| 婷婷开心五月亚洲综合| 日本在线视频播放91| 免费福利午夜在线观看| 日韩不卡一区二区在线| 大胆裸体写真一区二区| 国产一区欧美午夜福利| 又大又长又粗又黄国产 | 超碰在线免费公开中国黄片| 国产成人精品午夜福利| 精品欧美日韩一二三区| 色婷婷视频在线精品免费观看| 欧美日韩精品久久亚洲区熟妇人 | 在线观看日韩欧美综合黄片| 国产原创激情一区二区三区| 成人午夜激情免费在线| 国产a天堂一区二区专区| 九九热在线视频观看最新| 亚洲精品偷拍视频免费观看| 日韩精品亚洲精品国产精品| 欧美成人免费夜夜黄啪啪| 有坂深雪中文字幕亚洲中文| 欧美日韩亚洲国产av| 日韩精品一区二区毛片| 尤物天堂av一区二区| 丁香七月啪啪激情综合| 小草少妇视频免费看视频| 成人精品日韩专区在线观看| 欧美亚洲三级视频在线观看| 加勒比日本欧美在线观看| 黑丝袜美女老师的小逼逼| 色欧美一区二区三区在线| 嫩草国产福利视频一区二区| 亚洲国产精品久久综合网| 成人免费在线视频大香蕉| 大香蕉再在线大香蕉再在线| 日本精品理论在线观看| 欧美日韩无卡一区二区| 免费一级欧美大片免费看| 少妇福利视频一区二区|