Closed GoogleCodeExporter closed 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
Original comment by solrex
on 26 Sep 2008 at 12:32
> 第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
Original issue reported on code.google.com by
yangle0...@yahoo.com.cn
on 15 Aug 2008 at 12:24