大部分字符驅(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 { 結(jié)構(gòu)還有很多的操作因?yàn)檫€沒有學(xué)會(huì),就沒有多做介紹,(ioctl函數(shù)操作在2.6.35之后就變成了unlocked_ioctl、compat_ioctl其實(shí)作用也不是很大 也沒有做介紹,以后有機(jī)會(huì)再做介紹)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è)備 . . . }; 當(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 { 三、inode結(jié)構(gòu)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) }; 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)圖解 ![]() |
|