Сколько нужно секторов на FAT?

Тема в разделе "WASM.ZEN", создана пользователем Black_mirror, 5 янв 2007.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    http://www.wasm.ru/docs/11/fatgen103-rus.zip
    На странице 21 написано:
    Код (Text):
    1. RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec – 1)) / BPB_BytsPerSec;
    2. TmpVal1 = DskSize – (BPB_ResvdSecCnt + RootDirSectors);
    3. TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs;
    4. If(FATType == FAT32)
    5.     TmpVal2 = TmpVal2 / 2;
    6. FATSz = (TMPVal1 + (TmpVal2 – 1)) / TmpVal2;
    Почему они решили что у них получается на 2 или на 8 секторов больше? Если BPB_NumFATs нечётное, в каждой копии FAT оказывается некоторое число лишних секторов примерно равное TMPVal1/(TmpVal2*TmpVal2).

    Если TMPVal1 будет кратно TmpVal2, то число записей в FAT как раз совпадёт с числом кластеров на диске, но поскольку первые две записи в FAT имеют специальное значение, а нумерация кластеров начинается с 2, то для двух последних кластеров не будет записей в FAT.

    По моему более правильная версия этого кода должна выглядеть так:
    Код (Text):
    1. If(FATType == FAT32){
    2.   TmpVal2 = ((128 * BPB_SecPerClus) + BPB_NumFATs);
    3.   FATSz = (TMPVal1*64+TmpVal2*64-1+TmpVal2) / (TmpVal2*64);
    4. }else{
    5.   TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs;
    6.   FATSz = (TMPVal1*128+TmpVal2*128-1+TmpVal2) / (TmpVal2*128);
    7. }
    Последнее слагаемое в вычислении FATSz это часть сектора, которую занимают первые две записи FAT.