版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025界樁安裝合同 產(chǎn)品銷售合同
- 廢舊電池回收利用項(xiàng)目可行性研究報(bào)告申請(qǐng)報(bào)告
- 2025年高壓氧艙項(xiàng)目安全評(píng)估報(bào)告
- 滌棉手套行業(yè)深度研究報(bào)告
- 衛(wèi)東環(huán)保2024年決策水平分析報(bào)告-圖文
- 2025借款合同條例范文
- 高二通托盤行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 2024年煤炭工業(yè)節(jié)能減排行業(yè)發(fā)展趨勢(shì)及投資前景預(yù)測(cè)報(bào)告
- 中國基礎(chǔ)軟件服務(wù)行業(yè)發(fā)展?jié)摿Ψ治黾巴顿Y戰(zhàn)略研究報(bào)告
- 2023-2029年中國管道檢測(cè)行業(yè)發(fā)展前景預(yù)測(cè)及投資戰(zhàn)略咨詢報(bào)告
- 實(shí)驗(yàn)診斷學(xué)練習(xí)題庫(附參考答案)
- 網(wǎng)絡(luò)加速器提供商服務(wù)合同
- 2024版新能源汽車充電站電線電纜采購合同2篇
- 轉(zhuǎn)讓押金協(xié)議合同范例
- 國家藥包材檢驗(yàn)標(biāo)準(zhǔn)培訓(xùn)
- 腫瘤科危急重癥護(hù)理
- 江蘇省蘇州市2024-2025學(xué)年第一學(xué)期八年級(jí)英語期末模擬試卷(一)(含答案)
- 2024-2030年中國加速器行業(yè)發(fā)展趨勢(shì)及運(yùn)營模式分析報(bào)告版
- 護(hù)理查房深靜脈置管
- 運(yùn)動(dòng)障礙護(hù)理查房
- 計(jì)算與人工智能概論知到智慧樹章節(jié)測(cè)試課后答案2024年秋湖南大學(xué)
評(píng)論
0/150
提交評(píng)論