BackupGGCode / writeos

Write Your Own OS with Free and Open Source Software (Chinese)
1 stars 1 forks source link

关于FAT的一些计算公式 #3

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
第29页

RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytesPerSec - 1)) / 
BPB_BytsPerSec

虽说也算正确,但所加(BPB_BytesPerSec - 
1)是为了避免除数为零的情况,去掉可能会更清
楚些,即写成:
RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

--------------------------------------------------------------------------
FirstRootDirSecNum = BPB_RsvdSecCnt + (BPB_NumFATs * BPB_FATSz16)

这个公式应再加1,因为BPB_NumFATs 
(2)*BPB_FATSz16(9)=18,这得出的是FAT的最后一
个扇区而非根目录的第一个扇区

第34页

Fig 2.16: 搜索loader.bin使用的变量定义

18 .set DeltaSecNo, 17 /* BPB_(RsvdSecCnt+NumFATs*FATSz) -2 */

这个注释可以加个1,即改为/*BPB_(RsvdSecCnt+NumFATs*FATSz)+1 
-2*/,否则18-2=16算
不出17啊;但是这样实在是太啰嗦了,不如直接改为/*SecNoOfRoo
tDir-2*/

Original issue reported on code.google.com by yangle0...@yahoo.com.cn on 15 Aug 2008 at 12:24

GoogleCodeExporter commented 9 years ago
前一阵比较忙,很抱歉现在才来了解这个 issue。

> 第29页
> RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytesPerSec - 1)) / 
> BPB_BytsPerSec

> 虽说也算正确,但所加(BPB_BytesPerSec - 
1)是为了避免除数为零的情况,去掉可能会更清
> 楚些,即写成:
> RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

加这个数值并不是为了避免除数为0,而是为了使算法正确。�
��如根目录只有一个项,它就占用
32 B,那么 32/512 = 
0,这显然是不对的,因为在这时它肯定是要占用 1 
个扇区的。加上
(BPB_BytesPerSec-1) 是为了给 (BPB_RootEntCnt*32)/BPB_BytsPerSec 
的实数值取 ceil 而不
是 floor。还是刚才的例子,(32+511)/512 = 
1,这就是我们要的正确结果了。

> FirstRootDirSecNum = BPB_RsvdSecCnt + (BPB_NumFATs * BPB_FATSz16)
> 这个公式应再加1,因为BPB_NumFATs 
(2)*BPB_FATSz16(9)=18,这得出的是FAT的最后一
> 个扇区而非根目录的第一个扇区

这里扇区的 index 和 C 语言数组一样,是从 0 开始的 :)

> 第34页
> Fig 2.16: 搜索loader.bin使用的变量定义
> 18 .set DeltaSecNo, 17 /* BPB_(RsvdSecCnt+NumFATs*FATSz) -2 */
> 这个注释可以加个1,即改为/*BPB_(RsvdSecCnt+NumFATs*FATSz)+1 
-2*/,否则18-2=16算
> 
不出17啊;但是这样实在是太啰嗦了,不如直接改为/*SecNoOfRoo
tDir-2*/

可能你代入错误了,BPB_RsvdSecCnt:1, NumFATs: 2, FATSz: 
9,代入这个式子就是 (1+2*9)-2
= 17。

Original comment by solrex on 5 Sep 2008 at 8:08

GoogleCodeExporter commented 9 years ago

Original comment by solrex on 26 Sep 2008 at 12:32

GoogleCodeExporter commented 9 years ago
> 第29页
> RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytesPerSec - 1)) / 
> BPB_BytsPerSec

> 虽说也算正确,但所加(BPB_BytesPerSec - 
1)是为了避免除数为零的情况,去掉可能会更清
> 楚些,即写成:
> RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

>>加这个数值并不是为了避免除数为0,而是为了使算法正确��
�比如根目录只有一个项,它就占用
>>32 B,那么 32/512 = 
0,这显然是不对的,因为在这时它肯定是要占用 1 
个扇区的。加上
>>(BPB_BytesPerSec-1) 是为了给 (BPB_RootEntCnt*32)/BPB_BytsPerSec 
的实数值取 ceil 而不
>>是 floor。还是刚才的例子,(32+511)/512 = 
1,这就是我们要的正确结果了。
这段话我还是没明白,那是否意味着根目录区的总大小是不��
�定的?我觉得根目录区的项目数目虽然是动态变化的,但是�
��于FAT12来说,对于BPB_RootEntCnt的最大值是224,那么根目录区��
�占的最大扇区数目:(224*32+511)/512=14,这14个扇区,文件簇
区域是不能占用的吧。。。。

Original comment by chg...@qq.com on 9 Dec 2010 at 3:02