Linux內(nèi)核學(xué)習(xí):虛擬文件系統(tǒng)
Linux的成功因素之一是它具有與其它操作系統(tǒng)和諧共存的能力,其中代表作之一就是虛擬文件系統(tǒng)(VFS)。
VFS的思想是把不同類型文件的共同信息放入內(nèi)核,具體思路是通過(guò)Linux在用戶進(jìn)程(或C庫(kù))和文件系統(tǒng)之間引入了一個(gè)抽象層,該抽象層稱之為虛擬文件系統(tǒng)(VFS)。

VFS的任務(wù)主要是提供一種操作文件、目錄以及其他對(duì)象的統(tǒng)一方法還有它必須能夠與各種方法給出的具體文件系統(tǒng)實(shí)現(xiàn)達(dá)成妥協(xié)。
虛擬文件系統(tǒng)的類型
VFS的類型主要分三種:
基于磁盤(pán)的文件系統(tǒng):是在非易失介質(zhì)上存儲(chǔ)文件的經(jīng)典方法,用以在多次會(huì)話之間保持文件的內(nèi)容。
特殊文件系統(tǒng):在內(nèi)核中生成,是一種使用用戶應(yīng)用程序與用戶通訊的方法。它位于內(nèi)核軟件層,用來(lái)處理與Unix標(biāo)準(zhǔn)文件系統(tǒng)相關(guān)的所有系統(tǒng)調(diào)用(Linux的 proc文件系統(tǒng)就是這一類的最佳示例)
網(wǎng)絡(luò)文件系統(tǒng):是基于磁盤(pán)文件系統(tǒng)和虛擬文件系統(tǒng)之間的折中,這些文件系統(tǒng)允許輕易訪問(wèn)屬于其它網(wǎng)絡(luò)計(jì)算機(jī)的文件系統(tǒng)所包含的文件(常見(jiàn)的網(wǎng)絡(luò)文件系統(tǒng)有:NFS、Coda、AFS、CIFS、NCP等)
通用文件模型
通用文件模型嚴(yán)格反映傳統(tǒng)Unix文件系統(tǒng)的文件模型,從本質(zhì)上,Liunx不能對(duì)一個(gè)特點(diǎn)的函數(shù)進(jìn)行硬編碼來(lái)執(zhí)行諸如read() 和 ioctl() 這類的操作,而是對(duì)每個(gè)操作都必須使用一個(gè)指針,指向要訪問(wèn)的具體文件系統(tǒng)的適當(dāng)函數(shù)。通過(guò)通用文件模型,VFS使得用戶可以直接使用open()、read()、write() 這樣的調(diào)用而無(wú)須考慮具體這樣的文件系統(tǒng)。
VFS采用了面向?qū)ο蟮脑O(shè)計(jì)思路,使用了一組數(shù)據(jù)結(jié)構(gòu)來(lái)表示通用文件對(duì)象,這些對(duì)象組成了Linux的通用文件模型。
1)超級(jí)快對(duì)象(superblock object):存放已安裝文件系統(tǒng)有關(guān)的信息
superblock的數(shù)據(jù)結(jié)構(gòu)

2)索引節(jié)點(diǎn)對(duì)象(inode object):存放具體文件的一般信息(內(nèi)核在操作文件或目錄時(shí)需要的全部信息)。一個(gè)索引節(jié)點(diǎn)代表文件系統(tǒng)中的一個(gè)文件,但是索引節(jié)點(diǎn)僅當(dāng)文件被訪問(wèn)時(shí),才在內(nèi)存中創(chuàng)建。
inode的數(shù)據(jù)結(jié)構(gòu)

3)文件對(duì)象(file object):它代表由進(jìn)程打開(kāi)的文件。這類信息僅當(dāng)進(jìn)程訪問(wèn)期間存在于內(nèi)核內(nèi)存中。文件對(duì)象(不是物理文件)由相應(yīng)的open()系統(tǒng)調(diào)用創(chuàng)建,由close()系統(tǒng)調(diào)用撤銷。
file的數(shù)據(jù)結(jié)構(gòu)

4)目錄項(xiàng)對(duì)象(dentry object):不是指目錄,VFS把目錄作為一個(gè)文件看待,這里的目錄項(xiàng)對(duì)象指的是路徑的一個(gè)組成部分,與對(duì)應(yīng)文件進(jìn)行鏈接的有關(guān)信息。
dentry的數(shù)據(jù)結(jié)構(gòu)

VFS對(duì)象之間的關(guān)系如下:

進(jìn)程與VFS對(duì)象之間的交互如下:

目錄項(xiàng)目高速緩存(dcache)
為了最大限度地提高處理目錄項(xiàng)對(duì)象的效率,Linux使用目錄項(xiàng)高速緩存,它由2種類型的數(shù)據(jù)結(jié)構(gòu)組成:
一個(gè)處于
正在使用、未使用、負(fù)狀態(tài)的目錄對(duì)象的集合:正在使用和未使用的目錄項(xiàng)對(duì)象對(duì)應(yīng)一個(gè)有效的索引節(jié)點(diǎn),負(fù)狀態(tài)的目錄項(xiàng)對(duì)象沒(méi)有對(duì)應(yīng)的有效索引節(jié)點(diǎn)一個(gè)散列表,從中能夠快速獲取與給定的文件名和目錄名對(duì)應(yīng)的目錄項(xiàng)對(duì)象。
小結(jié)
VFS是一個(gè)膠水層,位于內(nèi)核的底層和用戶層之間。它提供了各種抽象數(shù)據(jù)結(jié)構(gòu)來(lái)表示文件和inode。而真實(shí)文件系統(tǒng)必須填充這些結(jié)構(gòu),使得應(yīng)用程序無(wú)需考慮底層文件系統(tǒng),總是可以使用同樣的接口訪問(wèn)和操作文件。
原文鏈接:https://lihaoquan.me/2019/2/16/linux-vfs.html
關(guān)注「開(kāi)源Linux」加星標(biāo),提升IT技能

