日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > Linux閱碼場
[導(dǎo)讀]本文主要講解文件系統(tǒng)掛載核心邏輯,暫不涉及掛載命名空間和綁定掛載等內(nèi)容(后面的內(nèi)容可能會(huì)涉及),且以ext2磁盤文件系統(tǒng)為例講解掛載。

1.開場白

  • 環(huán)境:處理器架構(gòu):arm64內(nèi)核源碼:linux-5.11ubuntu版本:20.04.1代碼閱讀工具:vim ctags cscope
我們知道,Linux系統(tǒng)中我們經(jīng)常將一個(gè)塊設(shè)備上的文件系統(tǒng)掛載到某個(gè)目錄下才能訪問這個(gè)文件系統(tǒng)下的文件,但是你有沒有思考過:為什么塊設(shè)備掛載之后才能訪問文件?掛載文件系統(tǒng)Linux內(nèi)核到底為我們做了哪些事情?是否可以不將文件系統(tǒng)掛載到具體的目錄下也能訪問?下面,本文將詳細(xì)講解Linxu系統(tǒng)中,文件系統(tǒng)掛載的奧秘。
注:本文主要講解文件系統(tǒng)掛載核心邏輯,暫不涉及掛載命名空間和綁定掛載等內(nèi)容(后面的內(nèi)容可能會(huì)涉及),且以ext2磁盤文件系統(tǒng)為例講解掛載。本專題文章分為上下兩篇,上篇主要介紹掛載全貌以及具體文件系統(tǒng)的掛載方法,下篇介紹如何通過掛載實(shí)例關(guān)聯(lián)掛載點(diǎn)和超級塊。

2. vfs 幾個(gè)重要對象

在這里我們不介紹整個(gè)IO棧,只說明和文件系統(tǒng)相關(guān)的vfs和具體文件系統(tǒng)層。我們知道在Linux中通過虛擬文件系統(tǒng)層VFS統(tǒng)一所有具體的文件系統(tǒng),提取所有具體文件系統(tǒng)的共性,屏蔽具體文件系統(tǒng)的差異。VFS既是向下的接口(所有文件系統(tǒng)都必須實(shí)現(xiàn)該接口),同時(shí)也是向上的接口(用戶進(jìn)程通過系統(tǒng)調(diào)用最終能夠訪問文件系統(tǒng)功能)。
下面我們來看下,vfs中幾個(gè)比較重要的結(jié)構(gòu)體對象:

2.1 file_system_type

這個(gè)結(jié)構(gòu)來描述一種文件系統(tǒng)類型,一般具體文件系統(tǒng)會(huì)定義這個(gè)結(jié)構(gòu),然后注冊到系統(tǒng)中;定義了具體文件系統(tǒng)的掛載和卸載方法,文件系統(tǒng)掛載時(shí)調(diào)用其掛載方法構(gòu)建超級塊、跟dentry等實(shí)例。
文件系統(tǒng)分為以下幾種:
1)磁盤文件系統(tǒng)
文件在非易失性存儲(chǔ)介質(zhì)上(如硬盤,flash),掉電文件不丟失。
如ext2,ext4,xfs
2)內(nèi)存文件系統(tǒng)
文件在內(nèi)存上,掉電丟失。
如tmpfs
3)偽文件系統(tǒng)
是假的文件系統(tǒng),是利用虛擬文件系統(tǒng)的接口(可以對用戶可見如proc、sysfs,也可以對用戶不可見內(nèi)核可見如sockfs,bdev)。
如proc,sysfs,sockfs,bdev
4)網(wǎng)絡(luò)文件系統(tǒng)
這種文件系統(tǒng)允許訪問另一臺(tái)計(jì)算機(jī)上的數(shù)據(jù),該計(jì)算機(jī)通過網(wǎng)絡(luò)連接到本地計(jì)算機(jī)。
如nfs文件系統(tǒng)
結(jié)構(gòu)體定義源碼路徑:include/linux/fs.h 2226

2.2 super_block

超級塊,用于描述塊設(shè)備上的一個(gè)文件系統(tǒng)總體信息(如文件塊大小,最大文件大小,文件系統(tǒng)魔數(shù)等),一個(gè)塊設(shè)備上的文件系統(tǒng)可以被掛載多次,但是內(nèi)存中只能有個(gè)super_block來描述(至少對于磁盤文件系統(tǒng)來說)。
結(jié)構(gòu)體定義源碼路徑:include/linux/fs.h 1414

2.3 mount

掛載描述符,用于建立超級塊和掛載點(diǎn)等之間的聯(lián)系,描述文件系統(tǒng)的一次掛載,一個(gè)塊設(shè)備上的文件系統(tǒng)可以被掛載多次,每次掛載內(nèi)存中有一個(gè)mount對象描述。
結(jié)構(gòu)體定義源碼路徑:fs/mount.h 39

2.4 inode

索引節(jié)點(diǎn)對象,描述磁盤上的一個(gè)文件元數(shù)據(jù)(文件屬性、位置等),有些文件系統(tǒng)需要從塊設(shè)備上讀取磁盤上的索引節(jié)點(diǎn),然后在內(nèi)存中創(chuàng)建vfs的索引節(jié)點(diǎn)對象,一般在文件第一次打開時(shí)創(chuàng)建。
結(jié)構(gòu)體定義源碼路徑:include/linux/fs.h 610

2.5 dentry

目錄項(xiàng)對象,用于描述文件的層次結(jié)構(gòu),從而構(gòu)建文件系統(tǒng)的目錄樹,文件系統(tǒng)將目錄當(dāng)作文件,目錄的數(shù)據(jù)由目錄項(xiàng)組成,而每個(gè)目錄項(xiàng)存儲(chǔ)一個(gè)目錄或文件的名稱和索引節(jié)點(diǎn)號等內(nèi)容。每當(dāng)進(jìn)程訪問一個(gè)目錄項(xiàng)就會(huì)在內(nèi)存中創(chuàng)建目錄項(xiàng)對象(如ext2路徑名查找中,通過查找父目錄數(shù)據(jù)塊的目錄項(xiàng),找到對應(yīng)文件/目錄的名稱,獲得inode號來找到對應(yīng)inode)。
結(jié)構(gòu)體定義源碼路徑:include/linux/dcache.h 90

2.6 file

文件對象,描述進(jìn)程打開的文件,當(dāng)進(jìn)程打開文件時(shí)會(huì)創(chuàng)建文件對象加入到進(jìn)程的文件打開表,通過文件描述符來索引文件對象,后面讀寫等操作都通過文件描述符進(jìn)行(一個(gè)文件可以被多個(gè)進(jìn)程打開,會(huì)由多個(gè)文件對象加入到各個(gè)進(jìn)程的文件打開表,但是inode只有一個(gè))。
結(jié)構(gòu)體定義源碼路徑:include/linux/fs.h 915

3. 掛載總體流程

3.1系統(tǒng)調(diào)用處理

用戶執(zhí)行掛載是通過系統(tǒng)調(diào)用路徑進(jìn)入內(nèi)核處理,拷貝用戶空間傳遞參數(shù)到內(nèi)核,掛載委托do_mount。
//fs/namespace.c
SYSCALL_DEFINE5(mount
參數(shù):
dev_name 要掛載的塊設(shè)備
dir_name 掛載點(diǎn)目錄
type 文件系統(tǒng)類型名
flags 掛載標(biāo)志
data 掛載選項(xiàng)
-> kernel_type = copy_mount_string(type);   //拷貝文件系統(tǒng)類型名到內(nèi)核空間
-> kernel_dev = copy_mount_string(dev_name) //拷貝塊設(shè)備路徑名到內(nèi)核空間 -> options = copy_mount_options(data) //拷貝掛載選項(xiàng)到內(nèi)核空間
-> do_mount(kernel_dev, dir_name, kernel_type, flags, options)  //掛載委托do_mount

3.2  掛載點(diǎn)路徑查找

掛載點(diǎn)路徑查找,掛載委托path_mount
do_mount
-> user_path_at(AT_FDCWD, dir_name, LOOKUP_FOLLOW,
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉