久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > 驅動之cdev
驅動之cdev
時間:2016-12-12作者:華(hua)清遠見

前面寫到(dao)如(ru)何(he)向(xiang)系(xi)統申請一(yi)個(ge)(ge)設備號,設備號就像我們的身份證號一(yi)樣,號本身并沒有(you)什么特(te)殊(shu)的意義,只有(you)把這個(ge)(ge)號和人對(dui)應才有(you)意義,通用(yong)設備號也(ye)需要和一(yi)個(ge)(ge)特(te)殊(shu)的東西對(dui)于,這就是cdev, cdev是linux下(xia)(xia)抽象出(chu)來的一(yi)個(ge)(ge)用(yong)來描述一(yi)個(ge)(ge)字符設備的結構體,在linux下(xia)(xia)定(ding)義如(ru)下(xia)(xia):

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

結構體中有幾個成員事我們寫驅動的時(shi)候必須關心的:

dev 類型(xing)是dev_t,也就是我們的設備號

ops是(shi)(shi)一(yi)個(ge)(ge)(ge)同(tong)樣也是(shi)(shi)一(yi)個(ge)(ge)(ge)結構體并且(qie)是(shi)(shi)一(yi)個(ge)(ge)(ge)字(zi)符驅(qu)動(dong)實現的(de)(de)(de)主體,字(zi)符驅(qu)動(dong)通常(chang)需(xu)要和應(ying)用(yong)程(cheng)序交互,在學linux系統編程(cheng)的(de)(de)(de)時候,都(dou)會講到linux 應(ying)用(yong)程(cheng)序通過系統調用(yong)陷入到內(nei)核(he)空間,從(cong)而執(zhi)(zhi)行(xing)內(nei)核(he)代碼,而驅(qu)動(dong)作為內(nei)核(he)的(de)(de)(de)一(yi)部分同(tong)樣也是(shi)(shi)需(xu)要在內(nei)核(he)空間執(zhi)(zhi)行(xing)的(de)(de)(de),ops也就是(shi)(shi)file_operations這個(ge)(ge)(ge)結構體就是(shi)(shi)我(wo)們的(de)(de)(de)驅(qu)動(dong)為應(ying)用(yong)程(cheng)序調用(yong)驅(qu)動(dong)而實現的(de)(de)(de)一(yi)個(ge)(ge)(ge)操作的(de)(de)(de)集(ji)合,它(ta)的(de)(de)(de)定(ding)義如下:

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);
        };

我(wo)們在驅動中要做的(de)事(shi)情就是申請一個(ge)cdev并把(ba)cdev注冊到系統(tong)中去,操作cdev的(de)函數有:

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的定(ding)義

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

2、cdev的初始化

cdev_init實現(xian)cdev的(de)(de)初(chu)始化,主要的(de)(de)工作是將我們定義好的(de)(de)file_operaionts與(yu)cdev關聯起來(lai),file_operations的(de)(de)實現(xian)根據實際需求來(lai)實現(xian),后面詳細介紹。

3、cdev的注冊

cdev_add實現(xian)cdev的(de)(de)注(zhu)冊(ce),linux內核里維(wei)護了一個cdev_map的(de)(de)表,所謂(wei)cdev的(de)(de)注(zhu)冊(ce)就是把(ba)我們的(de)(de)cdev注(zhu)冊(ce)到cdev_map表上,cdev_map表結構如圖:

4、設(she)備的刪除

cdev_del 將(jiang)我們的(de)cdev從cdev_map中移除(chu)。

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)