最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一文讀懂|Linux 虛擬文件系統(tǒng)(VFS)

2023-08-16 14:53 作者:補給站Linux內(nèi)核  | 我要投稿

前言

虛擬文件系統(tǒng)是一個很龐大的架構(gòu),如果要分析的面面俱到,會顯得特別復(fù)雜而笨拙,讓人看著看著,就不知所云了(當(dāng)然主要還是筆者太菜),所以這篇博客,以?open()?函數(shù)為切入點,來試著分析分析VFS文件系統(tǒng)的運轉(zhuǎn)機理,本文的代碼來源于 linux3.4.2。

基礎(chǔ)知識

首先我們來看一張圖:

(圖1)

從這張圖中,我們可以看出,系統(tǒng)調(diào)用函數(shù)并不是直接操作真正的文件系統(tǒng),而是通過一層中間層,也就是我們說的虛擬文件系統(tǒng),為什么要有虛擬文件系統(tǒng)?

linux中常見的文件系統(tǒng)有三類:基于磁盤的文件系統(tǒng);基于內(nèi)存的文件系統(tǒng);網(wǎng)絡(luò)文件系統(tǒng),(這三類文件系統(tǒng)是共存于文件系統(tǒng)層,為不同類型的數(shù)據(jù)提供存儲服務(wù),這三類文件系統(tǒng)格式是不一樣的,也就是說如果不通過虛擬文件系統(tǒng),直接對真正的文件系統(tǒng)進(jìn)行讀取,有種類型的文件系統(tǒng),你就得寫幾種相對應(yīng)的讀取函數(shù)),所以說虛擬文件的出現(xiàn)(VFS)就是為了通過使用同一套文件 I/O 系統(tǒng) 調(diào)用即可對 Linux 中的任意文件進(jìn)行操作而無需考慮其所在的具體文件系統(tǒng)格式。

VFS的數(shù)據(jù)結(jié)構(gòu)

VFS依靠四個主要的數(shù)據(jù)結(jié)構(gòu)和一些輔助的數(shù)據(jù)結(jié)構(gòu)來描述其結(jié)構(gòu)信息,這些數(shù)據(jù)結(jié)構(gòu)表現(xiàn)得就像是對象;每個主要對象中都包含由操作函數(shù)表構(gòu)成的操作對象,這些操作對象描述了內(nèi)核針對這幾個主要的對象可以進(jìn)行的操作。

1、超級塊對象

存儲一個已安裝的文件系統(tǒng)的控制信息,代表一個已安裝的文件系統(tǒng);每次一個實際的文件系統(tǒng)被安裝時, 內(nèi)核會從磁盤的特定位置讀取一些控制信息來填充內(nèi)存中的超級塊對象。一個安裝實例和一個超級塊對象一一對應(yīng)。超級塊通過其結(jié)構(gòu)中的一個域s_type記錄它所屬的文件系統(tǒng)類型。


2、索引節(jié)點對象

索引節(jié)點對象存儲了文件的相關(guān)信息,代表了存儲設(shè)備上的一個實際的物理文件。當(dāng)一個 文件首次被訪問時,內(nèi)核會在內(nèi)存中組裝相應(yīng)的索引節(jié)點對象,以便向內(nèi)核提供對一個文件進(jìn)行操 作時所必需的全部信息;這些信息一部分存儲在磁盤特定位置,另外一部分是在加載時動態(tài)填充的。

3、目錄項對象

引入目錄項的概念主要是出于方便查找文件的目的。一個路徑的各個組成部分,不管是目錄還是 普通的文件,都是一個目錄項對象。如:在路徑?/home/source/test.c?中,目錄?/、home、source?和文件?test.c都對應(yīng)一個目錄項對象。不同于前面的兩個對象,目錄項對象沒有對應(yīng)的磁盤數(shù)據(jù)結(jié)構(gòu),VFS 在遍歷路徑名的過程中現(xiàn)場將它們逐個地解析成目錄項對象。

4、文件對象

文件對象是已打開的文件在內(nèi)存中的表示,主要用于建立進(jìn)程和磁盤上的文件的對應(yīng)關(guān)系。它由?sys_open()?現(xiàn)場創(chuàng)建,由?sys_close()?銷毀。文件對象和物理文件的關(guān)系有點像進(jìn)程和程序的關(guān)系一樣。

當(dāng)我們站在用戶空間來看待 VFS,我們像是只需與文件對象打交道,而無須關(guān)心超級塊,索引節(jié)點或目錄項。因為多個進(jìn)程可以同時打開和操作 同一個文件,所以同一個文件也可能存在多個對應(yīng)的文件對象。

文件對象僅僅在進(jìn)程觀點上代表已經(jīng)打開的文件,它 反過來指向目錄項對象(反過來指向索引節(jié)點)。一個文件對應(yīng)的文件對象可能不是惟一的,但是其對應(yīng)的索引節(jié)點和 目錄項對象無疑是惟一的。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ?


正篇

經(jīng)過基礎(chǔ)知識點的介紹后,我們開始來探究,當(dāng)我們通?open()?嘗試去打開一個文件的時候,Linux 內(nèi)部是如何找到對應(yīng)的存儲在硬件上的該文件的數(shù)據(jù)。

(圖2)

(圖3)

首先我們來看看上面這兩張圖,files_struct?主要就是一個?file?指針數(shù)組,我們通常說的文件描述符是一個整數(shù),而這個整數(shù)正好可以作為下標(biāo),從而從?files_struct?中獲得?file?結(jié)構(gòu)。

task_struct?為進(jìn)程描述符,代表的是打開文件的這么一個動作,這里我想表達(dá)的知識點:當(dāng)文件第一次被打開時(打開成功),會建立起如上圖所示的聯(lián)系,返回?fd?文件描述符就這樣和底層的存儲結(jié)構(gòu)聯(lián)系在了一起,fd?作為文件描述符,文件作為數(shù)據(jù)的載體,我們可以將它們理解為密碼和保險柜之間的關(guān)系,第一打開文件就是相當(dāng)初始化時設(shè)置密碼(建立起了密碼和保險柜的聯(lián)系),當(dāng)我們以后再需要拿取保險柜中的東西時,只需要通過第一次設(shè)置的密碼就可以對保險柜進(jìn)程操作。

內(nèi)核中,對應(yīng)于每個進(jìn)程都有一個文件描述符表,表示這個進(jìn)程打開的所有文件。文件描述表中每一項都是一個指針,指向一個用于描述打開的文件的數(shù)據(jù)塊 ———?file?對象,file?對象中描述了文件的打開模式,讀寫位置等重要信息,當(dāng)進(jìn)程打開一個文件時,內(nèi)核就會創(chuàng)建一個新的?file?對象。

需要注意的是,file?對象不是專屬于某個進(jìn)程的,不同進(jìn)程的文件描述符表中的指針可以指向相同的?file?對象,從而共享這個打開的文件。?file?對象有引用計數(shù),記錄了引用這個對象的文件描述符個數(shù),只有當(dāng)引用計數(shù)為0時,內(nèi)核才銷毀?file?對象,因此某個進(jìn)程關(guān)閉文件,不影響與之共享同 一個?file?對象的進(jìn)程.

下面我們來分析具體的代碼。

應(yīng)用層:

應(yīng)用程序在操作任何一個文件之前,必須先調(diào)用?open()?來打開該文件,即通知內(nèi)核新建一個代表該文件的結(jié)構(gòu),并且返回該文件的描述符(一個整數(shù)),該描述符在進(jìn)程內(nèi)唯一。所用到函數(shù)為?open()

內(nèi)核層:

當(dāng)?open()?系統(tǒng)調(diào)用進(jìn)入內(nèi)核時候,最終調(diào)用的函數(shù)為:

該函數(shù)位于?fs/open.c?中,下面將會分析其具體的實現(xiàn)過程。

該函數(shù)主要調(diào)用?do_sys_open()?來完成打開工作,do_sys_open()?的代碼分析如下。

(圖4)

從代碼和流程圖的分析中我們知道了,fd?和?file?是如何建立聯(lián)系 (file?對象中包含一個指針,指向?dentry?對象。dentry?對象代表一個獨立的文件路徑,如果一個文件路徑被打開多次,那么會建立多個?file?對象,但它們都指向同一個?dentry?對象。dentry?對象中又包含一個指向?inode?對象的指針。inode?對象代表一個獨立文件。因為存在硬鏈接與符號鏈接,因此不同的?dentry?對象可以指向相同的?inode?對象。inode?對象包含了最終對文件進(jìn)行操作所需的所有信息,如文件系統(tǒng)類型、文件的操作方法、文件的權(quán)限、訪問日期等)。

那我們反向思考一下,現(xiàn)在我們已經(jīng)得到?fd,如何找到對應(yīng)?file, 在當(dāng)前進(jìn)程中我們保留著文件描述符,文件描述符中(files_structs),文件描述符中又保留著文件描述表(fatable),通過文件描述符表中?file?類型的指針數(shù)組對應(yīng)的?fd?的項,我們可以找到?file。

這篇文章到這里就算結(jié)束了,還留有一個工作沒有完成,如?do_filp_open(dfd, tmp, flags, mode)?是如何得到?file?,這是一個很復(fù)雜的過程,以后有空,筆者會嘗試著去分析。


原文作者:Linux內(nèi)核那些事




一文讀懂|Linux 虛擬文件系統(tǒng)(VFS)的評論 (共 條)

分享到微博請遵守國家法律
镇坪县| 卓资县| 日喀则市| 安庆市| 曲松县| 双鸭山市| 汕头市| 磴口县| 遵义市| 鹤山市| 莱芜市| 望江县| 林州市| 宝清县| 手游| 阿坝县| 通城县| 将乐县| 电白县| 罗源县| 东丰县| 堆龙德庆县| 临漳县| 马山县| 邢台县| 阿拉善右旗| 吴旗县| 公安县| 灌云县| 龙陵县| 樟树市| 和硕县| 宜丰县| 金昌市| 大丰市| 奉贤区| 南川市| 探索| 七台河市| 吉林省| 新乡市|