1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
struct exfat_super_block { uint8_t jump[3]; /* 0x00 jmp and nop instructions */ uint8_t oem_name[8]; /* 0x03 "EXFAT " */ uint8_t __unused1[53]; /* 0x0B always 0 */ le64_t sector_start; /* 0x40 partition first sector */ le64_t sector_count; /* 0x48 partition sectors count */ le32_t fat_sector_start; /* 0x50 FAT first sector */ le32_t fat_sector_count; /* 0x54 FAT sectors count */ le32_t cluster_sector_start; /* 0x58 first cluster sector */ le32_t cluster_count; /* 0x5C total clusters count */ le32_t rootdir_cluster; /* 0x60 first cluster of the root dir */ le32_t volume_serial; /* 0x64 volume serial number */ struct /* 0x68 FS version */ { uint8_t minor; uint8_t major; } version; le16_t volume_state; /* 0x6A volume state flags */ uint8_t sector_bits; /* 0x6C sector size as (1 << n) */ uint8_t spc_bits; /* 0x6D sectors per cluster as (1 << n) */ uint8_t fat_count; /* 0x6E always 1 */ uint8_t drive_no; /* 0x6F always 0x80 */ uint8_t allocated_percent; /* 0x70 percentage of allocated space */ uint8_t __unused2[397]; /* 0x71 always 0 */ le16_t boot_signature; /* the value of 0xAA55 */ } struct exfat_entry /* common container for all entries */ { uint8_t type; /* any of EXFAT_ENTRY_xxx */ uint8_t data[31]; } struct exfat_entry_bitmap /* allocated clusters bitmap */ { uint8_t type; /* EXFAT_ENTRY_BITMAP */ uint8_t __unknown1[19]; le32_t start_cluster; le64_t size; /* in bytes */ } struct exfat_entry_upcase /* upper case translation table */ { uint8_t type; /* EXFAT_ENTRY_UPCASE */ uint8_t __unknown1[3]; le32_t checksum; uint8_t __unknown2[12]; le32_t start_cluster; le64_t size; /* in bytes */ } struct exfat_entry_label /* volume label */ { uint8_t type; /* EXFAT_ENTRY_LABEL */ uint8_t length; /* number of characters */ le16_t name[EXFAT_ENAME_MAX]; /* in UTF-16LE */ } struct exfat_entry_meta1 /* file or directory info (part 1) */ { uint8_t type; /* EXFAT_ENTRY_FILE */ uint8_t continuations; le16_t checksum; le16_t attrib; /* combination of EXFAT_ATTRIB_xxx */ le16_t __unknown1; le16_t crtime, crdate; /* creation date and time */ le16_t mtime, mdate; /* latest modification date and time */ le16_t atime, adate; /* latest access date and time */ uint8_t crtime_cs; /* creation time in cs (centiseconds) */ uint8_t mtime_cs; /* latest modification time in cs */ uint8_t __unknown2[10]; } struct exfat_entry_meta2 /* file or directory info (part 2) */ { uint8_t type; /* EXFAT_ENTRY_FILE_INFO */ uint8_t flags; /* combination of EXFAT_FLAG_xxx */ uint8_t __unknown1; uint8_t name_length; le16_t name_hash; le16_t __unknown2; le64_t real_size; /* in bytes, equals to size */ uint8_t __unknown3[4]; le32_t start_cluster; le64_t size; /* in bytes, equals to real_size */ } struct exfat_entry_name /* file or directory name */ { uint8_t type; /* EXFAT_ENTRY_FILE_NAME */ uint8_t __unknown; le16_t name[EXFAT_ENAME_MAX]; /* in UTF-16LE */ } |
标签归档:exFAT
FAT32、NTFS、exFAT:试看分区格式与固态硬盘性能
固态硬盘迅速普及,相关应用问题也逐渐多了起来,尤其是如何做到性能的最优化?Tom'sHardware今天做了一个很特别的评测,考察了固态硬盘在FAT32、NTFS、exFAT三种不同分区格式行下的性能差异。或许很多玩家根本还没注意到这方面的影响吧。
FAT32:
1997年的Windows 95 OSR2第二版系统中首次引入,至今依然很流行,特别是低容量设备上,因为支持实在太过广泛,技术所有的主流操作系统都可以创建、读取、写入FAT32分区。
因为是32位文件系统,FAT32分区的最大容量只有2TB,8KB簇下也不过32TB,单个文件体积更是不能超过4GB,文件名长度也不可以超过255个字符。
另外,FAT32不支持日志、版权管理等高级技术,安全性也很差。
NTFS:
全称New Technology File System(新技术文件系统),Windows NT的新特性,属性类似IBM HPFS。文件体积最大16TB(理论上16EB),分区容量最大256TB,不过文件名还是最多255个字符。
NTFS还支持LZ77压缩、文件级加密(一般是AES)、访问控制(ACL),簇尺寸减小到4KB(这一点对固态硬盘很重要)。主文件表(MFT)负责存储稳健的属性、位置、访问信息。
exFAT:
微软专门为闪存设备设计的文件系统,高容量的SDXC卡默认都是这种格式,但也并不强求。Windows XP SP2、Windows Vista SP1及以上系统都支持,分区最大容量64ZB,文件体积最大16EB。簇尺寸可以大到16MB,访问控制则还是依靠ACL。
exFAT利用剩余空间位图来管理容量分配,提高删除性能,这对改善写入性能非常重要,尤其是对比NTFS。
但要注意的是,在exFAT分区上安装Windows系统是不可能的。Windows Vista/7都非常依赖NTFS的文件许可等特性。
不过由于微软授权机制的限制,exFAT的普及并不广泛,在消费电子领域的应用也不是特别多。
测试平台配置:
处理器:Core i5-2500K 3.3GHz
主板:技嘉GA-Z68X-UD3H-B3
内存:海盗船TR3X6G1600C8D DDR3-1333 2GB×2
系统盘:Intel X25-M G1 80GB (固件0701)
测试盘:三星830 256GB、思民F1 240GB
控制器:Intel Z68 SATA 6Gbps
电源:海韵X-760 760W
操作系统:Windows 7 SP1 x64旗舰版
驱动程序:Intel INF 9.2.0.1030、Intel RST 10.5.0.1026
参测固态硬盘之二:思民F1 240GB (SandForce SF-2281主控)
AS SSD 4KB随机读写:FAT32上三星830的写入慢了太多,但是思民F1上又是最好的,这似乎不是分区格式本身的问题。
AS SSD 4KB随机读写(队列深度64):exFAT都是最好的,NTFS紧随其后,FAT32就完全不行了,不过注意普通桌面应用是极少能涉及到64的队列深度的。
AS SSD持续读写:FAT32再次败下阵来,特别是思民F1上惨不忍睹。exFAT、NTFS读取都差不多,但写入得看硬盘。
AS SSD访问时间:exFAT、NTFS旗鼓相当,FAT32又一次不济。
AS SSD拷贝测试:这个项目更偏向实际情况,NTFS自然是首选,FAT32老了。
AS SSD整体得分:exFAT、NTFS彼此彼此,互有高低。
CrystalDiskMark 4KB随机读写:FAT32的读取还好,写入就不行了,意料之中。
CrystalDiskMark 4KB读写(队列深度32):同上。
CrystalDiskMark 512KB随机读写:exFAT在三星830上很突出,思民F1上则是NTFS略略占优,看来不同固态硬盘的影响也不小。
CrystalDiskMark持续读写:这次三种各式完全一致,难得。
Iometer 4KB随机读写:FAT32还是读取勉强还能凑合,写入就完全不行了。
Iometer持续读写:几乎完全一样,FAT32只是偶尔稍稍落后一点。
Iometer数据库模式:FAT32大败,NTFS大胜。
Iometer网络服务器模式:FAT32这次还不错。
Iometer工作站模式:FAT32又成了阿斗。
PCMark 7:媒体中心、Windows Media Player添加音乐两个项目都惊人地一致,程序载入、游戏、Windows Movie Maker视频编辑、Windows Defender、系统存储等项目FAT32稍稍落后但不明显,Windows照片库导入图片因为要写入很多数据,FAT32劣势就出来了。
小结:
如果你使用Windows系统,NTFS文件系统显然是上佳之选。这种默认的分区格式在测试的两块固态硬盘上基本都可以带来最好的性能,便利性也是最好的,而且很多非Windows系统也能读取它,有着较好的跨系统兼容性。
FAT32虽然有着最广泛的平台兼容性,但毕竟廉颇老矣,除了小容量U盘之外实在不推荐使用。缺乏各种先进特性,读写性能也是一塌糊涂。
exFAT其实也表现良好,很多时候甚至要比NTFS更好一些,良好的热插拔支持更是使得它非常适合外接USB存储设备,不过内部硬盘最好还是选NTFS,尤其是系统盘只能用NTFS。如果你有多块固态硬盘,内NTFS外exFAT或许是最佳选择。