揭開字符設(shè)備驅(qū)動(dòng)程序的面紗_第1頁
揭開字符設(shè)備驅(qū)動(dòng)程序的面紗_第2頁
揭開字符設(shè)備驅(qū)動(dòng)程序的面紗_第3頁
揭開字符設(shè)備驅(qū)動(dòng)程序的面紗_第4頁
揭開字符設(shè)備驅(qū)動(dòng)程序的面紗_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux驅(qū)動(dòng)開發(fā)庖丁解牛之三揭開字符設(shè)備驅(qū)動(dòng)程序的面紗By:dreamice 2008-11-231寫在前面的話       我們知道,在Linux設(shè)備驅(qū)動(dòng)開發(fā)中,包括三大設(shè)備類:字符設(shè)備,塊設(shè)備和網(wǎng)絡(luò)設(shè)備。而字符設(shè)備,作為最簡(jiǎn)單的設(shè)備類,為此,我們將從最簡(jiǎn)單的字符設(shè)備開始,走進(jìn)Linux驅(qū)動(dòng)程序設(shè)計(jì)的神秘殿堂。我們已經(jīng)踏上了真正的設(shè)備驅(qū)動(dòng)開發(fā)的道路了!有志者,事竟成。付出越多,而上蒼定會(huì)以同等的收獲回饋于你,當(dāng)然,最重要的一點(diǎn)是:我們必須走上正確的道路,做正確的付出。開始吧參考書目:Linux Device Driver第三版Understandin

2、g the linux kernel第三版Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解2必備之“磚”        蓋大樓,得預(yù)先準(zhǔn)備好磚頭。同樣的道理,要寫好驅(qū)動(dòng)程序,我們也必須準(zhǔn)備好自己的“磚頭”,拿好這些磚頭,便會(huì)真正如庖丁解牛般,游刃于Linux驅(qū)動(dòng)程序設(shè)計(jì)的神奇藝術(shù)之中。在Linux的設(shè)計(jì)之初,曾提出:一切皆文件,如果一個(gè)東西不是文件,那就是進(jìn)程。由此可見,文件的概念在Linux系統(tǒng)中可謂是根深蒂固,以至于它深入到對(duì)驅(qū)動(dòng)程序的控制,這也是情理之中的事。下圖描述了Linux系統(tǒng)中虛擬文件系統(tǒng)和進(jìn)程之間的關(guān)系:圖表 1進(jìn)程和文件系統(tǒng)的關(guān)系在上圖中

3、,我們看到了Process,F(xiàn)ile object,dentry object,inode object以及Sperblock object等概念。Process就是指一個(gè)特定的進(jìn)程,而File obeject對(duì)應(yīng)于進(jìn)程打開的一個(gè)文件;dentry object描述了一個(gè)目錄項(xiàng);inode object則對(duì)應(yīng)于磁盤上一個(gè)特定的文件;Sperblock object描述了文件系統(tǒng)的相關(guān)信息。從這個(gè)圖中,可以看到進(jìn)程到磁盤上一個(gè)文件實(shí)體的路徑及對(duì)應(yīng)關(guān)系。下面,我們一次看看這些實(shí)體結(jié)構(gòu)在內(nèi)核中的定義。2.1 File object       File結(jié)構(gòu)代表

4、一個(gè)打開的文件,系統(tǒng)中每個(gè)打開的文件,在內(nèi)核空間都對(duì)應(yīng)一個(gè)file結(jié)構(gòu)。它由內(nèi)核在調(diào)用open時(shí)創(chuàng)建,并傳遞給在該文件上操作的所有函數(shù),直到最后的close函數(shù)。在文件的所有實(shí)例都被關(guān)閉以后,內(nèi)核才會(huì)釋放這個(gè)結(jié)構(gòu)。在內(nèi)核中,通常以filp來代表指向file結(jié)構(gòu)的指針。File結(jié)構(gòu)的詳細(xì)定義如下:/linux/fs.h779 struct file 780         /*781          * fu_list becomes invalid after file_f

5、ree is called and queued via782          * fu_rcuhead for RCU freeing783          */784         union 785                 struct list_head   

6、;     fu_list;786                 struct rcu_head         fu_rcuhead;787          f_u;788         struct path     &

7、#160;       f_path;789 #define f_dentry        f_path.dentry790 #define f_vfsmnt        f_path.mnt791         const struct file_operations    *f_op; /與文件操作相關(guān)的函數(shù)指針結(jié)構(gòu)792   

8、      atomic_t                f_count;793         unsigned int            f_flags;794         mode_t      

9、0;           f_mode;795         loff_t                  f_pos;796         struct fown_struct      f_owner;797   

10、60;     unsigned int            f_uid, f_gid;798         struct file_ra_state    f_ra;799800         u64                

11、     f_version;801 #ifdef CONFIG_SECURITY802         void                    *f_security;803 #endif804         /* needed for tty driver, and maybe others *

12、/805         void                    *private_data;806807 #ifdef CONFIG_EPOLL808         /* Used by fs/eventpoll.c to link all the hooks to this file */809   &#

13、160;     struct list_head        f_ep_links;810         spinlock_t              f_ep_lock;811 #endif /* #ifdef CONFIG_EPOLL */812         struct

14、address_space    *f_mapping;813 ;1166 /*1167  * NOTE:1168  * read, write, poll, fsync, readv, writev, unlocked_ioctl and compat_ioctl1169  * can be called without the big kernel lock held in all filesystems.1170  */1171 struct file_operations 1172

15、60;        struct module *owner;1173         loff_t (*llseek) (struct file *, loff_t, int);1174         ssize_t (*read) (struct file *, char _user *, size_t, loff_t *);1175         ssiz

16、e_t (*write) (struct file *, const char _user *, size_t, loff_t *);1176         ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);1177         ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsig

17、ned long, loff_t);1178         int (*readdir) (struct file *, void *, filldir_t);1179         unsigned int (*poll) (struct file *, struct poll_table_struct *);1180         int (*ioctl) (struct inode *, struct f

18、ile *, unsigned int, unsigned long);1181         long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);1182         long (*compat_ioctl) (struct file *, unsigned int, unsigned long);1183         i

19、nt (*mmap) (struct file *, struct vm_area_struct *);1184         int (*open) (struct inode *, struct file *);1185         int (*flush) (struct file *, fl_owner_t id);1186         int (*release) (struct inode *,

20、 struct file *);1187         int (*fsync) (struct file *, struct dentry *, int datasync);1188         int (*aio_fsync) (struct kiocb *, int datasync);1189         int (*fasync) (int, struct file *, int);1190

21、60;        int (*lock) (struct file *, int, struct file_lock *);1191         ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);1192         unsigned long (*get_unmapped_area)(struct file

22、 *, unsigned long, unsigned long, unsigned long, unsigned long);1193         int (*check_flags)(int);1194         int (*dir_notify)(struct file *filp, unsigned long arg);1195         int (*flock) (struct file *

23、, int, struct file_lock *);1196         ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);1197         ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned

24、 int);1198         int (*setlease)(struct file *, long, struct file_lock *);1199 ;其中,藍(lán)色字體標(biāo)出部分,為與驅(qū)動(dòng)程序最為密切的部分。由于很多書中都對(duì)這些結(jié)構(gòu)體做了詳細(xì)的闡述,這里就不再贅述了。2.2 inode object        內(nèi)核用inode結(jié)構(gòu)在內(nèi)部表示文件,它和file結(jié)構(gòu)的不同之處在于:file表示打開的文件描述符,對(duì)單個(gè)文件,可能有多個(gè)表示打開的文件描述符的file結(jié)構(gòu),

25、但他們都指向同一個(gè)inode結(jié)構(gòu)。Inode結(jié)構(gòu)的詳細(xì)定義如下:593 struct inode 594         struct hlist_node       i_hash;595         struct list_head        i_list;596         struct list_h

26、ead        i_sb_list;597         struct list_head        i_dentry;598         unsigned long           i_ino;599      

27、60;  atomic_t                i_count;600         unsigned int            i_nlink;601         uid_t           &

28、#160;       i_uid;602         gid_t                   i_gid;603         dev_t                   i_rd

29、ev;604         u64                     i_version;605         loff_t                  i_size;606 #ifdef _NEED_I

30、_SIZE_ORDERED607         seqcount_t              i_size_seqcount;608 #endif609         struct timespec         i_atime;610         

31、;struct timespec         i_mtime;611         struct timespec         i_ctime;612         unsigned int            i_blkbits;613   &

32、#160;     blkcnt_t                i_blocks;614         unsigned short          i_bytes;615         umode_t         

33、        i_mode;616         spinlock_t              i_lock; /* i_blocks, i_bytes, maybe i_size */617         struct mutex         &

34、#160;  i_mutex;618         struct rw_semaphore     i_alloc_sem;619         const struct inode_operations   *i_op;/inode操作函數(shù)集合620         const struct file_operations  

35、60; *i_fop; /* former ->i_op->default_file_ops */621         struct super_block      *i_sb;622         struct file_lock        *i_flock;623         struct

36、 address_space    *i_mapping;624         struct address_space    i_data;625 #ifdef CONFIG_QUOTA626         struct dquot            *i_dquotMAXQUOTAS;627 #endif628    

37、;     struct list_head        i_devices;629         union 630                 struct pipe_inode_info  *i_pipe;631         

38、60;       struct block_device     *i_bdev;632                 struct cdev             *i_cdev;633         634   

39、60;     int                     i_cindex;635636         _u32                   i_generation;637638 #ifdef CONFIG_DNOTIFY639&#

40、160;        unsigned long           i_dnotify_mask; /* Directory notify events */640         struct dnotify_struct   *i_dnotify; /* for directory notifications */641 #endif642643 #ifdef CONFIG_IN

41、OTIFY644         struct list_head        inotify_watches; /* watches on this inode */645         struct mutex            inotify_mutex;  /* protects the watches

42、 list */646 #endif647648         unsigned long           i_state;649         unsigned long           dirtied_when;   /* jiffies of first dirtying */65

43、0651         unsigned int            i_flags;652653         atomic_t                i_writecount;654 #ifdef CONFIG_SECURITY655     

44、0;   void                    *i_security;656 #endif657         void                    *i_private; /* fs or device priva

45、te pointer */658 ;2.3 Super block object        Super block object對(duì)應(yīng)于一個(gè)特定的文件系統(tǒng),通常對(duì)應(yīng)于存放在磁盤扇區(qū)中的文件系統(tǒng)超級(jí)塊或文件系統(tǒng)控制塊,而對(duì)于非基于文件系統(tǒng)的文件,他們會(huì)在使用現(xiàn)場(chǎng)創(chuàng)建超級(jí)塊,并將其保存到內(nèi)存中。一下是結(jié)構(gòu)體的詳細(xì)描述:981 struct super_block 982         struct list_head      

46、0; s_list;         /* Keep this first */983         dev_t                   s_dev;          /* search index; _not_ kdev_t */984    

47、;     unsigned long           s_blocksize;985         unsigned char           s_blocksize_bits;986         unsigned char      

48、;     s_dirt;987         unsigned long long      s_maxbytes;     /* Max file size */988         struct file_system_type *s_type;989         const stru

49、ct super_operations   *s_op;990         struct dquot_operations *dq_op;991         struct quotactl_ops     *s_qcop;992         const struct export_operations *s_export_op;993 

50、        unsigned long           s_flags;994         unsigned long           s_magic;995         struct dentry      

51、     *s_root;996         struct rw_semaphore     s_umount;997         struct mutex            s_lock;998         int   &

52、#160;                 s_count;999         int                     s_syncing;1000         int     

53、60;               s_need_sync_fs;1001         atomic_t                s_active;1002 #ifdef CONFIG_SECURITY1003         void   

54、0;                *s_security;1004 #endif1005         struct xattr_handler    *s_xattr;10061007         struct list_head        s_inodes;  &

55、#160;    /* all inodes */1008         struct list_head        s_dirty;        /* dirty inodes */1009         struct list_head        s_io;&#

56、160;          /* parked for writeback */1010         struct list_head        s_more_io;      /* parked for more writeback */1011         struct hlist_head&

57、#160;      s_anon;         /* anonymous dentries for (nfs) exporting */1012         struct list_head        s_files;10131014         struct block_device   

58、  *s_bdev;1015         struct mtd_info         *s_mtd;1016         struct list_head        s_instances;1017         struct quota_info 

59、     s_dquot;        /* Diskquota specific options */10181019         int                     s_frozen;1020         wait_queu

60、e_head_t       s_wait_unfrozen;10211022         char s_id32;                          /* Informational name */10231024         voi

61、d                    *s_fs_info;     /* Filesystem private info */10251026         /*1027          * The next field is for VFS *only*. No filesystems

62、have any business1028          * even looking at it. You had been warned.1029          */1030         struct mutex s_vfs_rename_mutex;        /* Kludge */10311032    

63、;     /* Granularity of c/m/atime in ns.1033            Cannot be worse than a second */1034         u32                s_time_gran;10351036      

64、;   /*1037          * Filesystem subtype.  If non-empty the filesystem type field1038          * in /proc/mounts will be 'type.subtype'2.4 Identry object        Linux中把目錄也當(dāng)作文件,為了方便查找操作,虛擬文件系統(tǒng)(VFS)引入了目錄項(xiàng)的概念。每個(gè)dentry代表路徑中一個(gè)特定部分。由于驅(qū)動(dòng)程序很少涉及到dentry,所以在這里就不做描述了。3. 實(shí)例剖析Linux字符設(shè)備驅(qū)動(dòng)程序        Linux的變化真的是太快了。當(dāng)我們還在研讀最新版的LDD3(基于內(nèi)核)時(shí),而實(shí)際上,它的驅(qū)動(dòng)程序框架結(jié)構(gòu)已經(jīng)發(fā)生了很大的變化。當(dāng)我還在投入的學(xué)習(xí)scull示例驅(qū)動(dòng)程序的時(shí)候,我發(fā)現(xiàn),對(duì)于編寫一個(gè)字符設(shè)備驅(qū)動(dòng)程序,已經(jīng)有了新的變化。原本打算

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論