色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當(dāng)前位置: > 華清遠(yuǎn)見教育科技集團(tuán) > 嵌入式學(xué)習(xí) > 講師博文 > 驅(qū)動(dòng)之cdev
驅(qū)動(dòng)之cdev
時(shí)間:2016-12-12作者:華清遠(yuǎn)見

前面寫到如何向系統(tǒng)申請(qǐng)一個(gè)設(shè)備號(hào),設(shè)備號(hào)就像我們的身份證號(hào)一樣,號(hào)本身并沒有什么特殊的意義,只有把這個(gè)號(hào)和人對(duì)應(yīng)才有意義,通用設(shè)備號(hào)也需要和一個(gè)特殊的東西對(duì)于,這就是cdev, cdev是linux下抽象出來(lái)的一個(gè)用來(lái)描述一個(gè)字符設(shè)備的結(jié)構(gòu)體,在linux下定義如下:

struct cdev {
                struct kobject kobj;
                struct module *owner;
                const struct file_operations *ops;
                struct list_head list;
                dev_t dev;
                unsigned int count;
        };

結(jié)構(gòu)體中有幾個(gè)成員事我們寫驅(qū)動(dòng)的時(shí)候必須關(guān)心的:

dev 類型是dev_t,也就是我們的設(shè)備號(hào)

ops是一個(gè)同樣也是一個(gè)結(jié)構(gòu)體并且是一個(gè)字符驅(qū)動(dòng)實(shí)現(xiàn)的主體,字符驅(qū)動(dòng)通常需要和應(yīng)用程序交互,在學(xué)linux系統(tǒng)編程的時(shí)候,都會(huì)講到linux 應(yīng)用程序通過(guò)系統(tǒng)調(diào)用陷入到內(nèi)核空間,從而執(zhí)行內(nèi)核代碼,而驅(qū)動(dòng)作為內(nèi)核的一部分同樣也是需要在內(nèi)核空間執(zhí)行的,ops也就是file_operations這個(gè)結(jié)構(gòu)體就是我們的驅(qū)動(dòng)為應(yīng)用程序調(diào)用驅(qū)動(dòng)而實(shí)現(xiàn)的一個(gè)操作的集合,它的定義如下:

struct file_operations {
                struct module *owner;
                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 *);
                ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
                ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
                int (*readdir) (struct file *, void *, filldir_t);
                unsigned int (*poll) (struct file *, struct poll_table_struct *);
                long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
                long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
                int (*mmap) (struct file *, struct vm_area_struct *);
                int (*open) (struct inode *, struct file *);
                int (*flush) (struct file *, fl_owner_t id);
                int (*release) (struct inode *, struct file *);
                int (*fsync) (struct file *, loff_t, loff_t, int datasync);
                int (*aio_fsync) (struct kiocb *, int datasync);
                int (*fasync) (int, struct file *, int);
                int (*lock) (struct file *, int, struct file_lock *);
                ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
                unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
                int (*check_flags)(int);
                int (*flock) (struct file *, int, struct file_lock *);
                ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
                ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
                int (*setlease)(struct file *, long, struct file_lock **);
                long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);
        };

我們?cè)隍?qū)動(dòng)中要做的事情就是申請(qǐng)一個(gè)cdev并把cdev注冊(cè)到系統(tǒng)中去,操作cdev的函數(shù)有:

void cdev_init(struct cdev *, const struct file_operations *);
        struct cdev *cdev_alloc(void);
        int cdev_add(struct cdev *, dev_t, unsigned);
        void cdev_del(struct cdev *);

1、cdev的定義

cdev的定義有兩種方式一種是:struct cdev cdev;另外一種是:strcut cdev cdev;cdev = cdev_alloc();

2、cdev的初始化

cdev_init實(shí)現(xiàn)cdev的初始化,主要的工作是將我們定義好的file_operaionts與cdev關(guān)聯(lián)起來(lái),file_operations的實(shí)現(xiàn)根據(jù)實(shí)際需求來(lái)實(shí)現(xiàn),后面詳細(xì)介紹。

3、cdev的注冊(cè)

cdev_add實(shí)現(xiàn)cdev的注冊(cè),linux內(nèi)核里維護(hù)了一個(gè)cdev_map的表,所謂cdev的注冊(cè)就是把我們的cdev注冊(cè)到cdev_map表上,cdev_map表結(jié)構(gòu)如圖:

4、設(shè)備的刪除

cdev_del 將我們的cdev從cdev_map中移除。

發(fā)表評(píng)論
評(píng)論列表(網(wǎng)友評(píng)論僅供網(wǎng)友表達(dá)個(gè)人看法,并不表明本站同意其觀點(diǎn)或證實(shí)其描述)
主站蜘蛛池模板: 麻豆精品A片免费观看 | 又嫩又硬又黄又爽的视频 | 中文字幕在线观看 | 久久99精品久久久久久久不卡 | 亚洲男同帅GAY片在线观看 | 国产精品久久久尹人香蕉 | 亚洲欧洲美洲无码精品VA | 中文字幕国产一区二区三区 | 俄罗斯少妇大屁股xxxxx | 真人无码国产作爱免费视频 | 久热国产vs视频在线观看 | 欧美日本免费一区二区三区 | 中文字幕丰满孑伦无码专区 | 日韩在线观看三区 | 亚洲熟女综合色一区二区三区 | 性迷宫在线观看 | 亚洲色偷偷综合亚洲av78 | 亚洲国产精品久久精品成人网站 | 成人性生交片无码免费看 | 无码区a毛片免费视频 | ASS年轻少妇BBWPIC | gogo大胆无码免费视频列表 | 一級特黃色毛片免費看 | 人妻少妇被猛烈进入中文字幕 | 久久久久免费看成人影片 | 香蕉久久AV一区二区三区 | 久久精品国产亚洲AV网站 | 国产片免费福利片永久 | 我们的2018在线观看免费高清 | 白丝袜美女扒开内衣网站 | 丰满爆乳一区二区三区 | 国产v亚洲v日韩v欧美v片 | 国产av无码专区亚洲版综合 | 夜色资源网站ye321 | 人妻中文字幕乱人伦在线 | 亚洲中文字幕久久精品无码2021 | 人妻熟女αⅴ一区二区三区 | 久久九九日本韩国精品 | 18禁夜色福利院在线播放 | 久久久亚洲欧洲日产国码αv | 精品国产品香蕉在线 |