2016-05-14 24 views
-1

Я реализующий файловую систему FAT в C. Я следующий спецификации, опубликованные Microsoft (http://read.pudn.com/downloads77/ebook/294884/FAT32%20Spec%20%28SDA%20Contribution%29.pdf)Как вычислить размер FAT в FAT файловой системы

Но я не понимаю, как вычислить размер FAT поле загрузочного сектора. В спецификации документа появится следующий код на странице 14.

RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec – 1))/BPB_BytsPerSec; 
TmpVal1 = DskSize – (BPB_ResvdSecCnt + RootDirSectors); 
TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs; 
If(FATType == FAT32) 
    TmpVal2 = TmpVal2/2; 
FATSz = (TMPVal1 + (TmpVal2 – 1))/TmpVal2; 
If(FATType == FAT32) { 
    BPB_FATSz16 = 0; 
    BPB_FATSz32 = FATSz; 
} else { 
    BPB_FATSz16 = LOWORD(FATSz); 
    /* there is no BPB_FATSz32 in a FAT16 BPB */ 
} 

Из этого кода я не понимаю

  1. Что такое TmpVal2?
  2. Почему используется номер 256?
  3. Зачем стоит FAT32 делиться на 2?

ответ

2

Я не уверен, почему была выбрана константа 256, однако здесь есть некоторые мысли по вашим другим вопросам.

Под фрагментом исходного кода есть примечание, в котором говорится, что математика является приближением.

ПРИМЕЧАНИЕ: Вышеуказанная математика не работает отлично. Он будет иногда устанавливать FATSz, который имеет до 2 секторов, слишком больших для FAT16, а иногда до 8 секторов, слишком больших для FAT32. Однако он никогда не вычислит значение FATSz , которое слишком мало. Потому что это нормально, если FATSz является слишком большим, за счет траты нескольких секторов, факт , что это вычисление удивительно просто более чем компенсирует его , находясь в безопасном режиме в некоторых случаях.

Способ, которым я читаю код, заключается в том, что расчет производится для размера FAT16, а затем выполняется корректировка для расчета, если целью является фактически FAT32.

Значение переменной TmpVal2 выглядит как размер единицы, в том, что объем пространства рассчитывается для значения TmpVal1 затем делится на значение размера блока из TmpVal2 для того, чтобы определить количество единиц дискового пространства. Однако в случае FAT32 размер блока меньше, чем в FAT16, поэтому необходимо выполнить настройку.

Похоже, что FAT16 использовал определенный размер для таблицы распределения файлов, а при увеличении объема жесткого диска, доступного для тома, с улучшением технологии диска, размер кластера был основан на размере тома. Таким образом, при меньшем размере тома размер кластера, количество секторов диска в блоке выделения, меньше размера кластера для большого размера тома. См. FAT16 vs. FAT32 in Microsoft TechNet, а также таблицы в исходном коде на стр. 13 документа, который вы ссылаетесь.

С FAT32 использовался стандартный размер кластера 4K, а хранилище таблиц распределения файлов было изменено с фиксированного размера на переменный размер и больше не находилось в фиксированном месте на диске.

Эта статья, File systems (FAT, FAT8, FAT16, FAT32, and NTFS) explained, содержит подробные сведения о различиях между этими различными версиями файловой системы.

Статья в Википедии File Allocation Table содержит немало технической информации со ссылками на другие статьи.

Вы также можете найти следующие предметы, представляющие интерес.

Converting the cluster number stored in FAT table (of FAT12 filesystem) for reading from a floppy disk

Why did Windows use the FAT structure instead of a conventional linked list with a next pointer for each data block of a file?