基於uC/OS-II的文件系統設計

基於uC/OS-II的文件系統設計

基於uC/OS-II的文件系統設計
摘要:本文提出了基於µC/OS-II的一個文件系統的設計與實現方法。通過分析文件系統中的層次結構和功能模塊,給出了文件系統的詳細設計方案,包括文件控制塊、文件描述符和文件保護機制等。最後還闡述了文件系統爲保證可靠性所採取的技術。
關鍵詞: 實時嵌入式系統 µC/OS-II 文件系統
1 前言
  從系統的角度來看,一個文件系統要實現對存放文件的存儲空間的組織、分配、信息的傳輸,並對已存儲信息進行檢索和保護等;從用戶來的角度看,文件系統應該做到存取文件方便,信息存儲安全可靠,既能實現共享又可做到保密。當用戶要求文件系統保存一個已命的文件時,文件系統能將它們放在適當的地方。當用戶要使用文件時,文件系統可以根據文件名找出某個具體文件。
  文件系統設計時,必須遵循以下幾個基本原則:第一簡潔性,現有的比較完善的文件系統功能齊全、對系統資源要求較高,而我們所需要的這個嵌入式文件系統是嵌入式平臺的一箇中間件,要求簡潔高效可靠。爲此我們在設計過程中借鑑了MS-DOS的FAT16文件系統格式的目錄形式進行文件管理,打開文件數據結構則採用了類似於UNIX系統文件表的方式,爲每一個打開文件設置了一個數據結構指針FS_FILE,使得用戶接口簡潔明瞭。第二多設備驅動支持(多介質兼容),考慮到應用的廣泛性和存儲介質的多樣性,要求我們在進行設計文件系統時必須考慮對多種存儲介質的兼容性。整個系統採用模塊化分層設計的原則和麪向對象的實現方法,使得用戶可以通過統一的頂層應用程序接口方便地對各種存儲介質進行文件操作。利用本文件系統可以管理不同的存儲介質,可以同時訪問不同的硬件。第三多操作系統支持,文件系統的開發是基於µC/OS-II,在設計開發過程中,考慮到以後對多操作系統的支持,OS接口模塊設計爲動態可變,當文件系統應用於其它操作系統時,只需將OS接口模塊中的操作系統信息變爲新的操作系統即可。第四可靠性,由於嵌入式系統的數據資源的重要性,要求存儲數據的物理介質必須具有很高的穩定性,可是我們知道一些人爲或外在的因素可能會導致介質的損壞,從而造成數據的缺失,所以我們要儘可能提高文件系統可靠性。

2 文件系統的層次結構和功能模塊
  嵌入式文件系統由於功能和作用與普通桌面操作系統的文件系統不同,導致了二者在體系結構上具有很大的差異性。在普通桌面操作系統中,文件系統不僅要管理文件,提供文件系統調用API,還要管理各種設備,支持對設備和文件操作的一致性(即要象操作文件一樣來操作各種I/O設備)。在嵌入式文件系統中,這種規則發生了很大的變化。在某些情況下,嵌入式系統可以針對特殊的目的來進行定製,特別是隨着ASOS(Application Specific Operating Systems,爲應用定製的嵌入式操作系統)的發展,對嵌入式操作系統的系統功能規整性、可伸縮性及其靈活性提出了更高的要求。
  基於以上的考慮,我們採用瞭如圖1所示的嵌入式文件系統體系結構,該結構定義的文件系統從上到下有三個層次:第一層爲API層、第二層爲中間轉換層、下層爲介質驅動層。第一API層:API層是文件系統和用戶應用程序之間的接口,它有一個標準C函數庫,其中包含有諸如打開文件(FS_FOPEN)、寫文件(FS_FWRITE)等函數。本層的功能是將用戶調用傳送給中間轉換層。這是整個系統設計的核心,也是嵌入式文件系統中用戶唯一可見的部分——POSIX中文件系統的標準系統調用全部在該部分中得以實現。第二中間轉換層:中間轉換層要爲文件系統的實現提供與硬件無關的統一接口,是文件系統結構規整性的基礎。中間轉換層包含有文件系統子層及邏輯塊子層,其中文件系統子層將文件操作解釋到邏輯塊子層,然後文件系統調用邏輯塊子層並根據不同的設備定義出相應的設備驅動程序;邏輯塊子層主要是同步對設備驅動程序的訪問,向上提供友好界面。第三介質驅動層:介質驅動層是訪問硬件的最低端的程序,該程序的結構要能夠便於實現對硬件的訪問。本層的功能主要是完成對介質的訪問。本層的重要任務就是提供統一的設備驅動程序接口。


  根據文件系統的層次結構,可以將該文件系統分成四大功能塊:API接口模塊、中間轉換模塊、磁盤分區模塊、設備驅動模塊。其中API接口模塊主要完成文件的基本操作,包含有文件的生成、刪除、打開、關閉、文件讀、文件寫等。中間轉換模塊主要完成對存取權限的檢查、介質的選擇、邏輯到物理的轉換。磁盤分區模塊主要完成對幾個主要數據結構的初始化,設置文件系統的總體分區信息以及每個分區的幾部分:空閒塊管理、引導區、FAT區、文件存儲區等。設備驅動模塊完成存儲介質的驅動程序,包含有一個驅動程序函數表和介質讀、介質寫、檢查狀態、執行特定命令等驅動程序。
3 文件系統的詳細設計
3.1文件系統組織方式
  文件系統邏輯組織爲流式文件,物理組織爲連續文件。用戶對於流式文件的訪問是以字節爲單位的。每個文件的內部有一個讀寫指針,通過系統調用可以將該指針固定到文件的某一個位置處,以後的讀寫系統調用將從該指針所確定的位置處開始。而用於保存文件的物理設備是劃分爲塊頁的,文件的物理結構就是要確定如何將字節保存在存儲介質中。所以說文件的物理組織形式對於文件系統的性能有着較爲直接的影響,所以我們在進行文件的物理組織選擇時比較慎重。結合我們系統的實際應用情況,我們決定文件的物理組織方式採用順序結構,這是因爲我們的嵌入式應用環境要求實時性高,採集到的數據一旦以文件的方式存儲在介質上很少進行改動,也即文件的長度變化不大,所以我們將邏輯文件的信息存放在外存的連續編號的物理塊中。
3.2文件和文件控制塊FCB
  爲了實現對於文件的管理,系統需要掌握一組有關文件的描述信息,例如文件的名稱、文件的地址、文件的建立日期等等,這些信息組合在一起構成一個數據結構,在這裏我們稱之爲文件控制塊FCB(File Control Block)。FCB是文件存在的標誌,其中記錄着系統對於文件進行管理所需要的全部信息,FCB所包含內容如圖2所示。每一個文件都有一個文件控制塊,它們被保存於外存空間,當系統欲訪問一個文件時,應當能夠根據文件名字找到它所對應的文件控制塊,然後根據文件控制塊中的文件位置信息找到該文件具體所存放的區域。

3.3文件描述符
  文件描述符由基本文件名和擴展文件名兩部分構成,二者以圓點分開。文件名由1-8個字符構成,擴展名由1-3個字符構成。分別佔據FCB中的00H-07H和08H-0AH兩部分。在FCB中,文件名和擴展名是左對齊放置的,剩餘部分填入空格碼。當進行文件刪除時,在文件目錄記錄項的第一字節中放入E5H,表示該記錄項是空項。從公平沒有使用過的記錄項的第一字節中寫入的是00H,剛剛格式化的根文件目錄或剛剛生成的子文件目錄的未使用文件目錄記錄項的開頭寫入的均是00H。這個00H在文件進行檢索時特別有用,主要是用來確定搜索到文件目錄的什麼區域就可以不用再繼續搜索了。例如,當文件檢索中沒有00H時,必須對全文件目錄區進行檢索,而一旦遇到有00H的場合,檢索便宣告結束,這樣可以大大縮短檢索文件的時間,提高了文件檢索的效率。
3.4對文件的主要操作
  文件系統的功能是通過一系列對文件的操作實現的。爲此,系統提供給用戶一整套系統調用,用以完成創建、打開、讀、寫、關閉、刪除文件等項工作。對應的函數分別爲:FS_FOPEN()、FS_REMOVE()、FS_FCLOSE()、FS_FREAD()和FS_FWRITE(),各函數均通過驅動模塊來實現,具體的代碼此處不在羅列。
3.5文件的保護機制
  由於文件系統保存着用戶非常重要的信息,因而如何保護信息、防止未授權使用就是所有文件系統必須要解決的重要問題之一。但系統中的全部信息又不能完全成爲私有,還必須進行文件共享,以提高資源的利用率和方便用戶使用。
  文件共享和保密是一個問題的兩個方面。對文件的保護保密是由對文件的共享要求起的。在非共享環境中,不需要再做什麼保護,實際上它已經是極端的完全保護情況;相反,另一種極端情況則是完成共享,而不做任何保護。這兩種情況都缺乏實用意義,一般用法是有控制的進行文件共享。保護機制通過限制文件的存取類型來實現受控制共享。允許或禁止對文件的存取受多種因素的限制,如用戶的身份、文件本身的性質、對文件所要進行的存取類型等。常用的保護機制有命名、口令、存取控制、密碼等,對文件的保護必須要根據實際需要和實現的可能性來選擇合適的方法。由於本文件系統主要是以FAT文件系統爲基礎來進行設計的,所以在對文件進行保護和共享方面同樣也有FAT文件系統所具有的不足,沒有一套完整的文件保護機制來完成對文件的保護,安全特性只能通過共享權限來加以實現。
4、文件系統的可靠性設計
  對文件的可靠性設計主要從三個方面處理:FAT表保護、存儲介質壞區的檢測與處理、數據校驗。在整個文件系統的安全性上,FAT表是重中之重,需要採取特別的維護,因爲如果FAT表出錯,則整個系統都將崩潰。爲了防止出現系統癱瘓,我們對FAT表進行了備份。當出現非正常關機的時候,重新開機以後就要進行FAT表的校驗。首先我們進行主FAT表的校驗,如果主FAT表校驗無誤,則校驗兩個備份的FAT表,若均沒有錯誤,則不做任何工作;若發現有錯誤的FAT表存在,則用正確的FAT表將錯誤的覆蓋;若主FAT表有誤,而存在有正確的備份FAT表,則用備份的FAT表將主FAT表覆蓋;如果主FAT表有誤,而備份的FAT表也不正確,則宣告FAT表崩潰。此時只能重新進行分區。
  此外,由於存儲介質的使用壽命有限,所以我們在設計文件系統時一直本着儘可能少的對介質直接進行讀寫的原則。具體做法是在內存中建立FAT表的一個映射,在文件系統起動時將FAT表讀入內存。這樣,上層操作時如果涉及到對FAT表的更改,一般都先在內存FAT表映射中進行,不用涉及到介質的操作。我們通過設置一個更新標誌來確定更新時機,首次將存儲介質內的FAT表讀入內存時初始化該標誌爲假,一旦操作中生成了新的文件項或釋放塊而需要修改FAT表項時,即置該標誌爲真。同時我們設置一個定時器來確定更新介質上的FAT表的時間,定時器每隔一定時間來檢驗更新標誌,如果標誌爲真則將FAT表寫入介質FAT表。當然,在關閉文件時,無論定時器是否到時,都要進行上述檢驗更新。通過這樣的設計,我們就可以大大減少了對存儲介質上的FAT表的更新次數,也就達到了處長設備使用壽命的目的。
  由於存儲介質的壽命問題,隨着時間的增長和使用次數的增加,個別區域會出現文件的寫入讀出錯誤,所以我們在設計文件系統時也考慮到了壞區的檢驗與管理。檢驗某一頁是否損壞的方法是:將數據寫入某頁後立即讀出,如果讀出的數據跟寫入的不一致,則說明該頁爲壞頁。對於檢驗到的壞頁,在空閒塊管理區中進行標記,以後進行存儲區域分配時不分配這些壞頁,這相當於把壞頁從空閒塊中刪除,只要不對壞頁進行讀寫操作,文件系統就不會出現任何問題。
  爲了保證FAT表的可靠性,引入了校驗和機制。同樣,我們在進行文件系統設計時,通過在一個小區段內設置校驗和來提高數據的可靠性。在每一頁的最後4個字節作爲本頁的校驗和,該校驗和的值是對本頁數據的累加值。每次頁操作時都要在更改數據的同時重新計算校驗和。如果發生非正常關機等意外情況,則開機後,下一次對該頁操作時可通過比較保存的校驗和與各項重新累加計算出來的校驗和來檢查該頁數據是否出錯。
5、結束語
  嵌入式系統的開發是後PC時代的一個潮流,各種嵌入式操作系統也是爲爭奪這一片空間而絞盡腦汁,公開源代碼這個特性註定了µC/OS-II非常適合於嵌入式系統。開放源碼導致了定製的方便,開發人員可以從多個軟件中提取需要的精華,應用到自己的應用中去,從而大大節省開發成本,縮短研發週期。本文所設計的文件系統正是利用了µC/OS-II的這些特點,做到了高效、方便、易於維護、易於移植,並且系統資源佔用率低,充分體現了嵌入式中間件的特色,極大的方便了用戶的使用。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章