1. 程式人生 > >基於STM32的SD卡FATFS檔案系統學習筆記

基於STM32的SD卡FATFS檔案系統學習筆記

一、FATFS檔案系統格式分析

搞檔案系統,首先要了解一下SD卡里面的結構和分割槽,如下圖

1、引導扇區

引導扇區包含著磁碟和檔案系統的許多重要引數。檔案管理系統首先要對該扇區的資訊進行分析,才能瞭解當前磁碟上檔案系統的格式。

EB 58 90 4D 53 44 4F 53 35 2E 3000 0208 20 0002 00 00 00

00 F8 00 00 3F 00 FF 00 00 00000000 340F 00CC 03 00 00

00 00 00 00 02 00 00 0001 0006 0000 00 00 00 00 00 00 00

00 00 00 00 00 00 2922 B0 50 A0 4E 4F 20 4E 41 4D 45 20 20

20 20 46 41 54 33 3220 20 20 33 C9 8E D1 BC F4 7B 8E C1 8E

11-12位元組

每一扇區的位元組數

典型為0x00、02,512

13

每簇扇區數

8

14-15

保留扇區數

0x20,00,保留32個扇區

21

介質型別

0xF8,固定介質

32-35

總扇區數

0x00 34 0F 00,十進位制996352

36-39

檔案分配表所佔扇區數

0xCC 03 00 00,972

44-47

根目錄所在簇號

02 00 00 00,2號簇

48-49

FSINFO扇區標號

01 00,在1號扇區

50-51

引導扇區的備份扇區號

06 00,在6號扇區

66

擴充套件引導標誌

0x29

82-89

FAT32字串

46 41 54 33 32

 20 20 20

FAT32與FAT12、FAT16區分是通過簇的數量,簇總數=總扇區數-(保留扇區數+分配表扇區數+根目錄區扇區數)/每簇扇區數。996352-(32+972*2+0)/8=124297,有12萬多簇,肯定是FAT32系統。

在FAT32檔案系統,根目錄區與普通目錄一樣,都是位於資料區,比較典型的都是從2號簇開始。資料區起始扇區號=根目錄區起始扇區號=保留扇區+2*分配表扇區=32+1944=1976號。3號簇起始就是1984。利用shell命令裡的SDRD命令讀出來看一下。我編寫的這個命令以扇區號為引數,每次讀入兩個扇區,並以十六進位制的形式顯示在串列埠終端上。

體外的知識:

FAT16 DBR 引數的偏移0x11 處記錄了根目錄所佔扇區的數目。偏移0x16

記錄了FAT 表所佔扇區的資料。偏移0x10 記錄了FAT 表的副本數目。系統在得

到這幾項引數以後,就可以確定資料區的開始扇區偏移了。

FAT16 檔案系統從根目錄所佔的32 個扇區之後的第一個扇區開始以簇為單

位進行資料的處理,這之前仍以扇區為單位。對於根目錄之後的第一個簇,系

統並不編號為第0 簇或第1 簇 (可能是留作關鍵字的原因吧),而是編號為第2

簇,也就是說資料區順序上的第1 個簇也是編號上的第2 簇。

FAT 檔案系統之所以有12,16,32 不同的版本之分,其根本在於FAT 表用

來記錄任意一簇連結的二進位制位數。以FAT16 為例,每一簇在FAT 表中佔據2

位元組(二進位制16 位)。所以,FAT16 最大可以表示的簇號為0xFFFF(十進位制的

65535),以32K 為簇的大小的話,FAT32 可以管理的最大磁碟空間為:32KB×

65535=2048MB,這就是為什麼FAT16 不支援超過2GB 分割槽的原因。

FAT 表實際上是一個數據表,以2 個位元組為單位,我們暫將這個單位稱為

FAT 記錄項,通常情況其第1、2 個記錄項(前4 個位元組)用作介質描述。從第三

個記錄項開始記錄除根目錄外的其他檔案及資料夾的簇鏈情況。根據簇的表現

情況FAT 用相應的取值來描述,見表