OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13395|回复: 6

FATFS中chk_mount函数中的关于FAT文件系统的疑问

[复制链接]

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-9-24 16:45:19 | 显示全部楼层 |阅读模式
在FATFS中经常用到chk_mount这个函数,主要是对物理驱动器检测它的可用性,即磁盘现在是否可用,避免了磁盘中途掉电的情况,在其中有这么一段程序

fmt = check_fs(fs, bsect = 0); /* Check sector 0 if it is a VBR */可用的分区记录
if (fmt == 1) { /* Not an FAT-VBR, the disk may be partitioned */
//结束符正确,确不是FAT系统,则读取下一个分区的数据,看是否是有效的结束符和FAT系统
/* Check the partition listed in top of the partition table */
tbl = &fs->win[MBR_Table + LD2PT(vol) * SZ_PTE];/* Partition table */下一个分区属性的16字节存储指针
if (tbl[4]) { /* Is the partition existing? */系统ID对于FAT32为0x01,未用是为0
bsect = LD_DWORD(&tbl[8]); /* Partition offset in LBA */分区偏移地址
fmt = check_fs(fs, bsect); //root record /* Check the partition */这一句不懂了
}
}
这一次它是要检测什么的??

后来想了一想,对于我们的硬盘,大多是只有一个分区的,但是有的可能会有多个分区,而对于每一个分区而言,他都有一个MBR区,又称为伪MBR区,存储了这一个分区的引导程序,以及分区的信息,这样的话,如果第一个分区不是FAT系统,我们就查找是否又下一个分区,如果有的话,就开始对下一分区的判断……

努力,前进。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-9-24 16:48:25 | 显示全部楼层
但是为什么它只检测了两个分区呢,可能后面还有分区呢???
努力,前进。
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-9-24 16:49:09 | 显示全部楼层
if (fmt == 3) return FR_DISK_ERR;
if (fmt) return FR_NO_FILESYSTEM; /* No FAT volume is found */
//两次检测之后还不是FAT系统,就返回错误
努力,前进。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-24 23:01:54 | 显示全部楼层
网上有个网友对FATFS的源码进行了很详细的解释,你可以参考下他的文章。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
 楼主| 发表于 2012-9-25 10:14:29 | 显示全部楼层
看过几篇,不过都是讲的函数的功能,对于内部怎么实现的看完之后还是一头雾水,所以从代码开始看起,也不是太长,呵呵打印下来,双面索引也就二三十页
努力,前进。
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2012-11-11
在线时间
1 小时
发表于 2012-11-14 09:31:35 | 显示全部楼层
回复【楼主位】5498折戟沉沙:
---------------------------------
我的理解是:
在一些SD1.0中,物理0扇区就是逻辑0扇区,0扇区就是DBR,没有MBR,这种情况也就不存在分区,第一个fmt = check_fs(fs, bsect = 0);会返回0,因为check_fs里的第三个或第四个if判断会检测到DBR里面的FAT系统标识字符串,其中一个会返回0,fmt=0,fmt = check_fs(fs, bsect);就不会执行了
*********************************************
if (disk_read(fs->drive, fs->win, sect, 1) != RES_OK) /* Load boot record */
return 3;
if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) /* Check record signature (always placed at offset 510 even if the sector size is >512) */
return 2;

if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) /* Check "FAT" string */
return 0;
if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146)
return 0;

return 1;
************************************************

而在一些有MBR的sd卡中物理0扇区是MBR,mbr里有DBR的偏移信息,执行fmt = check_fs(fs, bsect = 0);的时候,第一个和第二个if会通过,但是mbr里面没有fat标识字符串,所以第三个和第四个if不会过,返回1,fmt=1就会执行fmt = check_fs(fs, bsect);其中bsect是从mbr里读出来的逻辑0扇区偏移量,既DBR所在扇区,这次执行就同上面读DBR一样,会再第三个或第三个if返回0.
回复 支持 反对

使用道具 举报

7

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2013-6-29
在线时间
0 小时
发表于 2013-8-15 01:44:36 | 显示全部楼层
楼上基本上说全了。
chaN的驱动是针对sd,ata,usb,nand的,不单单是sd。我的sd2.0是没有MBR的,0扇区就是DBR。而PC硬盘ata的MBR就在0扇区。
我们重装PC的时候硬盘是可以选择NTFS和FAT等格式。
在有MBR的前提下,就有DPT,紧接MBR引导代码是DPT和“55AA”,DBR是在偏移X扇区里,X就是代码的tbl[8]的双字(4字节),也就是DPT的OFFSET 8~11。
假设有4分区,那么只要第一次检查0扇区是不是DBR,如果不是就检查第二次(只需检查1次即可,无需检查多次,目的是验证是否是FAT),检查偏移X扇区。
执行check_fs(fs, bsect);后返回0,则说明第4分区DBR就在X扇区,验证成功,返回!0则错误。

以上个人见解,不对请及时纠正。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 02:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表