色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

介紹虛擬文件系統的原理與實現

Linux愛好者 ? 來源:Linux內核那些事 ? 2023-02-02 10:01 ? 次閱讀

在 Unix 的世界里,有句很經典的話:一切對象皆是文件。這句話的意思是說,可以將 Unix 操作系統中所有的對象都當成文件,然后使用操作文件的接口來操作它們。Linux 作為一個類 Unix 操作系統,也努力實現這個目標。

虛擬文件系統簡介

為了實現一切對象皆是文件這個目標,Linux 內核提供了一個中間層:虛擬文件系統(Virtual File System)。

如果大家使用過面向對象編程語言(如C++/Java等)的話,應該對接口這個概念并不陌生。而虛擬文件系統類似于面向對象中的接口,定義了一套標準的接口。開發者只需要實現這套接口,即可以使用操作文件的接口來操作對象。如下圖所示:

88541544-a233-11ed-bfe3-dac502259ad0.jpg

上圖中的藍色部分就是虛擬文件系統所在位置。

從上圖可以看出,虛擬文件系統為上層應用提供了統一的接口。如果某個文件系統實現了虛擬文件系統的接口,那么上層應用就能夠使用諸如open()、read()和write()等函數來操作它們。

今天,我們就來介紹虛擬文件系統的原理與實現。

虛擬文件系統原理

在闡述虛擬文件系統的原理前,我們先來介紹一個 Java 例子。通過這個 Java 例子,我們能夠更容易理解虛擬文件系統的原理。

一個Java例子

如果大家使用過 Java 編寫程序的話,那么就很容易理解虛擬文件系統了。我們使用 Java 的接口來模擬虛擬文件系統的定義:

publicinterfaceVFSFile{
intopen(Stringfile,intmode);
intread(intfd,byte[]buffer,intsize);
intwrite(intfd,byte[]buffer,intsize);
...
}

上面定義了一個名為VFSFile的接口,接口中定義了一些方法,如open()、read()和write()等。現在我們來定義一個名為Ext3File的對象來實現這個接口:

publicclassExt3FileimplementsVFSFile{
@Override
publicintopen(Stringfile,intmode){
...
}

@Override
publicintread(intfd,byte[]buffer,intsize){
...
}

@Override
publicintwrite(intfd,byte[]buffer,intsize){
...
}

...
}

現在我們就能使用VFSFile接口來操作Ext3File對象了,如下代碼:

publicclassMain(){
publicstaticvoidmain(String[]args){
VFSFilefile=newExt3File();

intfd=file.open("/tmp/file.txt",0);
...
}
}

從上面的例子可以看出,底層對象只需要實現VFSFile接口,就可以使用VFSFile接口相關的方法來操作對象,用戶完全不需要了解底層對象的實現過程。

虛擬文件系統原理

上面的 Java 例子已經大概說明虛擬文件系統的原理,但由于 Linux 是使用 C 語言來編寫的,而 C 語言并沒有接口這個概念。所以,Linux 內核使用了一些技巧來模擬接口這個概念。

下面來介紹一下 Linux 內核是如何實現的。

1. file結構

為了模擬接口,Linux 內核定義了一個名為file的結構體,其定義如下:

structfile{
...
conststructfile_operations*f_op;
...
};

在 file 結構中,最為重要的一個字段就是f_op,其類型為file_operations結構。而file_operations結構是由一組函數指針組成,其定義如下:

structfile_operations{
...
loff_t(*llseek)(structfile*,loff_t,int);
ssize_t(*read)(structfile*,char__user*,size_t,loff_t*);
ssize_t(*write)(structfile*,constchar__user*,size_t,loff_t*);
...
int(*open)(structinode*,structfile*);
...
};

從file_operations結構的定義可以隱約看到接口的影子,所以可以猜想出,如果實現了file_operations結構中的方法,應該就能接入到虛擬文件系統中。

在 Linux 內核中,file結構代表著一個被打開的文件。所以,只需要將file結構的f_op字段設置成不同文件系統實現好的方法集,那么就能夠使用不同文件系統的功能。

這個過程在__dentry_open()函數中實現,如下所示:

staticstructfile*
__dentry_open(structdentry*dentry,
structvfsmount*mnt,
tructfile*f,
int(*open)(structinode*,structfile*),
conststructcred*cred)
{
...
inode=dentry->d_inode;
...
//設置file結構的f_op字段為底層文件系統實現的方法集
f->f_op=fops_get(inode->i_fop);
...
returnf;
}

設置好file結構的f_op字段后,虛擬文件系統就能夠使用通用的接口來操作此文件了。調用過程如下:

8863a5cc-a233-11ed-bfe3-dac502259ad0.png

2. file_operations結構

底層文件系統需要實現虛擬文件系統的接口,才能被虛擬文件系統使用。也就是說,底層文件系統需要實現file_operations結構中的方法集。

一般底層文件系統會在其內部定義好file_operations結構,并且填充好其方法集中的函數指針。如minix文件系統就定義了一個名為minix_file_operations的file_operations結構。其定義如下:

//文件:fs/minix/file.c

conststructfile_operationsminix_file_operations={
.llseek=generic_file_llseek,
.read=do_sync_read,
.aio_read=generic_file_aio_read,
.write=do_sync_write,
.aio_write=generic_file_aio_write,
.mmap=generic_file_mmap,
.fsync=generic_file_fsync,
.splice_read=generic_file_splice_read,
};

也就是說,如果當前使用的是 minix 文件系統,當使用read()函數讀取其文件的內容時,那么最終將會調用do_sync_read()函數來讀取文件的內容。

3. dentry結構

到這里,虛擬文件系統的原理基本分析完畢,但還有兩個非常重要的結構要介紹一下的:dentry和inode。

dentry結構表示一個打開的目錄項,當我們打開文件/usr/local/lib/libc.so文件時,內核會為文件路徑中的每個目錄創建一個dentry結構。如下圖所示:

887c2a02-a233-11ed-bfe3-dac502259ad0.png

可以看到,file結構有個指向dentry結構的指針,如下所示:

structfile{
...
structpathf_path;
...
conststructfile_operations*f_op;
...
};

structpath{
...
structdentry*dentry;
};

與文件類似,目錄也有相關的操作接口,所以在dentry結構中也有操作方法集,如下所示:

structdentry{
...
structdentry*d_parent;//父目錄指針
structqstrd_name;//目錄名字
structinode*d_inode;//指向inode結構
...
conststructdentry_operations*d_op;//操作方法集
...
};

其中的d_op字段就是目錄的操作方法集。

內核在打開文件時,會為路徑中的每個目錄創建一個dentry結構,并且使用d_parent字段來指向其父目錄項,這樣就能通過d_parent字段來追索到根目錄。

4. inode結構

在 Linux 內核中,inode結構表示一個真實的文件。為什么有了dentry結構還需要inode結構呢?這是因為 Linux 存在硬鏈接的概念。

例如使用以下命令為/usr/local/lib/libc.so文件創建一個硬鏈接:

ln/usr/local/lib/libc.so/tmp/libc.so

現在/usr/local/lib/libc.so和/tmp/libc.so指向同一個文件,但它們的路徑是不一樣的。所以,就需要引入inode結構了。如下圖所示:

888c689a-a233-11ed-bfe3-dac502259ad0.png

由于/usr/local/lib/libc.so和/tmp/libc.so指向同一個文件,所以它們都使用同一個inode對象。

inode 結構保存了文件的所有屬性值,如文件的創建時間、文件所屬用戶和文件的大小等。其定義如下所示:

structinode{
...
uid_ti_uid;//文件所屬用戶
gid_ti_gid;//文件所屬組
...
structtimespeci_atime;//最后訪問時間
structtimespeci_mtime;//最后修改時間
structtimespeci_ctime;//文件創建時間
...
unsignedshorti_bytes;//文件大小
...
conststructfile_operations*i_fop;//文件操作方法集(用于設置file結構)
...
};

我們注意到 inode 結構有個類型為file_operations結構的字段i_fop,這個字段保存了文件的操作方法集。當用戶調用open()系統調用打開文件時,內核將會使用inode結構的i_fop字段賦值給file結構的f_op字段。我們再來重溫下賦值過程:

staticstructfile*
__dentry_open(structdentry*dentry,
structvfsmount*mnt,
tructfile*f,
int(*open)(structinode*,structfile*),
conststructcred*cred)
{
...
//文件對應的inode對象
inode=dentry->d_inode;
...
//使用inode結構的i_fop字段賦值給file結構的f_op字段
f->f_op=fops_get(inode->i_fop);
...
returnf;
}

總結

本文主要介紹了虛擬文件系統的基本原理,從分析中可以發現,虛擬文件系統使用了類似于面向對象編程語言中的接口概念。正是有了虛擬文件系統,Linux 才能支持各種各樣的文件系統。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2970

    瀏覽量

    104810
  • UNIX操作系統

    關注

    0

    文章

    13

    瀏覽量

    15306
  • C語言
    +關注

    關注

    180

    文章

    7605

    瀏覽量

    136993
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21656

原文標題:細說 Linux 虛擬文件系統原理

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux平臺/proc虛擬文件系統詳解

    Linux 內核提供了一種通過 /proc 文件系統,在運行時訪問內核內部數據結構、改變內核設置的機制。proc文件系統是一個偽文件系統(即虛擬文件系統),它只存在內存當中,而不占用外
    發表于 06-08 10:49 ?1511次閱讀
    Linux平臺/proc<b class='flag-5'>虛擬文件系統</b>詳解

    Linux虛擬文件系統的基礎知識

    虛擬文件系統是一個很龐大的架構,如果要分析的面面俱到,會顯得特別復雜而笨拙,讓人看著看著,就不知所云了(當然主要還是筆者太菜),所以這篇博客,以 open() 函數為切入點,來試著分析分析VFS文件系統的運轉機理,本文的代碼來源于 linux3.4.2。
    發表于 08-25 12:17 ?357次閱讀
    Linux<b class='flag-5'>虛擬文件系統</b>的基礎知識

    STM32F429 sdio虛擬文件系統的相關資料推薦

    SD卡虛擬文件系統是在我之前的SPI虛擬文件系統的基礎上做的,所以只會介紹SD卡配置部分,DFS配置跟之前的一樣就不詳細介紹了。1.添加文件
    發表于 12-13 06:02

    VFS虛擬文件系統描述

    1.VFS——虛擬文件系統,是文件系統對外的接口2.cache——高速緩沖存儲器3.linux的每個文件都是由 i 節點的結構體表示,i 節點包含對文件的描述:
    發表于 12-22 06:56

    Linux虛擬文件系統實現技術探討

    文章論述了 Linux 文件系統的邏輯關系和邏輯結構,對VFS 中幾個主要的數據結構進行了分析,剖析了Linux 文件系統 中一個物理文件系統的安裝與注冊、VFS的產生,以及通過VFS管理和訪問
    發表于 06-08 17:51 ?32次下載
    Linux<b class='flag-5'>虛擬文件系統</b><b class='flag-5'>實現</b>技術探討

    Xilinx Zynq制作修改根文件系統的方法

    proc文件系統是用來提供內核和進程信息的虛擬文件系統,使用內核自動生成的文件,加載完成一定要能查到很多信息才對。
    發表于 07-13 08:31 ?3575次閱讀

    linux 虛擬文件可以系統實現

    虛擬文件系統(VFS)是linux內核和具體I/O設備之間的封裝的一層共通訪問接口,通過這層接口,linux內核可以以同一的方式訪問各種I/O設備。
    發表于 05-04 16:56 ?503次閱讀
    linux <b class='flag-5'>虛擬文件</b>可以<b class='flag-5'>系統</b><b class='flag-5'>實現</b>

    嵌入式Linux常用文件系統

    Linux支持很多文件系統,在選擇時應根據應用的功能選擇文件系統 內核只認識VFS(虛擬文件系統),不同的文件系統實現的都是和VFS的
    發表于 05-04 17:19 ?2403次閱讀
    嵌入式Linux常用<b class='flag-5'>文件系統</b>

    簡單介紹Linux虛擬文件系統–VFS

    Linux中可以支持多種文件系統,而且支持各種文件系統之間相互訪問,這是因為有一個虛擬文件系統虛擬文件系統也叫虛擬文件系統轉換(Virtu
    發表于 04-24 14:35 ?1381次閱讀

    嵌入式Linux文件系統詳細介紹

    Linux支持多種文件系統,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,為了對各類文件系統進行統一管理,Linux引入了虛擬文件系統VFS(Virtual File System)
    發表于 04-27 19:23 ?3899次閱讀
    嵌入式Linux<b class='flag-5'>文件系統</b>詳細<b class='flag-5'>介紹</b>

    linux文件系統中的虛擬文件系統設計詳解

    Linux 中允許眾多不同的文件系統共存,如 ext2, ext3, vfat 等。通過使用同一套文件 I/O 系統 調用即可對 Linux 中的任意文件進行操作而無需考慮其所在的具體
    發表于 04-02 14:37 ?1825次閱讀
    linux<b class='flag-5'>文件系統</b>中的<b class='flag-5'>虛擬文件系統</b>設計詳解

    如何區別Linux文件系統呢?

    虛擬文件系統是一種神奇的抽象,它使得 “一切皆文件” 哲學在 Linux 中成為了可能。
    的頭像 發表于 08-09 18:00 ?3707次閱讀

    深入剖析Linux內核虛擬文件系統

    虛擬文件系統(Virtual File System,簡稱VFS)是Linux內核的子系統之一,它為用戶程序提供文件文件系統操作的統一接口,屏蔽不同
    的頭像 發表于 05-14 15:53 ?3085次閱讀
    深入剖析Linux內核<b class='flag-5'>虛擬文件系統</b>

    RT-Thread文檔_虛擬文件系統

    RT-Thread文檔_虛擬文件系統
    發表于 02-22 18:42 ?1次下載
    RT-Thread文檔_<b class='flag-5'>虛擬文件系統</b>

    Jtti:Linux中虛擬文件系統和容器化的關系

    在Linux中,虛擬文件系統(VFS)和容器化技術之間有密切的關系。容器化是指通過使用容器來運行應用程序,而容器本質上是在宿主機上運行的獨立進程,它們通常共享宿主機的操作系統內核和部分文件系統
    的頭像 發表于 11-27 15:38 ?155次閱讀
    主站蜘蛛池模板: 久久精品av| 理论937| 青青草原国产| 52av我爱| 免费一区在线观看| 99国产精品| 暖暖日本免费播放| 一个人看的WWW高清电影| 国产人妻麻豆蜜桃色69| 亚洲国产精品无码中文在线| 含羞草影院AE在线观看| 又亲又揉摸下面视频免费看| 性XXXXX搡XXXXX搡景甜| 国产精品涩涩涩视频网站| 性夜影院午夜看片| 黄色三级视频网站| 在线观看亚洲免费人成网址 | 青柠在线观看免费播放电影| 被免费网站在线视频| 色欲久久精品AV无码| 含羞草影院免费区| 91se在线看片国产免费观看| 欧美性色生活片天天看99顶级| 草莓视频在线观看免费观看高清| 热99re久久精品国产首页| 免费中文字幕视频| 床伴在线观看免费高清完整泰剧第四集| 亚洲人成网站7777视频| 欧美性情video sexo视频| 狠狠狠色丁香婷婷综合久久| vr亚洲成年网址在线观看| 亚洲欧洲日韩天堂无吗| 日本美女搞基视频| 久久天堂网| 国产色精品久久人妻99蜜桃麻豆| 94色94色永久网站| 亚洲精品久久久无码 | 日本护士在线观看| 久艾草在线精品视频在线观看| 成人区精品一区二区不卡AV免费| 印度学生xxxxx性14一16|