嵌入式設備上的文件系統優(yōu)化設計
隨著(zhù)芯片技術(shù)的發(fā)展,各種處理器的處理能力不斷提高,手持智能終端得到極大的普及。嵌入式Linux操作系統在未來(lái)的手持智能設備中將扮演著(zhù)非常重要的角色,使嵌入式Linux的應用和研究不斷的深入。
由于Microsoft公司的Windows操作系統占據了桌面操作系統絕大多數份額,而手持智能設備與PC機的數據交換又在所難免,因此,絕大多數的大容量嵌入式智能設備必須采用與PC機兼容的FAT/FAT32文件系統。隨著(zhù)便攜式硬盤(pán)的應用,FAT32在嵌入式硬盤(pán)上已成為主流的格式。
同時(shí),隨著(zhù)CPU處理能力的提高,面向存儲的應用需求在手持智能設備上也隨著(zhù)不斷增長(cháng),文件系統的訪(fǎng)問(wèn)性能將是未來(lái)的手持設備非常關(guān)鍵的因素。然而,當硬盤(pán)在手持智能設備上應用時(shí),由于硬盤(pán)訪(fǎng)問(wèn)的高耗能特性,對于手持設備的設計構成了極大的挑戰。而硬盤(pán)的能耗又與讀寫(xiě)訪(fǎng)問(wèn)的時(shí)間成正比,從節能的角度出發(fā),系統設計者同樣希望在單位時(shí)間內讀取更多內容,以減少硬盤(pán)訪(fǎng)問(wèn)時(shí)間從而達到節能的目的。因此,在Linux上的FAT32的優(yōu)化實(shí)現成為非常迫切的需求。
1 Linux中FAT32文件系統讀操作分析
1.1 虛擬文件系統與FAT32[1-2]
Linux系統中的虛擬文件系統VFS(Virtual File System)是一個(gè)非常強大的機制,其設計思路是在內核中提供一個(gè)文件系統框架,包括接口函數集、管理用的數據結構以及各種緩存機制。VFS提供上下兩個(gè)方面的接口,上層接口是提供給I/O系統的用戶(hù)使用的,包括應用程序和內核的其他管理模塊,通過(guò)該接口可使I/O系統(文件、設備、網(wǎng)絡(luò )等)完成如打開(kāi)、關(guān)閉、讀、寫(xiě)等;下層接口是提供給真實(shí)文件系統的,VFS支持的每個(gè)真實(shí)文件系統都要通過(guò)這個(gè)接口來(lái)實(shí)現。通過(guò)這種機制,Linux將系統存在的各種真實(shí)文件系統(如EXT2/EXT3、FAT/FAT32、JFFS/JFFS2等)以及設備文件都統一到一種操作中,以此來(lái)實(shí)現系統的管理與調度。
FAT(File Allocation Table)文件系統是Microsoft公司推出的廣泛使用在Dos、Windows 9X、Windows 2000以及Windows XP系統中。由于Windows系列的操作系統的普及,其FAT文件系統被人們所廣泛熟悉和應用。當前針對大容量硬盤(pán),FAT32文件系統占據了主要的地位。在FAT32文件系統中,以下三個(gè)概念與文件的組織密切相關(guān):
扇區(Sector): 數據存取的最小物理單位。
簇(Cluster):文件最小分配單位,與分區大小、文件系統相關(guān)。
邏輯扇區(Logic Sector):在文件系統實(shí)現中,為了優(yōu)化和統一設計所定義的讀寫(xiě)長(cháng)度。
1.2 文件讀在內核中的實(shí)現
以讀操作為例,通過(guò)Linux系統中VFS的作用,從用戶(hù)空間對FAT32的操作,系統可以抽象成從fread( )映射到內核函數do_generic_file_read( )來(lái)完成具體的文件讀操作。在文件/μCLinux/linux-2.4.x/mmnommu/filemap.c中存在這個(gè)接口實(shí)現的原型。雖然這類(lèi)接口并不是基本的,但正如大多數文件系統的實(shí)現,FAT32就是通過(guò)這類(lèi)接口來(lái)實(shí)現文件的各種操作。
圖1描述了函數do_generic_file_read( )的實(shí)現原理。從函數入口處獲得目標內容的文件描述指針,從而獲得文件入口。通過(guò)分析描述符inode以及當前狀態(tài),系統獲得預讀read_ahead的大小,進(jìn)行相應的計算,獲得所需要獲取的目標內容Page頁(yè)索引以及offset偏移量。然后發(fā)起預讀的指令,并等待獲得相應的Page內容后,將其拷貝到buffer中進(jìn)行組織,并提供上層程序磁盤(pán)文件在內存中的映像。
1.3 文件預讀機制與Page讀[1-4]
在do_generic_file_read的實(shí)現中,磁盤(pán)讀動(dòng)作實(shí)際是在預讀read_ahead中完成的,即預讀機制。這是由于Linux系統為了獲得更高的性能以及充分利用CPU處理能力,VFS設計中做了一層buffer/cache緩沖。當系統發(fā)現buffer/cache中有即將要訪(fǎng)問(wèn)的內容缺失時(shí),系統將發(fā)起一次預讀請求。下層文件系統根據尋找CPU以及總線(xiàn)的空閑狀態(tài),執行具體的預讀機制。這樣,上下層構成一個(gè)異步過(guò)程來(lái)完成系統的任務(wù),以達到充分利用系統資源的目的。
在考察read_ahead( )的實(shí)現中可以發(fā)現,實(shí)際上read_ahead( )函數的主要功能是根據實(shí)際需求不斷調用文件系統中的readpage( )函數來(lái)完成的。這是由于Linux的內存管理都是按照頁(yè)(Page)模式進(jìn)行組織的。也就是說(shuō),每次從具體的對象數據存儲設備(如硬盤(pán))上讀取相應的數據時(shí),將嚴格按照page的大小進(jìn)行讀取動(dòng)作。根據一般定義,Page采用4 096B為單位。在Linux上的FAT32實(shí)現中,將由fat_readpage( )具體應用實(shí)例來(lái)實(shí)現這個(gè)功能。
1.4 Block讀實(shí)現[3-4]
由于不同的硬件設備存在不同的物理結構,在文件系統格式化時(shí),最基本的存儲單元Cluster的大小是不同的。如通常能夠見(jiàn)到的有512B、1KB等。也就是說(shuō),實(shí)際文件的存儲是按照不同的目標存儲設備劃分為不同的塊來(lái)存儲的。在文件系統實(shí)現中,為了兼容不同的目標系統與硬件設備,在FAT文件系統中的Page讀動(dòng)作的實(shí)現中,引入了一個(gè)Block概念,即根據具體文件描述,按照Block大小完成整個(gè)Page的讀命令。
在μCLinux/linux-2.4.x/mmnommu/filemap.c文件中,fat_readpage( )的實(shí)現就是根據上述目標進(jìn)行相應設計的,即通過(guò)inode獲取相應文件的具體存儲信息,然后將Page讀轉化為按照Block塊方式進(jìn)行讀操作。也就是通過(guò)反復調用block_read_full_page( )函數來(lái)滿(mǎn)足最后Page內容的獲取。
函數block_read_full_page( )的具體實(shí)現過(guò)程如圖2所示。系統根據傳入的參數,獲得Block大小,生成相應的緩存空間,然后反復發(fā)出Block讀的Request,直到完成整個(gè)Page的讀任務(wù)。
如圖2所示Block_read_full_page( )的實(shí)現機理中,最重要的是根據系統狀況,經(jīng)過(guò)計算確切地獲得將由多少個(gè)Block來(lái)組成一個(gè)Page。
在Linux實(shí)現中,Block大小決定于文件描述符inode中的i_blkbits域。在Linux中的FAT32文件系統設計中,inode->i_blkbits是由FAT32系統中的logic_sector_size決定的,即用/linux-2.4.x/fs/fat/inode.c來(lái)實(shí)現從FAT32文件系統映射到Linux的inode各項定義。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論