1. 程式人生 > >3. file、inode結構體及chardevs數組等相關知識解析

3. file、inode結構體及chardevs數組等相關知識解析

內核源碼 art 結構 是否 pri lse 區分 功能 好的

https://blog.csdn.net/zqixiao_09/article/details/50850004
下圖描述了Linux中虛擬文件系統,一般的設備文件與設備驅動程序間的函數調用關系
技術分享圖片
上圖展現了一個應用程序調用字符設備驅動的過程,在設備驅動程序的設計中,一般而言,會關系file和inode這兩個結構體。
用戶空間使用open()函數打開一個字符設備fd = open("/dev/hello", o_READ);這一函數會調用兩個數據結構struct inode{}&struct file{}.二者均在虛擬文件系統VFS處,下面對這兩個數據結構進行解析:
1、file文件結構體
(1)在設備驅動中,這是非常重要的數據結構
(2)這裏的file與用戶空間出現中的FILE指針式不同的,用戶空間FILE是定義在C庫中,從來不會出現在內核中。而struct file,確是內核中的數據結構,因此,它也不會出現在用戶層程序中。
(3)file結構體指示一個已經打開的文件(設備對應設備文件),其實系統中每個打開的文件在內核空間都有一個相應的struct file結構體,它由內核在打開文件時創建,並傳遞給在文件上進程操作的任何函數,直至文件被關閉。如果文件被關閉,內核就會釋放相應的數據結構。
(4)在內核源碼中,struct file要麽表示為file,或者為filp(意指“file pointer”), 註意區分一點,file指的是struct file本身,而filp是指向這個結構體的指針。
下面是幾個重要成員
a -- fmode_t f_mode;
此文件模式通過FMODE_READ, FMODE_WRITE識別了文件為可讀的,可寫的,或者是二者。在open或ioctl函數中可能需要檢查此域以確認文件的讀/寫權限,你不必直接去檢測讀或寫權限,因為在進行octl等操作時內核本身就需要對其權限進行檢測。
b -- loff_t f_pos;
當前讀寫文件的位置。為64位。如果想知道當前文件當前位置在哪,驅動可以讀取這個值而不會改變其位置。對read,write來說,當其接收到一個loff_t型指針作為其最後一個參數時,他們的讀寫操作便作更新文件的位置,而不需要直接執行filp ->f_pos操作。而llseek方法的目的就是用於改變文件的位置。
c -- unsigned int f_flags;
文件標誌,如O_RDONLY, O_NONBLOCK以及O_SYNC。在驅動中還可以檢查O_NONBLOCK標誌查看是否有非阻塞請求。其它的標誌較少使用。特別地註意的是,讀寫權限的檢查是使用f_mode而不是f_flog。所有的標量定義在頭文件中
d -- struct file_operations *f_op;
與文件相關的各種操作。當文件需要迅速進行各種操作時,內核分配這個指針作為它實現文件打開,讀,寫等功能的一部分。filp->f_op 其值從未被內核保存作為下次的引用,即你可以改變與文件相關的各種操作,這種方式效率非常高。

e -- void *private_data;
在驅動調用open方法之前,open系統調用設置此指針為NULL值。你可以很自由的將其做為你自己需要的一些數據域或者不管它,如,你可以將其指向一個分配好的數據,但是你必須記得在file struct被內核銷毀之前在release方法中釋放這些數據的內存空間。private_data用於在系統調用期間保存各種狀態信息是非常有用的。

/*********************************/

3. file、inode結構體及chardevs數組等相關知識解析