Чому FAT16 не може зберігати більше 2 ГБ?


25

На всіх сайтах, які я заходжу шукати інформацію про FAT16, просто декларативно зазначається, що він не може виділити більше 2 ГБ. ДОБРЕ. Чудово. Я тобі вірю. Але як ви прийшли до такого висновку (крім того, щоб просто його перевірити)?

Чи існує якась формула, яку можна використати для визначення кількості системи FAT16?


21
Є причина, чому FAT16 має "16" у назві. :-)
Ерік Ліпперт

28
@EricLippert, якщо чесно, зв’язок між 16 та 2 ГБ не відразу очевидний, не знаючи, як працює ФС.
Джої

18
Я не переконаний на 100%, що це питання насправді тематично для цього сайту. Можливо, його слід перенести на сайт retrocomputing.stackexchange.com?
Жуль

3
Варто зазначити, що обмеження 2 Гб було практичним обмеженням того, як MS-DOS та ранні Windows обробляли FAT16. Концептуально можливо перевищити 2 Гб, але не сумісно з Microsoft.
фірфокс

3
@ LưuVĩnhPhúc Коментар правильний. Я сказав "MS-DOS і ранні Windows". Сучасні системи можуть використовувати більше 2 Гб у FAT16. Розділ 4 Гб FAT16 не працюватиме, наприклад, у старих системах MS-DOS / Win3.1. І багато джерел, які заявляли, що 2 Гб - це ліміт, було або тому, що вони були написані, коли цей ліміт був реальністю, або час незабаром після цього, де вам порадили цього не робити, оскільки трохи старші системи не могли це впоратися. Пізніші системи можуть впоратися з цим просто чудово, але обмеження на 2 Гб - це правило, яке склалося до 2000 року, і наступні кілька років після цього, коли наводиться старі застарілі межі.
фірфокс

Відповіді:


66

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

Потім розмір кластера вказує вам максимальний об'єм, який можна визначити. Для кластерів 32KiB, це 32 * 1024 * 65536 B = 2GiB.

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

У той момент, коли були доступні фізичні обсяги ~ 2GiB, процесори та ОС були 32-бітовими, тому перехід на FAT32 був розумним вибором, дозволяючи набагато більше файлів у невеликих кластерах


4
"але збільшити накладні витрати для невеликих файлів" Не впевнений, чи це буде зрозуміло для всіх, оскільки я не впевнений, що всі зрозуміють, що означає "накладні витрати" в цьому контексті. Я думаю, що приклад допоможе: "Наприклад, файл з одним символом займає 1 кластер на диску, більшість з яких повністю витрачено. Більший розмір кластера означає більше відходів".
Reginald Blue

3
Кілька уточнюючих зауважень: 32KiB був максимальним розміром кластера для різних версій DOS та Windows, але сімейство Windows NT підтримує більші розміри кластерів з NT 4.0 (і тому споживчі версії Windows з XP також підтримують його, оскільки вони ' повторно на основі ядра NT). Це дозволяє розмірами до 16 Гбіт, хоча через неефективність, як зазначено у відповіді, це навряд чи буде корисним. Ви могли б правдоподібно використовувати таку систему, якби хотіли зберігати переважно великі файли, особливо якщо вони входили в кратні розміри кластера 256KiB, які вам доведеться використовувати ...
Jules

5
... але тоді ви, швидше за все, перейдете до наступного обмеження, що є проблемою як для FAT16, так і для FAT32: максимальний розмір файлу обмежений 1 байтом 4GiB тим, що для його зберігання виділено лише 4 байти. записи в каталозі. В іншому випадку, якщо вам трапилася потреба зберігати велику кількість файлів розміром від 256 Кбіт до 2 Гбіт із потужністю двох розмірів та загальним розміром <16 Гбіт, FAT16 є потенційно найбільш ефективним форматом для них.
Жуль

@Jules: Тільки потенційно. Пам'ятайте, що існує накладні витрати на кластер. Файлові системи, що дозволяють зберігати запуски, ефективніші, якщо мало фрагментації.
Дедуплікатор

12

Насправді було кілька варіантів "FAT16" протягом багатьох років з різними обмеженнями, але давайте розглянемо версію, що зберігалася від "compaq DOS 3.31" до Windows 95.

Обсяги FAT поділяються на кластери. Кожен кластер складається з потужності двох секторів. Кількість секторів на кластер FAT16 зберігається як 8-бітове підписане число. Отже максимально можливі сектори на кластер - 64.

Номери кластерів зберігаються у вигляді 16-бітного неподписаного значення. Обмеження загальної кількості кластерів до 65536. Помножте на максимальну кількість секторів на кластери, і ви отримаєте ліміт 4194304 секторів.

Розмір (логічного) сектора жорстких дисків - 512 байт. Помножте це на обмеження кількості згаданих вище секторів, і ви отримаєте свій ліміт 2GiB. У принципі, середовище з більшими розмірами сектору може підтримувати більший обсяг 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, переміщення було, безумовно, дешевшою операцією, ніж множення. Але, напевно, вони просто раді його запустити, а не
розробити
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.