4193|9

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

大家来讨论一关于FAT16的问题"RootDirSectors= ((BPB_RootEntCnt*32) + (BPB_BytsPerSec–1)) /BPB [复制链接]

在微软的硬件白皮书中关于根目录区所占扇区规模的计算公式中
RootDirSectors =((BPB_RootEntCnt*32)+(BPB_BytsPerSec–1))/BPB_BytsPerSec

//BPB_RootEntCnt 为根目录表项,BPB_BytsPerSec为每扇区字节数(一般为512),
//在白皮书中所描述的BIOS Parameter Block中已规定对于FAT16卷,"BPB_RootEntCnt * 32"一定等于偶数个扇区,也就是用
"BPB_RootEntCnt * 32/BPB_BytsPerSec"本身就可以表示根目录所占扇区规模了,但为什么还要另外加上一个
"(BPB_BytsPerSec – 1)/BPB_BytsPerSec"呢?而且计算方式是向上舍入(rounds up),
也就是(BPB_BytsPerSec – 1)/BPB_BytsPerSec=1,有什么用意吗,有兴趣的朋友一起来讨论这个问题吧

最新回复

公式之所以在分子上加上(BPB_BytsPerSec–1),是为了保证根目录区没有填满整数个扇区时仍然适用。其实也可以将公式变成下面这样演算: RootDirSectors = (BPB_RootEntCnt*32)/BPB_BytsPerSec                = RootDirSectors'(商) + 余数/BPB_BytsPerSec                 其中RootDirSectors'就是(BPB_RootEntCnt*32)/BPB_BytsPerSec得到的整数部分,“余数/BPB_BytsPerSec”就是小数部分。 所以计算RootDirSectors的值就需要做如下判断: (1)当余数=0时,RootDirSectors = RootDirSectors' (2)当余数!=0时,RootDirSectors = RootDirSectors' + 1 所以文中所说的白皮书中的公式,我们可以根据我在前面提到的演算过程拆分成这样: RootDirSectors =((BPB_RootEntCnt*32)+(BPB_BytsPerSec–1))/BPB_BytsPerSec                = RootDirSectors' + 余数/BPB_BytsPerSec + (BPB_BytsPerSec–1)/BPB_BytsPerSec                = RootDirSectors' + (余数 + (BPB_BytsPerSec–1))/BPB_BytsPerSec 这样无论余数是否为0,我们只需要对这个公式计算结果取整做为RootDirSectors,结果都和(1)、(2)的判断所得到的结果一样。 所以白皮书中的公式简化了判断,方便了计算。            详情 回复 发表于 2009-12-6 17:03
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
有意义,作字节 对齐用,
我最近也在研究该东西

给我发一份 微软的硬件白皮书 吧, 多谢了

hgang.M@gmail.com
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
白皮书中写的是应当而不是必须吧,这个大概是为了提高兼容性,所以这样计算
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
lsmhg,资料已发到你邮箱,请查收

你说的"字节对齐作用",解释比较简单和牵强,不过你这句话提醒了我,我想微软的这个公式是同时用于计算FAT16和FAT12用的,
对于FAT16本身"(BPB_BytsPerSec – 1)/BPB_BytsPerSec"是没必要的,而对于FAT12由于它每个表项是1.5个字节,如果
应用不当的话有可能会造成"跨越扇区边界"的问题,故而保留了1个扇区,不知这样认识对不对,请朋友们继续发表看法.
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
应该是计算多少个扇区变成一簇。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
回jennyvenus :
这个公式是用于计算FAT16和FAT12根目录区所占扇区规模的,结果单位是扇区数
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
有问题请先GOOGLE,BAIDU
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
没遇到过这种情况.
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 
这个东西我都想一天了。。。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
公式之所以在分子上加上(BPB_BytsPerSec–1),是为了保证根目录区没有填满整数个扇区时仍然适用。其实也可以将公式变成下面这样演算:
RootDirSectors = (BPB_RootEntCnt*32)/BPB_BytsPerSec
               = RootDirSectors'(商) + 余数/BPB_BytsPerSec
               
其中RootDirSectors'就是(BPB_RootEntCnt*32)/BPB_BytsPerSec得到的整数部分,“余数/BPB_BytsPerSec”就是小数部分。
所以计算RootDirSectors的值就需要做如下判断:
(1)当余数=0时,RootDirSectors = RootDirSectors'
(2)当余数!=0时,RootDirSectors = RootDirSectors' + 1

所以文中所说的白皮书中的公式,我们可以根据我在前面提到的演算过程拆分成这样:
RootDirSectors =((BPB_RootEntCnt*32)+(BPB_BytsPerSec–1))/BPB_BytsPerSec
               = RootDirSectors' + 余数/BPB_BytsPerSec + (BPB_BytsPerSec–1)/BPB_BytsPerSec
               = RootDirSectors' + (余数 + (BPB_BytsPerSec–1))/BPB_BytsPerSec

这样无论余数是否为0,我们只需要对这个公式计算结果取整做为RootDirSectors,结果都和(1)、(2)的判断所得到的结果一样。
所以白皮书中的公式简化了判断,方便了计算。
         
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表