Ограничения BIOS, IDE и ОС на объём винчестеров
В далёких 80-х годах первые 10 Mb винчестеры казались просто гигантскими. Потом казались гигантскими на сотни мегабайт. Ну а после взятия рубежа в 10 Gb объём винчестеров стал расти просто до неприличия быстро. Однако такой резвый прогресс в области винчестеростроения породил так называемую "проблему больших дисков".
Дело в том, что обычно каждая новая версия ПО редко переписывалась начисто - в ее "теле" оставались ранее написанные подпрограммы. В результате наследовались различные ограничения, связанные с использованием старых кусков кода. (Например, даже в том же Award BIOS для современных плат многие важные подпрограммы были написаны в далёком 1990 году.) А каждый такой "кусок", имея собственные ограничения на максимальную используемую емкость винчестера, и порождал каждый раз всё новую проблему. И совершенно неправильно в многочисленных "железных" интернет-форумах многие пытаются объяснить проблему "больших" дисков чем-то одним, найти одного конкретного виновника. Мы же подойдём к проблеме комплексно, чтобы окончательно расставить все точки над "Ё".
Как система работает с диском
Чтобы разобраться с ограничениями на объем жестких дисков, нужно достаточно чётко представлять всю структуру работы с диском: от приложения до самих головок чтения/записи. Схематически процесс взаимодействия можно представить в следующем виде:
Рассмотрим "форматы" каждого из слоев.
1. Винчестер физически состоит из одной или нескольких пластин, покрытых магнитным слоем. С обеих сторон пластины (иногда - только с одной) располагаются головки чтения/записи информации. Информация записывается на "дорожки", которые в случае нескольких головок образуют цилиндр. Дорожка разбита на секторы, каждый из которых и представляет тот минимальный блок информации, который можно записать на диск. Стандартный размер сектора - 512 байт. Самые первые винчестеры имели постоянное количество секторов на дорожку на всём диске. Однако это не позволяло эффективно использовать всю поверхность диска - каждая следующая внешняя дорожка длинней внутренней, соответственно, на ней может поместиться больше информации. Поэтому современные винчестеры разбиты на "зоны", то есть совокупности соседних дорожек с одинаковым количеством секторов на дорожку, и с приближением к центру винчестера количество секторов в зоне дискретно уменьшается. Именно поэтому график линейного чтения винчестера (исправного) выглядит в виде нисходящих ступенек.
2. Контроллер винчестера управляет работой головок чтения/записи. Он переводит команды "интерфейса" в электрические сигналы на головках. Интерфейсы бывают разные: "доисторические" ST506 и ESDI, современные ATA (IDE) и SCSI, "будущие" Serial ATA и Serial SCSI. Нас, естественно, интересует IDE-винчестеры, потому и рассмотрим интерфейс ATA.
Исторически первой появилась CHS-адресация (C - Cylinders, H - Heads, S - Sectors). В интерфейсе ATA предусмотрено:
- для "С" - два байта (16 бит);
- для "S" - один байт минус 1 сектор (8 бит - 1);
- для "H" - полбайта (4 бита).
Итого, максимальный винчестер для CHS-адресации:
216 x (28-1) x 24 = 65536 x 255 x 16 = 267386880 секторов. В секторе 512 байт, значит:
HDDmax (CHS) = 65536 x 255 x 16 x 512 = 136902082560 байт = 136.9 Gb (127,5 ГБ)*
Все современные винчестеры используют линейную LBA-адресацию. В этом случае номер каждого сектора представляет собой одно 28-битное число, и максимальным диском для LBA будет:
HDDmax (LBA) = 228 x 512 = 137438953472 байт = 137.4 Gb (128 ГБ)
3. BIOS по вышеописанной "иерархии" находится между ОС и контроллером винчестера. В его функцию входит перевод команд запроса на работу с диском от ОС в команды контроллера винчестера.
Большинство программного обеспечения использует CHS-адресацию. Поэтому с появлением LBA-винчестеров, чтобы не переписывать имеющееся ПО, поступили следующим образом. BIOS в случае определения LBA-винчестера переводит его параметры в CHS-версию, и ОС "думает", что работает с CHS-винчестером. То есть 28-битное значение LBA "раскладывается" следующим образом: "цилиндрические" 16 бит + "секторные" 8 бит + "головчатые" 4 бита (итого 16+8+4=28). Или конкретно:
- биты 0-7 - сектор (+1 шт., т.к. адресация CHS начинается с 1-го, а не 0-го сектора);
- биты 8-15 - цилиндр, младший байт;
- биты 16-23 - цилиндр, старший байт;
- биты 24-27 - головка.
При получении запроса на работу с диском BIOS переводит для контроллера это значение обратно в LBA:
LBA = [(цилиндр * число головок + номер головки) * количество секторов на дорожку] + (номер сектора - 1)
4. В далекие, еще DOS'овские времена, разработчики не подозревали, что когда-то емкость винчестеров будет измеряться десятками и даже сотнями гигабайт. Ведь самый богатый в мире человек (и самый проклинаемый компьютерной братией в одном лице) тоже как-то рассуждал "о бесконечности" 640 кБ оперативной памяти. В результате для адресации CHS в DOS (int 13h) была выбрана следующая "трёхбайтовая" система:
- один байт - для младших битов значения цилиндров (0-7 биты);
- один байт - для двух старших бит значения цилиндров (8-9 биты) и шесть битов значения сектора;
- один байт - для значения головок.
Итого получалось, что "C" = 0-1023, "H" = 0-255 и "S" = 1-63. Следовательно, максимальным винчестером, с которым способен работать DOS, будет:
HDDmax (DOS) = 1024 x 256 x 63 x 512 = 8455716864 = 8.46Gb (7,88 ГБ)
Или для LBA-адресации это получается 24-битное (3 байта) число:
HDDmax (DOS-LBA) = 224 x 512 = 8589934592 = 8.59 Gb (8 ГБ)
5. Приложения используют определённую файловую систему, которая также имеет свои ограничения. Например, в случае с FAT16 объем раздела зависит от величины кластера, и максимальное количество кластеров ограничено числом 216. Кластер - это совокупность секторов, и его максимальный объем - 64 сектора ("нестандартные" 128 и больше позволяют делать лишь linux-образные утилиты), т.е. 32 кБ. Максимальный раздел для FAT16 получается таким:
FAT16max = 216 x 32 кБ = 2147483648 = 2.15 Gb (2 ГБ)
Барьеры емкости
Теперь, зная все моменты, попробуем восстановить хронологию возникновения проблем "больших" дисков.
134 Mb, год 1990-й
Самая старая и, наверное, уже мало кому известная проблема касается времен 100 Mb (не Gb!) винчестеров. Использовалась тогда FAT12, для которой максимальным был раздел:
FAT12max = 212 x 32 кБ = 134217728 = 134 Mb (128 МБ)
Способ решения простой - переход на FAT16 (для этого-то она и создавалась).
528 Mb, год 1993-й
Самая первая, самая известная и самая серьёзная проблема, затронувшая CHS.
Дело в том, что все первые биосописатели не рассчитывали, что когда-то в их детища кто-нибудь попытается засунуть такие "гигантские" винты. Проблема была из-за того, что в BIOS'е для CHS было выделено:
- для С - 10 бит, итого 210 = 1024 максимум;
- для H - 4 бит, итого 24 = 16 максимум;
- для S - 6 бит, итого 26 - 1 = 63 максимум.
При таком подходе максимальный установленный винчестер мог быть:
HDDmax (oldBIOS) = 1024 x 16 x 63 x 512 = 528482304 = 528 Mb (504 МБ)
"Почему так мало выделялось?" - спросите вы. Всё просто: 10+4+6 и ещё 4 управляющих бита позволяли "вписаться" в три байта (24 бита). В то время с памятью была "напряженка", вот и экономили на каждом бите.;)
Решение проблемы имело три пути. Первый - это форматирование "слишком большого" винчестера с помощью встроенной в BIOS утилиты на 528 Mb. Такой способ был достаточно распространённым в своё время (из-за неопытности пользователей ;). Второй - использование специального ПО - Disk Managers (типа OnTrack, EZ-Drive и др.), заменяющего подпрограммы BIOS для работы с дисками своими собственными. Как правило, для работы такие программы модифицировали MBR диска. Однако это не позволяло корректно работать с диском при загрузке с другого винчестера (или даже дискеты), а также возникали большие проблемы с установкой нескольких ОС на такой диск.
Ну и третий - обновление BIOS. Однако флэш-память для микросхем BIOS не была тогда распространена, да и интернет не был развит, соответственно, и прошивок никто не делал и не выкладывал. Поэтому из-за малой практической эффективности всех этих способов плату нужно было просто заменить на "поддерживающую LBA".
2.11 Gb, год 1996-й
Многие биосописатели не учли предыдущего опыта и добавили в BIOS всего 2 бита на цилиндры. Итого получалось:
HDDmax (1996) = 212 x 16 x 63 x 512 = 2113929216 = 2.11Gb (1.97ГБ)
Причём некоторые версии определяли только "часть" винчестера (например, 2.5 Gb определялся как 425 Mb), а некоторые просто зависали при автоопределении винчестера из-за неправильного перерасчёта головок.
Решение проблемы - обновление BIOS (либо использование disk managers).
2.15 Gb, год 1996-й
Только появившаяся Windows95 (версия "A", не OSR) использовала DOS-овские FAT16 и потому наследовала все его проблемы - вышеописанное ограничение в 2.15 Gb на один раздел.
Решение проблемы - установка Windows95B (OSR2), которая позволяла использовать FAT32. У FAT32 максимальный раздел:
FAT32max = 232 x 32 кБ = 17042430230528 = 17042 Gb (15872 ГБ)
4.23 Gb, год 1997-й
Не всем известное ограничение. Оно вытекает из способов решения "проблемы 528 Mb". Так вот, чтоб преодолеть барьер 528 Mb, BIOS'ы могли использовать один из двух способов: "LBA Assist Translation" и "Bit Shift Translation (так называемый "Large" режим трансляции).
Метод LBA-трансляции при наличии в системе LBA-винчестера для совместимости со старым ПО (int 13h) высчитывал значение CHS по следующему алгоритму. Число секторов принималось равным 63. Число головок выбиралось исходя из объема диска (от 16 до 255). Число цилиндров вычислялось как частное от деления общего числа секторов на количество головок и секторов, то есть объема "виртуального" цилиндра.
Однако до появления LBA-трансляции на рынке было много винчестеров с ёмкостью больше 528 Mb. Для работы с такими винчестерами использовался следующий пересчет цилиндров. Выбирался коэффициент, кратный степени двойки (2, 4, 8 и т.д.). На него делилось реальное число цилиндров и умножалось число головок. В результате BIOS'ы, использующие такую трансляцию для винчестеров емкостью более 4.23 Gb, использовали в качестве коэффициента числа 16, 32, 64 и т.д. При умножении количества головок на коэффициент получалось число, большее или равное 256. Однако старое ПО (DOS, Windows95) "понимали" только значения 0-255, поэтому 256 головок воспринималось как 0.
Решение проблемы - обновление BIOS.
8.46 Gb, год 1998-й
Вышеописанное ограничение Int 13h. Правда, конфигурации с 256-ю головками не встречались, потому реальное ограничение:
HDDmax (Int13h/DOS) = 1024 x 255 x 63 x 512 = 8422686720 = 8.42 Gb (7.84 ГБ)
Решение - обновление BIOS.
33.8Gb, год 1999-й, лето
Самая актуальная нынче проблема. После исправления в BIOS'е "проблемы Int 13h", ограничивающей объем диска восемью гигабайтами, схема адресации стала аналогичной внутреннему формату ATA-интерфейса:
- С - два байта (16 бит), максимум 216 = 65536;
- H - один байт (4 бит), максимум 24 = 16;
- S - один байт (8 бит), максимум 28 = 255;
- или в режиме LBA - 16+4+8=28 бит.
То есть теоретически можно было работать с самыми большими дисками объемом до 137.4 Gb. Однако опять биосописатели ошиблись. Они не учли, что при пересчёте цилиндров по старой схеме им просто "не хватит" даже 16 разрядов на цилиндры. Для решения проблемы нужно было заменить все инструкции 16-битного деления на 32-битные и добавить условие: если LBA-значение количества секторов диска превышает 65536 x 16 x 63 = 66060288, то количество секторов приравнивается к 255. Это и было сделано в версиях Award BIOS после июня 1999 года.
Остановимся на решении этой проблемы подробнее. Итак, главное и самое простое решение проблемы - обновить BIOS. Однако для подавляющего большинства Socket7-плат (кроме "последних" на чипсетах VIA MVP3/MVP4, ALI V, SiS 530/540) производители не выложили новых версий BIOS с поддержкой "больших" винчестеров. Поэтому если вы - счастливый обладатель какой-нибудь i430VX/TX или VIA VPX, не мучайтесь с поисками в интернете "нового" BIOS'а для вашего не определяющегося свежекупленного винчестера. Ведь даже самый признанный "биосописатель", ASUS, не выложил новых версий для своей линейки плат на чипсете i430TX. Исправить, как вы уже видели, нужно было совсем немного, поэтому причина "забывчивости" всех производителей одна - маркетинг: мол, покупайте наши новые платы, там все без проблем.
Вот что можно посоветовать, если вы уже купили такой "большой" диск:
- На некоторых винчестерах есть перемычки для конфигурирования винчестера на 33.8 Gb. Вы получите полностью работоспособную систему, но, к сожалению, с меньшим объёмом.
- Windows (98 и выше) применяет свои подпрограммы для определения винчестера, у которых нет проблем для работы с винчестерами больше 33.8 Gb. Поэтому если вы хотите использовать "большой" диск просто в качестве "второго" (т.е. будете грузиться не с него, а с другого, меньшего, чем 33.8 Gb), то можно просто выключить в BIOS'е автоопределение "большого" винчестера (т.е. поставить Disabled). Тогда компьютер не повиснет в BIOS, а Windows при загрузке сама определит "невидимый BIOS'у" диск, и можно будет совершенно корректно использовать весь его объём. Однако, во-первых, вы не сможете пользоваться "большим" диском из-под DOS (его разделы будут просто там отсутствовать), а во-вторых, очень вероятно, что скорость работы с таким "невидимым в BIOS" диском будет существенно более низкой из-за "неинициализации" его контроллера (т.е. он может работать только по протоколу PIO-4, скорость которого ограничена 16 Мб/с).
- В некоторых редких BIOS'ах "проблему 32 ГБ" удаётся обойти установкой параметров "большого" диска вручную (как для старых винчестеров).
- Ну и, наконец, старые, знакомые и такие неудобные disc managers.
От себя лично, правда, могу добавить, что на моём сайте www.ROM.by я постепенно выкладываю "коллекцию" BIOS под старые платы с поддержкой "больших" винчестеров. Например, если у вас плата Asus или Acorp, можете смело заходить - там есть все их модели под Socket7-Pentium-II. Вскоре собираюсь выложить исправленные BIOS'ы под все самые распространённые в наших широтах платы (Socket7 и первые P-II) - от MSI и Gigabyte до "Акорпа" и "Зиды".
65 Gb, год 2000-й, зима
В некоторых BIOS'ах была (да и есть) ошибка с определением винчестеров больших, чем 65 Gb.
Решение - обновление BIOS.
137.4 Gb, год 2002-й
Современные диски достигли предела стандарта ATA. Для его преодоления уже нужно будет менять сам интерфейс. Что, например, и сделала та же Maxtor: разработанная этой фирмой технология BigDrive была предложена одновременно со спецификацией протокола UltraDMA/133. Она предполагает применение не 28-, а 48-битной адресации секторов.
Решение проблемы аналогично предыдущим - замена BIOS. Правда, для подавляющего большинства все же это совсем не проблема. Пока.
Роман СЕВКО,
www.ROM.by
* — здесь и дальше примем в качестве обозначения:
кБ = 210 = 1024 байт
МБ = 1024 Кб = 1024x1024 байт = 1048576 байт
ГБ = 1024 Мб = 1024x1024x1024 байт = 1073741824 байт
Mb = 1000000 байт, 1Мб = 1.05 Mb
Gb = 1000000000 байт, 1Гб = 1.07 Gb
Горячие темы