FATFS介绍及相关参数计算

1.相关概念
Volume的概念:卷,例如C盘。除开前63个扇区,
Clusters:文件系统的基本操作单元
Sector:扇区,flash的操作单元
MBR 主引导记录(MBR,Master Boot Record)由 446 个字节的引导代码、64 字节的主分区(4 个)表及两个字节的签名值“55 AA”组成

VBR:卷引导记录VBR除了包含引导启动代码,还包含文件系统的元数据。

2.MBR,VBR,DIR结构及扇区划分

格式化的过程,写入分区表
0扇区写主引导区MBR (boot区)
MBR表的起始从446开始,
四个分区,每个分区为16字节信息共64字节,加两字节的数字签名刚好为一个扇区大小512,其他填0
#define MBR_Table           446     /* MBR: Offset of partition table in the MBR */
#define SZ_PTE              16      /* MBR: Size of a partition table entry */

//********************************
#define PTE_Boot            0       /* MBR PTE: Boot indicator */
#define PTE_StHead          1       /* MBR PTE: Start head */
#define PTE_StSec           2       /* MBR PTE: Start sector */
#define PTE_StCyl           3       /* MBR PTE: Start cylinder */
#define PTE_System          4       /* MBR PTE: System ID */
#define PTE_EdHead          5       /* MBR PTE: End head */
#define PTE_EdSec           6       /* MBR PTE: End sector */
#define PTE_EdCyl           7       /* MBR PTE: End cylinder */
#define PTE_StLba           8       /* MBR PTE: Start in LBA */
#define PTE_SizLba          12      /* MBR PTE: Size in LBA */ word

//**********************************
上面为每个分区的16字节含义

下面为实现的部分源码
        if (!(opt & FM_SFD)) {    /* Create partition table if in FDISK format */
            mem_set(buf, 0, ss);
            st_word(buf + BS_55AA, 0xAA55);        /* MBR signature */
            pte = buf + MBR_Table;                /* Create partition table for single partition in the drive */446
            pte[PTE_Boot] = 0;                    /* Boot indicator */
            pte[PTE_StHead] = 1;                /* Start head */
            pte[PTE_StSec] = 1;                    /* Start sector */
            pte[PTE_StCyl] = 0;                    /* Start cylinder */
            pte[PTE_System] = sys;                /* System type */0
            n = (b_vol + sz_vol) / (63 * 255);    /* (End CHS may be invalid) */
            pte[PTE_EdHead] = 254;                /* End head */
            pte[PTE_EdSec] = (BYTE)(((n >> 2) & 0xC0) | 63);    /* End sector */63
            pte[PTE_EdCyl] = (BYTE)n;            /* End cylinder */0
            st_dword(pte + PTE_StLba, b_vol);    /* Start offset in LBA */63
            st_dword(pte + PTE_SizLba, sz_vol);    /* Size in sectors */数据的扇区3937

Volbase 1个
63扇区填引导程序VBR,包含名字,fat类型,卷的大小等

FAT VBR 分区表结构
   /* FatFs refers the FAT structure as simple byte array instead of structure member
/ because the C structure is not binary compatible between different platforms */

#define BS_JmpBoot          0       /* x86 jump instruction (3-byte) */
0x90feeb
#define BS_OEMName          3       /* OEM name (8-byte) */
MSD0S5.0
#define BPB_BytsPerSec      11      /* Sector size [byte] (WORD) */
0X200  512Byte
#define BPB_SecPerClus      13      /* Cluster size [sector] (BYTE) */
0x1 1个扇区
#define BPB_RsvdSecCnt      14      /* Size of reserved area [sector] (WORD) */ 1个
#define BPB_NumFATs         16      /* Number of FATs (BYTE) */1
#define BPB_RootEntCnt      17      /* Size of root directory area for FAT [entry] (WORD) */0x200  /* Number of root directory entries */
#define BPB_TotSec16        19      /* Volume size (16-bit) [sector] (WORD) */0x5fc1
#define BPB_Media           21      /* Media descriptor byte (BYTE) */
#define BPB_FATSz16         22      /* FAT size (16-bit) [sector] (WORD) */96个
#define BPB_SecPerTrk       24      /* Number of sectors per track for int13h [sector] (WORD) */63个
#define BPB_NumHeads        26      /* Number of heads for int13h (WORD) */255
#define BPB_HiddSec         28      /* Volume offset from top of the drive (DWORD) */63个
#define BPB_TotSec32        32      /* Volume size (32-bit) [sector] (DWORD) */0
#define BS_DrvNum           36      /* Physical drive number for int13h (BYTE) */128
#define BS_NTres            37      /* WindowsNT error flag (BYTE) */0
#define BS_BootSig          38      /* Extended boot signature (BYTE) */41
#define BS_VolID            39      /* Volume serial number (DWORD) */
#define BS_VolLab           43      /* Volume label string (8-byte) */
#define BS_FilSysType       54      /* Filesystem type string (8-byte) */
#define BS_BootCode         62      /* Boot code (448-byte) */
#define BS_55AA             510     /* Signature word (WORD) */




Fatbase 共32扇区,文件系统本身大小  fat12
64-95 共0x20h 
st_dword(buf + 0, (fmt == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8);    
64扇区头填 0x08 0xff 0xff (标记)其他填0
65-95填0  
Dirbase:根目录扇区存放文件名,初始全填0
96-127 
Database:真正用于存放数据
128扇区开始
一个保留扇区,一个fat文件扇区32,512个目录,每个目录32个字节,占32个扇区,

共65个扇区/* RSV + FAT + DIR */
/* Number of clusters */Volume-65 = 3937-65=3872可用于操作的单元

在挂载中
功能:加载文件系统对象到工作区FATFS
核心函数:check_fs(fs,bsect)
用于加载扇区0并检测有无启动程序
核对跳转代码,数字签名,文件系统类型
1.    加载boot record signature 55aa
2.    得到分区的偏移63 
3.    MBR_TABLE 446
4.    454存储引导程序的扇区


根目录的结构

#define DIR_Name            0       /* Short file name (11-byte) */
#define DIR_Attr            11      /* Attribute (BYTE) */
#define DIR_NTres           12      /* Lower case flag (BYTE) */
#define DIR_CrtTime10       13      /* Created time sub-second (BYTE) */
#define DIR_CrtTime         14      /* Created time (DWORD) */
#define DIR_LstAccDate      18      /* Last accessed date (WORD) */
#define DIR_FstClusHI       20      /* Higher 16-bit of first cluster (WORD) */
#define DIR_ModTime         22      /* Modified time (DWORD) */
#define DIR_FstClusLO       26      /* Lower 16-bit of first cluster (WORD) */
#define DIR_FileSize        28      /* File size (DWORD) */

Fat文件分配原则,下一可用分配
NTFS:最优分配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值