標籤:引用 管理員 警示 ttl 深度 故障 vxworks 解壓 min
先聲明一下關於著作權的問題,NTFS是Microsoft公司的智慧財產權產品!我本人是本著學習與研究的態度對其進行分析的,以便於更好的理解資料存放區技術。所查閱的所有資料,也都是網上甚至是MSDN自己公開的東西,沒有逆向成分在裡面,如果Microsoft公司,或者其他我引用資料的原作者發現我照搬了研究成果,請及時私信給我,我將立即刪除相關資訊,謝謝!
著作權交代完了,接下來我們開始研究技術:
NTFS (New Technology File System),是 WindowsNT 環境的檔案系統。新技術檔案系統是Windows NT家族(如,Windows 2000、Windows XP、Windows Vista、Windows 7和 windows 8.1)等的限制級專用的檔案系統(作業系統所在的盤符的檔案系統必須格式化為NTFS的檔案系統,4096簇環境下)。NTFS取代了老式的FAT檔案系統。
NTFS對FAT和HPFS作了若干改進,例如,支援中繼資料,並且使用了進階資料結構,以便於改善效能、可靠性和磁碟空間利用率,並提供了若干附加擴充功能……
有關於NTFS的優點很多,比如更大的單一分區,更大的檔案大小,單一目錄的更多檔案數之類的。但如果只有這些,微軟的天才們是沒有必要單獨研發一種檔案系統的,FAT64就夠了,如果64不夠,也許還會出現FAT128,FAT256,NTFS的優點主要體現在可靠、安全和高效幾個方面;
- NTFS是一個可恢複的檔案系統。在NTFS分區上使用者很少需要運行磁碟修複程式。NTFS通過使用標準的事物處理日誌和恢複技術來保證分區的一致性。發生系統失敗事件時,NTFS使用記錄檔和檢查點資訊自動回復檔案系統的一致性;
- NTFS支援對分區、檔案夾和檔案的壓縮。任何基於Windows的應用程式對NTFS分區上的壓縮檔進行讀寫時不需要事先由其他程式進行解壓縮,當對檔案進行讀取時,檔案將自動進行解壓縮;檔案關閉或儲存時會自動對檔案進行壓縮;
- NTFS採用了更小的簇,可以更有效率地管理磁碟空間。在Win 2000的FAT32檔案系統的情況下,分區大小在2GB~8GB時簇的大小為4KB;分區大小在8GB~16GB時簇的大小為8KB;分區大小在16GB~32GB時,簇的大小則達到了16KB。而Win 2000的NTFS檔案系統,當分區的大小在2GB以下時,簇的大小都比相應的FAT32簇小;當分區的大小在2GB以上時(2GB~2TB),簇的大小都為4KB。相比之下,NTFS可以比FAT32更有效地管理磁碟空間,最大限度地避免了磁碟空間的浪費;
- 在NTFS分區上,可以為共用資源、檔案夾以及檔案設定訪問許可許可權。許可的設定包括兩方面的內容:一是允許哪些組或使用者對檔案夾、檔案和共用資源進行訪問;二是獲得訪問許可的組或使用者可以進行什麼層級的訪問。訪問許可許可權的設定不但適用於本機電腦的使用者,同樣也應用於通過網路的共用資料夾對檔案進行訪問的網路使用者。與FAT32檔案系統下對檔案夾或檔案進行訪問相比,安全性要高得多。另外,在採用NTFS格式的Win 2K以上OS中,應用稽核原則可以對檔案夾、檔案以及活動目錄對象進行審核,審核結果記錄在安全日誌中,通過安全日誌就可以查看哪些組或使用者對檔案夾、檔案或活動目錄對象進行了什麼層級的操作,從而發現系統可能面臨的非法訪問,通過採取相應的措施,將這種安全隱患減到最低。這些在FAT32檔案系統下,是不能實現的;
- 在Win 2K以上的NTFS檔案系統下可以進行磁碟配額管理。磁碟配額就是管理員可以為使用者所能使用的磁碟空間進行配額限制,每一使用者只能使用最大配額範圍內的磁碟空間。設定磁碟配額後,可以對每一個使用者的磁碟使用方式進行跟蹤和控制,通過監測可以標識出超過配額警示閾值和配額限制的使用者,從而採取相應的措施。磁碟配額管理功能的提供,使得管理員可以方便合理地為使用者指派儲存資源,避免由於磁碟空間使用的失控可能造成的系統崩潰,提高了系統的安全性。
- NTFS使用一個“變更”日誌來追蹤記錄檔案所發生的變更。
如果對以上幾點不甚瞭解,那麼我簡單說幾點個人看法吧:第一個是壓縮解壓縮問題,對於我們的深度嵌入式系統來講,還是不壓縮的好,雖然是NTFS內建的壓縮,但也要佔用CPU進行壓縮/解壓,但這個特性,使得我們可以靈活的把NTFS部署在高CPU效能+低磁碟效能或低CPU效能+高磁碟效能的地方;第二點就是恢複問題了,在深度嵌入式系統中,很可能沒有OS,或只使用RTOS(UCOS1,2,3、FreeRTOS、Vxworks、RTthread等等),這就對系統資料操作的完備性提出了考驗。毫無疑問,NTFS的自恢複特性比FAT檔案系統有很大優勢,而且,NTFS的日誌對於非預期的事故有很好的作用,比如斷點、意外複位等,在事件結束前NTFS不會記錄事件,這樣我們的系統在重新啟動過程中可以檢測到上一次的故障位置,而繼續上次的操作,最大程度降低了破壞性;第三點就是效率問題了,NTFS有很多屬性,屬性,屬性,屬性……在載入一個NTFS檔案的時候已經直接讀取了一個檔案的屬性,甚至包括檔案是否被刪除或不存在,而FAT檔案系統的讀取方式是檔案配置表——鏈式檢索——訪問檔案。
但NTFS的缺點和優點正是相對存在的,NTFS最致命的地方在於他是給高效能CPU準備的而並非只有幾十到幾百MPS的MCU,這導致了NTFS的讀寫周期將會長的不可想象,不過好在——NTFS由我們來實現,我們可以通過設定一系列的宏開關來決定我們的精簡化NTFS要不要磁碟配額,要不要壓縮,要不要每次讀寫時檢查扇區是否正確(當然了這個不檢查會比較危險),等等。
我們的目標是:在MCU、ARM、DSP或SoC平台上正常讀寫NTFS格式的移動儲存介質,如SD卡。
圖1 SD卡格式化成NTFS格式
NTFS的基礎講完了,下面講一下準備工作,我們的準備工作需要兩大類:硬體和軟體。
我用ANSI C實現NTFS的初衷是讓我的STM32F103能夠讀取NTFS格式的檔案,所以硬體上,我們需要一張SD卡,如,我的是8GB的TF卡和SD卡各一張。還需要一個深度嵌入式開發平台。之前反覆的提到“深度嵌入式”,那麼什麼是深度嵌入式呢?我在這裡是將它與一般嵌入式做區分的標誌,一般的嵌入式系統,比如Linux,WinCE,其中可以直接嵌入NTFS的外掛程式,或內建NTFS,是沒有必要讓我們自己實現NTFS的,只有那些層次更深的嵌入式,比如RTOS中,我們寫的NTFS作為一個檔案系統的庫插入,才能提到顯著的效能、安全性的提高。
在硬體平台這,我用的是曾經做過的一個產品的板子,主MCU是STM32F103ZET6,這個板子設計的時候考慮了硬體相容,可以直接換成F407Z系列的,當然現在還是ZET6,後面如果NTFS跑不起來,再換F407。板子上有一個34針的液晶屏口,兩個LED,一個RTC,一個TF卡插槽,一個TTL電平的串口,這些外設已經足夠搞很多事情了。
軟體方面,磁碟工具我用的是DiskGenius V4.9.1.334 x64專業版,磁碟資料讀取軟體用的是WinHEX 14,STM32開發環境是Keil MDK 5.21a,因為NTFS不一定要開發多久,所以直接下載到STM32是不太可能的,費時費力還費晶片,所以需要一個PC機的C語言IDE,我用的是CodeBlocks編輯器+MinGW編譯器。
工具基本都備齊了,本章的內容到此也就結束了。
下一節介紹磁碟系統的一些基礎和NTFS的架構。
在STM32上實現NTFS之1:NTFS初識與準備工作