Почему FAT16 не может хранить более 2 ГБ?

25

Все сайты, на которые я захожу, чтобы искать информацию о FAT16, просто декларативно заявляют, что на нем не может быть выделено более 2 ГБ. ХОРОШО. Отлично. Я верю тебе. Но как вы пришли к такому выводу (кроме простого тестирования)?

Есть ли какая-то формула, которую можно использовать, чтобы определить, сколько может вместить система FAT16?

SangoProductions
источник
21
Есть причина, почему у FAT16 есть «16» в названии. :-)
Эрик Липперт
28
@EricLippert, чтобы быть справедливым, связь между этими 16 и 2 ГиБ не сразу очевидна, не зная, как работает FS.
Джои
18
Я не уверен на 100%, что этот вопрос действительно актуален для этого сайта. Возможно, это следует перенести на retrocomputing.stackexchange.com?
Жюль
3
Стоит отметить, что ограничение в 2 ГБ было практическим ограничением того, как MS-DOS и ранняя Windows обрабатывали FAT16. Концептуально возможно превышать 2 ГБ, но не совместимым с Microsoft способом.
phyrfox
3
@ LưuVĩnhPhúc Комментарий правильный. Я сказал «MS-DOS и ранняя Windows». Современные системы могут использовать более 2 ГБ в FAT16. Например, раздел FAT16 объемом 4 ГБ не будет работать в старых системах MS-DOS / Win3.1. И многие источники утверждали, что ограничение в 2 ГБ было либо потому, что они были написаны, когда этот предел был реальностью, либо вскоре после этого, когда вам посоветовали этого не делать, потому что немного более старые системы не могли с этим справиться. Более поздние системы могут справиться с этим просто отлично, но ограничение в 2 ГБ было эмпирическим правилом примерно до 2000 года или около того, а в последующие несколько лет после этого цитировалось старое, устаревшее ограничение.
phyrfox

Ответы:

66

FAT16 использует 16 бит для идентификации кластеров. Таким образом, до исчерпания идентификаторов существует максимум 65536 кластеров, а некоторые идентификаторы зарезервированы для использования не в файлах. Каждый файл занимает хотя бы один кластер. Большие кластеры увеличивают минимальное выделение для файла, увеличивая издержки на небольшие файлы.

Размер кластера сообщает вам максимальный идентифицируемый объем. Для кластеров 32 КБ это 32 * 1024 * 65536 B = 2 ГБ.

Вы можете бесконечно увеличивать размер кластера, увеличивая размер секторов на диске, но вы ограничены максимальным количеством файлов. Вы также можете столкнуться с проблемами с программным обеспечением, которое принимает размер сектора по умолчанию (512B)

В тот момент, когда были доступны физические тома объемом ~ 2 ГБ, процессоры и операционные системы были 32-битными, поэтому переход на FAT32 был разумным выбором, позволяя значительно большему количеству файлов в небольших кластерах

Caleth
источник
4
«но увеличить накладные расходы для небольших файлов» Не уверен, что это будет понятно для всех, так как я не уверен, что все поймут, что подразумевается под «накладными расходами» в этом контексте. Я думаю, что пример помог бы: «Например, файл с одним символом занимает 1 кластер на диске, большая часть которого полностью потрачена впустую. Большие размеры кластера означают больше отходов».
Реджинальд Блю,
3
Несколько поясняющих замечаний: 32 КБ - это максимальный размер кластера для различных версий DOS и Windows, но семейство Windows NT поддерживает кластеры большего размера, начиная с NT 4.0 (и, следовательно, потребительские версии Windows, начиная с XP, также поддерживают его, поскольку они ' основаны на ядре NT). Это позволяет размеры до 16 ГБ, хотя из-за неэффективности, как отмечено в ответе, это вряд ли будет полезным. Вы могли бы правдоподобно использовать такую систему , если вы хотите хранить в основном большие файлы, особенно если они пришли в упаковке размера кластера 256KiB вам придется использовать ...
Джулс
5
... но тогда вы, вероятно, достигнете следующего предела, что является проблемой как для FAT16, так и для FAT32: максимальный размер файла ограничен 1 байтом, не превышающим 4 ГБ из-за того факта, что для его хранения выделено только 4 байта записи каталога. OTOH, если у вас возникла необходимость хранить большое количество файлов размером от 256 КБ до 2 ГБ с размерами степени двух и общим размером <16 ГБ, FAT16 потенциально является для них наиболее эффективным форматом.
Жюль
@Jules: только потенциально. Помните, что для каждого кластера накладные расходы. Файловые системы, позволяющие хранить прогоны, более эффективны при небольшой фрагментации.
Дедупликатор
12

На протяжении многих лет было несколько вариантов «FAT16» с разными ограничениями, но давайте рассмотрим версию, которая сохранилась от «compaq DOS 3.31» до windows 95.

Объемы FAT разделены на кластеры. Каждый кластер состоит из двух секторов. Количество секторов на кластер в FAT16 сохраняется как 8-битное число со знаком. Таким образом, максимально возможные сектора на кластер - 64.

Номера кластеров были сохранены как 16-битное значение без знака. Ограничение общего количества кластеров до 65536. Умножьте это на максимальное число секторов на кластеры, и вы получите ограничение в 4194304 сектора.

(Логический) размер сектора жестких дисков составляет 512 байт. Умножьте это на ограничение на число секторов, упомянутых выше, и вы получите свой лимит 2 ГБ. В принципе, среда с большими размерами сектора может поддерживать больший объем FAT16, но я не думаю, что это произошло на практике.

Windows NT изменила интерпретацию поля «секторы на кластер» на 8-битный без знака. Это позволило разделить 4GiB FAT16 с секторами 512 байт (и теоретически больше на дисках с большими секторами). В AIUI windows 98 добавлена ​​поддержка чтения и записи таких разделов, но он не мог их создать, а дисковые утилиты не могли их починить.


Конечно, было бы возможно сделать относительно небольшие изменения в формате файловой системы для поддержки больших кластеров и, следовательно, больших объемов. Однако MS решила пойти на более радикальный вариант перехода на 32-битный кластерный индекс с Windows 95 OSR2, производящей FAT32.

Я считаю, что причиной перехода на более радикальный вариант была космическая эффективность. Учитывая типичные размеры файлов в то время, кластеры размером 32 кБ уже были довольно расточительными, а более крупные были бы даже такими.

Питер Грин
источник
4
Мне приходилось задумываться над тем, что «максимально возможное число секторов на кластер равно 64», пока не получил его: 64 действительно является самой большой степенью 2, которую вы можете представить в байте со знаком: 128 не представляется возможным в качестве максимального положительного числа со знаком значение байта равно 127.
Ральф Клеберхофф
3
@RalfKleberhoff Это, естественно, приводит к последующему вопросу: если вы храните степень два, зачем хранить само число, а не показатель степени на двух?
Даниэль Вагнер
@DanielWagner Я абсолютно согласен. Тем более что тогда, когда FAT16 был создан, сдвиг был определенно более дешевой операцией, чем умножение. Но, вероятно, они были просто счастливы запустить его, а не программировать его десятилетиями в будущем ...
Ральф Клеберхофф