學(xué)號:16020311003? ? 姓名:楊虎成
【嵌牛導(dǎo)讀】Linux支持多種文件系統(tǒng)翔始,文件系統(tǒng)接口實現(xiàn)為分層的體系結(jié)構(gòu)滥嘴,將用戶接口層售碳、文件系統(tǒng)實現(xiàn)和操作存儲設(shè)備的驅(qū)動程序分隔開
【嵌牛鼻子】Linux的每個文件系統(tǒng)的所有細(xì)節(jié)進(jìn)行抽象匈勋,使得不同的文件系統(tǒng)在Linux核心以及系統(tǒng)中運行的其他進(jìn)程看來,都是相同的庆揩,這種抽象的結(jié)構(gòu)就是通用文件模型
【嵌牛提問】Linux文件系統(tǒng)如何移植設(shè)備上的數(shù)據(jù)
【嵌牛正文】
嵌入式ARM
一俐东、文件系統(tǒng)的體系結(jié)構(gòu)
文件系統(tǒng)是對存儲設(shè)備上的數(shù)據(jù)和元數(shù)據(jù)進(jìn)行組織的機制,便于用戶和操作系統(tǒng)的交互订晌。Linux支持多種文件系統(tǒng)虏辫,文件系統(tǒng)接口實現(xiàn)為分層的體系結(jié)構(gòu),將用戶接口層锈拨、文件系統(tǒng)實現(xiàn)和操作存儲設(shè)備的驅(qū)動程序分隔開砌庄。
用戶空間包含一些應(yīng)用程序(例如,文件系統(tǒng)的使用者)和 GNU C庫(glibc),為文件系統(tǒng)調(diào)用(打開娄昆、讀取佩微、寫和關(guān)閉)提供用戶接口。系統(tǒng)調(diào)用接口的作用就像是交換器萌焰,將系統(tǒng)調(diào)用從用戶空間發(fā)送到內(nèi)核空間中的適當(dāng)端點哺眯。
VFS 是底層文件系統(tǒng)的主要接口,會導(dǎo)出一組接口扒俯,抽象到各個文件系統(tǒng)奶卓。有兩個針對文件系統(tǒng)對象的緩存(inode 和 dentry),用于緩存最近使用過的文件系統(tǒng)對象撼玄。
每個文件系統(tǒng)的實現(xiàn)(比如 ext2夺姑、yaffs2等等)導(dǎo)出一組通用接口,供VFS使用掌猛。緩沖區(qū)緩存會緩存文件系統(tǒng)和相關(guān)塊設(shè)備之間的請求瑟幕。例如,對底層設(shè)備驅(qū)動程序的讀寫請求會通過緩沖區(qū)緩存來傳遞留潦,允許在緩沖區(qū)緩存請求,減少訪問物理設(shè)備的次數(shù)辣往,加快訪問速度兔院。以最近使用(LRU)列表的形式管理緩沖區(qū)緩存。但是站削,可以使用sync命令將緩沖區(qū)緩存中的請求發(fā)送到存儲媒體(迫使所有未寫的數(shù)據(jù)發(fā)送到設(shè)備驅(qū)動程序坊萝,進(jìn)而發(fā)送到存儲設(shè)備)。
二许起、虛擬文件系統(tǒng)層
VFS 作為文件系統(tǒng)接口的根層十偶。VFS 記錄當(dāng)前支持的文件系統(tǒng)以及當(dāng)前掛裝的文件系統(tǒng)。VFS并不是一種實際的文件系統(tǒng)园细,只存在于內(nèi)存中惦积,不存在于任何外存空間。VFS在系統(tǒng)啟動時建立猛频,在系統(tǒng)關(guān)閉時消亡狮崩。
可以使用一組注冊函數(shù)在Linux中動態(tài)地添加或刪除文件系統(tǒng)。kernel保存當(dāng)前支持的文件系統(tǒng)的列表鹿寻,可以通過 /proc 文件系統(tǒng)在用戶空間中查看這個列表睦柴。proc虛擬文件系統(tǒng)還顯示當(dāng)前與所支持文件系統(tǒng)相關(guān)聯(lián)的設(shè)備。在Linux中添加新文件系統(tǒng)的方法是調(diào)用register_filesystem毡熏,函數(shù)的參數(shù)定義一個文件系統(tǒng)結(jié)構(gòu)(file_system_type)的引用坦敌,文件系統(tǒng)結(jié)構(gòu)定義了文件系統(tǒng)的名稱、一組屬性和兩個超級塊函數(shù)。register_filesystem函數(shù)也可以注銷文件系統(tǒng)狱窘。
在注冊新的文件系統(tǒng)時杜顺,會把要注冊的新文件系統(tǒng)及其相關(guān)信息添加到 file_systems鏈表中(linux/include/linux/fs.h)。file_systems列表定義可以支持的文件系統(tǒng)训柴。在命令行上輸入cat /proc/filesystems哑舒,就可以查看當(dāng)前l(fā)inux系統(tǒng)支持的文件系統(tǒng)類型。
VFS 中維護(hù)的另一個結(jié)構(gòu)是掛載的文件系統(tǒng)幻馁,提供當(dāng)前掛載的文件系統(tǒng)(見 linux/include/linux/mount.h)洗鸵,鏈接超級塊結(jié)構(gòu)。
三仗嗦、文件的結(jié)構(gòu)
VFS對Linux的每個文件系統(tǒng)的所有細(xì)節(jié)進(jìn)行抽象膘滨,使得不同的文件系統(tǒng)在Linux核心以及系統(tǒng)中運行的其他進(jìn)程看來,都是相同的稀拐,這種抽象的結(jié)構(gòu)就是通用文件模型火邓,由超級塊(superblock)、inode德撬、dentry 和文件組成铲咨。超級塊在每個文件系統(tǒng)的根上,用于描述和維護(hù)文件系統(tǒng)的狀態(tài)蜓洪。文件系統(tǒng)中管理的每個文件(文件纤勒、目錄、設(shè)備隆檀,linux中一切皆是文件)在 Linux 中表示為一個 inode摇天。inode 包含管理文件系統(tǒng)中的文件所需的所有元數(shù)據(jù)(包括可以在文件上執(zhí)行的操作)。dentry用來實現(xiàn)文件名稱和inode之間的映射恐仑,有一個目錄緩存用來保存最近使用的dentry泉坐。dentry還維護(hù)目錄和文件之間的關(guān)系,從而支持文件在文件系統(tǒng)中移動裳仆。VFS文件表示一個打開的文件(保存打開的文件的狀態(tài)腕让,比如寫偏移量等等)。
1歧斟、超級塊
超級塊結(jié)構(gòu)表示一個文件系統(tǒng)记某,包含管理文件系統(tǒng)所需的信息,包括文件系統(tǒng)名稱(比如 ext2)构捡、文件系統(tǒng)的大小和狀態(tài)液南、塊設(shè)備的引用和元數(shù)據(jù)信息(比如空閑列表等等)。超級塊通常存儲在存儲媒體上勾徽,但是如果超級塊不存在滑凉,也可以實時創(chuàng)建它。可以在 ./linux/include/linux/fs.h 中找到超級塊結(jié)構(gòu)畅姊。
1.? 超級塊中的一個重要元素是超級塊操作的定義super_operations咒钟,super_operations結(jié)構(gòu)定義一組用來管理文件系統(tǒng)中的 inode 的函數(shù)。例如若未,可以用alloc_inode分配 inode朱嘴,用destroy_inode刪除inode〈趾希可以用read_inode和 write_inode讀寫inode萍嬉,用sync_fs執(zhí)行文件系統(tǒng)同步∠毒危可以在 /linux/include/linux/fs.h 中找到 super_operations 結(jié)構(gòu)壤追。每個文件系統(tǒng)提供自己的inode方法,這些方法實現(xiàn)操作并向 VFS 層提供通用的抽象供屉。
2行冰、inode結(jié)構(gòu)
inode 表示文件系統(tǒng)中的一個對象,具有惟一標(biāo)識符伶丐。各個文件系統(tǒng)提供將文件名映射為惟一inode標(biāo)識符和inode引用的方法悼做。inode結(jié)構(gòu)中的inode_operations 和 file_operations是重要的操作方法成員。inode_operations 定義直接在inode上執(zhí)行的操作哗魂,而file_operations定義與文件和目錄相關(guān)的方法(標(biāo)準(zhǔn)系統(tǒng)調(diào)用)肛走。
3、目錄項dentry
? ? 目錄項是描述文件的邏輯屬性啡彬,只存在于內(nèi)存中,并沒有實際對應(yīng)的磁盤上的描述故硅,更確切的說是存在于內(nèi)存的目錄項緩存庶灿,為了提高查找性能而設(shè)計。所有的文件吃衅,都是屬于目錄項往踢,所有的目錄項在一起構(gòu)成一顆龐大的目錄樹。
1.? ? ? ? inode 和目錄緩存分別保存最近使用的 inode 和 dentry徘层。注意峻呕,對于 inode 緩存中的每個 inode,在目錄緩存中都有一個對應(yīng)的 dentry趣效。
4瘦癌、file文件對象
文件對象是已打開的文件在內(nèi)存中的表示,主要用于建立進(jìn)程和磁盤上的文件的對應(yīng)關(guān)系跷敬,由sys_open() 現(xiàn)場創(chuàng)建讯私,由sys_close()銷毀。文件對象和物理文件的關(guān)系有點像進(jìn)程和程序的關(guān)系一樣。
四斤寇、緩沖區(qū)緩存
各個文件系統(tǒng)的實現(xiàn)在linux/fs中桶癣,文件系統(tǒng)層的底部是緩沖區(qū)緩存。緩沖區(qū)緩存跟蹤來自文件系統(tǒng)實現(xiàn)和物理設(shè)備(通過設(shè)備驅(qū)動程序)的讀寫請求娘锁。為了提高效率牙寞,Linux 對請求進(jìn)行緩存,避免將所有請求發(fā)送到物理設(shè)備莫秆。緩存中緩存最近使用的緩沖區(qū)(頁面)间雀,可以快速提供給各個文件系統(tǒng)使用。