微軟在Dos/Windows系列操作系統總共使用了6種不同的文件系統(包括即將在windows的下一個版本中使用的Winfs)。它們分別是:FAt12、FAT16、FAT32、NTFS、NTFS5.0和WINFS。下面我們一一來對它們的相關特點和規則做個介紹。其中FAt12、FAT16、FAT32均是Fat文件系統。是File Allocation Table的簡稱。 最古老的文件系統FAT12:
這是伴隨著Dos誕生的「老」文件系統了。它採用12位文件分配表,並因此而得名。而以後的FAT系統都按照這樣的方式在命名。在DOS3.0以前使用。但是在現在,我們都還能找得到這個文件系統:用於軟盤驅動器。當然,其他地方的確基本上不使用這個文件系統了。Fat12可以管理的磁碟容量是8M。這在當時,沒有硬碟的情況下,這個磁碟管理能力是非常大的。
Fat12文件系統的限制:
1)文件名:只能是8.3格式的文件名。
2)磁碟容量:最多8M。(4096clusters×4sectors/clusters×512bytes、sectors)
3)文件碎片嚴重。(只在磁碟上不存儲在不連續的簇內。)
使用時間最長文件系統的Fat16:
在Dos2.0的使用過程中,對更大的磁碟的管理能力的需求已經出現了,所以在Dos3.0中,微軟推出了新的文件系統Fat16。除了採用了16位字長的分區表之外,Fat16和Fat12在其他地方都非常的相似。實際上,隨著字長增加4位,可以使用的簇的總數增加到了65536。在總的簇數在4096之下的時候,應用的還是Fat12的分區表,當實際需要超過4096簇的時候,應用的是Fat16的分區表。剛推出的Fat16文件系統管理磁碟的能力實際上是32M。這在當時是看來是足夠大的。1987年,硬碟的發展推動了文件系統的發展,Dos4.0之後的Fat16可以管理128M的磁碟。然後這個數字不斷的發展,一直到2G。在整整的10年中,2G的磁碟管理能力都是大大的多於了實際的需要。需要指出的是,在windows95系統中,採用了一種比較獨特的技術,叫做VFat來解決長文件名等問題。FAT16分區格式存在嚴重的缺點:大容量磁碟利用效率低。在微軟的DOS和Windows系列中,磁碟文件的分配以簇為單位,一個簇只分配給一個文件使用,不管這個文件佔用整個簇容量的多少。這樣,即使一個很小的文件也要佔用一個簇,剩餘的簇空間便全部閑置,造成磁碟空間的浪費。由於分區表容量的限制,FAT16分區創建的越大,磁碟上每個簇的容量也越大,從而造成的浪費也越大。所以,為了解決這個問題,微軟推出了一種全新的磁碟分區格式FAT32,並在Windows 95 OSR2及以後的Windows 版本中提供支持。 Volume size Cluster size 0 to 32 MB 512 bytes 33 to 64 MB 1 KB 65 to128 MB 2 KB 129 to 256 MB 4 KB 257 to 511 MB 8 KB 512 to 1023 MB 16 KB 1024 to 2047 MB 32 KB 2048 to 4095 MB 64 KB 最新的Fat32文件系統:
Fat32文件系統將是Fat系列文件系統的最後一個產品。和它的前輩一樣,這種格式採用32位的文件分配表,磁碟的管理能力大大增強,突破了FAT16 2GB的分區容量的限制。由於現在的硬碟生產成本下降,其容量越來越大,運用FAT32的分區格式後,我們可以將一個大硬碟定義成一個分區,這大大方便了對磁碟的管理。
FAT32推出時,主流硬碟空間並不大,所以微軟設計在一個不超過8GB的分區中,FAT32分區格式的每個簇都固定為4KB,與FAT16相比,大大減少了磁碟空間的浪費,這就提高了磁碟的利用率。在其他更大的分區中的簇大小的可以看下錶: Volume size Cluster size less than 8GB 4 KB less than 16GB 8 KB less than 32GB 16 KB more than 32gB 32 KB 目前,支持這種格式的操作系統有Windows 95、Windows 98、OSR2、Windows 98 SE、Windows Me、Windows 2000和Windows XP,Linux Redhat部分版本也對FAT32提供有限支持,然而,如果Linux安裝在FAT32分區下,必須使用軟盤進行引導。但是,這種分區格式也有它明顯的缺點,首先是由於文件分配表的擴大,運行速度比FAT16格式要慢,特別是在DOS 7.0下,性能差別更明顯。
FAT32的限制:
1)最大的限制在於兼容性方面,Fat32不能保持向下兼容。
2)當分區小於512M時,Fat32不會發生作用。
4)單個文件不能大於4G。(精確數據是4G-2bytes)。
② 什麼是fatfs文件系統
FatFs是一個通用的文件系統模塊,用於在小型嵌入式系統中實現FAT文件系統。專 FatFs 的編寫屬遵循ANSI C,因此不依賴於硬體平台。它可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, SH, Z80, H8, ARM 等等,不需要做任何修改。
FAT12, FAT16 與 FAT32.多個卷(物理驅動器與分區).兩種分區規則: FDISK 與 Super-floppy.多種配置選項:長文件名支持。可選的編碼頁,包括DBCS(譯者:DBCS為雙位元組字元系統 Double Byte Char Systems )多任務支持只讀,最小化API,緩沖區配置等等應用程序介面
③ fatfs文件系統支持多少文件
fatfs文件系統支持4GB文件。
disk_initialize()等函數是FATFS底層的幾個介面,移植實現後,FATFS的操作跟WINDOWS上的文件操作差不多一樣,FATFS源代碼里有說明文檔自己看,不過設備要先掛載,如果原來的設備沒有文件系統,還要格式化一下,才能用。
對於FAT16文件系統,可以保存的文件體積最大值是4 GB - 1 byte (2^32 bytes - 1 byte);卷的最大體積是4GB;每個卷上最多可以保存的文件數量是65,536個 (2^16);根目錄下可以保存的文件和文件夾數量最大值是512個(如果使用了長文件名,該數字還會減小)。
FatFs 提供下面的函數:
f_mount - 注冊/注銷一個工作區域(Work Area)
f_open - 打開/創建一個文件
f_close - 關閉一個文件
f_read - 讀文件
f_write - 寫文件
f_lseek - 移動文件讀/寫指針
f_truncate - 截斷文件
f_sync - 沖洗緩沖數據 Flush Cached Data
f_opendir - 打開一個目錄
f_readdir - 讀取目錄條目
f_getfree - 獲取空閑簇 Get Free Clusters
④ sd卡怎麼修改文件目錄和分配表 fatfs
SD的優勢之一是它的便攜性,它可以自由插拔,可以在嵌入式設備和PC機之間交換數據。如果使用FAT(File Allocation Table)文件系統,它便可以方便在安裝windows的PC和嵌入式設備之間交換數據。一個完整的FAT文件系統代碼量非常龐大,不適合資源較少的嵌入式系統,於是就需要一個微型的FAT文件系統,FatFs就是基於這樣的目的而開發的。
FatFS是一個專為小型嵌入式系統設計的通用FAT文件系統模塊。FatFs具有較高的可配置性,最小配置僅使用1K的RAM空間,非常適用於嵌入式系統。FatFs 的編寫遵循ANSI C,並且完全與磁碟I/O層分開。因此,它獨立(不依賴)於硬體架構。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。
特點
Windows兼容的FAT文件系統
不依賴於平台,易於移植
代碼和工作區佔用空間非常小
多種配置選項:
多卷(物理驅動器和分區)
多ANSI/OEM代碼頁,包括DBCS
在ANSI/OEM或Unicode中長文件名的支持
RTOS的支持
多扇區大小的支持
只讀,最少API,I/O緩沖區等等
FatFs的源代碼只有幾個文件:diskio.c,ff.c,ff_util.c,tff.c及頭文件。diskio.c是磁碟操作的代碼文件(這個文件是移植時要實現的),ff.c是一般FatFs的代碼文件,tff.c是微型FatFs的代碼文件,ff_util.c是幾個輔助函數。integer.h是內部基本類型的定義,ff.h是一般FatFs包含的頭文件,tff.h是微型FatFs包含的頭文件。
[cpp] view plain在CODE上查看代碼片派生到我的代碼片
#if _FATFS_TINY != 1
#include <fatfs/src/ff.h>
#else
#include <fatfs/src/tff.h>
#endif
#include <fatfs/src/ff_util.h>
微型FatFs配置最小時僅佔用內存1KB,但它是一個只讀的FAT系統。
FatFs的配置文件是fatfs_config.h:
[cpp] view plain在CODE上查看代碼片派生到我的代碼片
//------------------------------------------------------------------------------
// General Definitions (previously in ff.h)
//------------------------------------------------------------------------------
#define _FATFS_TINY 0
/* When _FATFS_TINY is set to 1, fatfs is compiled in Tiny mode
/ Else, it is compiled in normal mode
/ Tiny FatFs feature : Very low memory consumption, suitable for small memory
/ system. (1KB RAM) : Supports only single drive, no disk format,
/ only read functions, no write functions */
//------------------------------------------------------------------------------
// Definitions for normal FATFS (previously in ff.h)
//------------------------------------------------------------------------------
#if _FATFS_TINY == 0
#define _MCU_ENDIAN 2
/* The _MCU_ENDIAN defines which access method is used to the FAT structure.
/ 1: Enable word access.
/ 2: Disable word access and use byte-by-byte access instead.
/ When the architectural byte order of the MCU is big-endian and/or address
/ miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2.
/ If it is not the case, it can also be set to 1 for good code efficiency. */
#define _FS_READONLY 0
/* Setting _FS_READONLY to 1 defines read only configuration. This removes
/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
/ f_truncate and useless f_getfree. */
#define _FS_MINIMIZE 0
/* The _FS_MINIMIZE option defines minimization level to remove some functions.
/ 0: Full function.
/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed.
/ 2: f_opendir and f_readdir are removed in addition to level 1.
/ 3: f_lseek is removed in addition to level 2. */
#define _USE_STRFUNC 0
/* To enable string functions, set _USE_STRFUNC to 1 or 2. */
#define _USE_FSINFO 1
/* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */
#define _USE_SJIS 1
/* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise
/ only US-ASCII(7bit) code can be accepted as file/directory name. */
#define _USE_NTFLAG 1
/* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved.
/ Note that the files are always accessed in case insensitive. */
#define _USE_MKFS 1
/* When _USE_MKFS is set to 1 and _FS_READONLY is set to 0, f_mkfs function is
/ enabled. */
#define _DRIVES 2
/* Number of logical drives to be used. This affects the size of internal table. */
#define _MULTI_PARTITION 0
/* When _MULTI_PARTITION is set to 0, each logical drive is bound to same
/ physical drive number and can mount only 1st primaly partition. When it is
/ set to 1, each logical drive can mount a partition listed in Drives[]. */
//------------------------------------------------------------------------------
// Definitions for normal FATFS TINY (previously in tff.h)
//------------------------------------------------------------------------------
#else
#define _MCU_ENDIAN 2
/* The _MCU_ENDIAN defines which access method is used to the FAT structure.
/ 1: Enable word access.
/ 2: Disable word access and use byte-by-byte access instead.
/ When the architectural byte order of the MCU is big-endian and/or address
/ miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2.
/ If it is not the case, it can also be set to 1 for good code efficiency. */
#define _FS_READONLY 1
/* Setting _FS_READONLY to 1 defines read only configuration. This removes
/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
/ f_truncate, f_getfree and internal writing codes. */
#define _FS_MINIMIZE 0
/* The _FS_MINIMIZE option defines minimization level to remove some functions.
/ 0: Full function.
/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed.
/ 2: f_opendir and f_readdir are removed in addition to level 1.
/ 3: f_lseek is removed in addition to level 2. */
#define _USE_STRFUNC 0
/* To enable string functions, set _USE_STRFUNC to 1 or 2. */
#define _USE_FSINFO 1
/* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */
#define _USE_SJIS 1
/* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise
/ only US-ASCII(7bit) code can be accepted as file/directory name. */
#define _USE_NTFLAG 1
/* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved.
/ Note that the files are always accessed in case insensitive. */
#define _USE_FORWARD 0
/* To enable f_forward function, set _USE_FORWARD to 1. */
#define _FAT32 1
/* To enable FAT32 support in addition of FAT12/16, set _FAT32 to 1. */
#endif
//------------------------------------------------------------------------------
// Other definitions
//------------------------------------------------------------------------------
/*-----------------------------------------------------------------------*/
/* Correspondence between drive number and physical drive */
/* Note that Tiny-FatFs supports only single drive and always */
/* accesses drive number 0. */
#define DRV_MMC 0
#define DRV_SDRAM 1
#define DRV_ATA 2
#define DRV_USB 3
#define SECTOR_SIZE_SDRAM 512
#define SECTOR_SIZE_SDCARD 512