Проблема "больших" винчестеров на старых платах (2002 г.)
Ограничения BIOS, IDE и ОС на объём винчестеров.
Проблема "больших" винчестеров на старых платах.
В далёкие 80-е года прошлого тысячелетия;), во времена уже, наверное, мало кому известного MFM и RLL, для доступа к винчестеру надо было знать (и указывать) его "геометрию". Под "геометрией" понимается "физическое" количество цилиндров (дорожек) ("C" - от Cylinders), головок ("H" - от Heads), и секторов на дорожку ("S" - от Sectors). Т.е. любой блок информации на винчестере характеризовался тремя переменными: C, H и S (отсюда -CHS-адресация). И надо отметить, что эти величины всегда были "реальными".
Все современные же винчестеры имеют принципиально другую плотность информацию и, например, даже такая, на первый взгляд, "логичная" величина как S - количество секторов на дорожку, даже близко не соответствует указанному на этикетке винчестера (и при детекте в BIOS) значению. В реальности количество секторов на дорожку - величина переменная и уменьшается по мере приближения к последней (крайней) внутренней дорожке. Поэтому для преодоления этой неоднозначности контроллер винчестера "сообщает" BIOS-у не реальные значения, а "удобоваримые" для него параметры, переводя уже поступившие от него "координаты" в "реальные".
Например, винчестер может содержать две пластины и, соответственно, четыре головки, а контроллер "скажет" биосу о 16-ти имеющихся головках. Мало того, биос, для "удобоваримости" уже операционной системы, может яростно "утверждать", что на винчестере вовсе не 16, а целых 255 головок. В свою очередь ОС к проблемам всех этих "пересчётов" будет добавлять ещё и ограничения на объём раздела из-за использования конкретной файловой системы (например, FAT16). Именно из-за такой многогранности проблемы многие люди так часто спорят, путая и смешивая различные по происхождению проблемы. Попробуем прояснить все аспекты проблемы.
Чтобы разобраться с "ограничениями" нужно достаточно чётко представлять всю структуру работы с диском: от приложения до самих головок чтения/записи. Схематически процесс записи можно представить в следующем виде:
Приложение |
Операционная система (Int13h) |
BIOS |
Контроллер винчестера |
Cам диск (т.е. головки чтения/записи) |
Рассмотрим "форматы" каждого из этапов.
1. Винчестер "физически" состоит из одной или нескольких пластин, покрытых магнитным слоем. С обеих сторон пластины (иногда - только с одной) располагаются головки чтения/записи информации. Информация записывается на "дорожки", которые в случае нескольких головок образуют цилиндр. Дорожка разбита на секторы, каждый из которых и представляет тот минимум блок информации, которую можно записать на диск. Стандартный размер сектора - 512 байт.
Как уже говорилось, самые первые винчестеры имели постоянное количество секторов на дорожку на всём диске. Однако это не позволяло эффективно использовать всю поверхность диска - каждая следующая внешняя дорожка длинней внутренней, соответственно, на ней может поместиться больше информации. Поэтому современные винчестеры разбиты на "зоны", т.е. совокупности соседних дорожек с одинаковым количеством секторов на дорожку. Именно поэтому график линейного чтения винчестера (исправного) выглядит в виде нисходящих ступенек.
2. Контроллер винчестера управляет работой головок чтения/записи. Он переводит команды "интерфейса" в электрические сигналы на головках. Интерфейсы бывают разные: "доисторические" MFM и RLL, современные IDE (ATA) и SCSI, "будущие" SerialATA. Нас, естественно, интересует IDE-винчестеры, потому и рассмотрим интерфейс ATA.
Как уже, опять же, говорилось - "исторически" сложилось использование CHS-адресации. При этом в случае ATA:
- для "С" выделено два байта (16 бит)
- для "S" - один байт минус 1 сектор (8 бит - 1)
- для "H" - полбайта (4 бита)
Итого, максимальный винчестер для CHS-адресации:
2^16x(2^8-1)x2^4 = 65536x255x16 = 267 386 880 секторов. В секторе 512 байт, значит:
HDDmax(CHS) = 65536x255x16*512 = 136 902 082 560байт= 136.9Gb (127,5ГБ)*
* - здесь и дальше примем в качестве обозначения:
"кБ" = 2^10 = 1024 byte
"МБ" = 1024 кБ = 1024*1024 byte = 1 048 576 byte
"ГБ" = 1024 МБ = 1024*1024*1024 byte = 1 073 741 824 byte
"Mb" = 1 000 000 byte, 1МБ = 1.05Mb
"Gb" = 1 000 000 000 byte, 1ГБ = 1.07Gb
Все современные винчестеры используют LBA-адресацию. В этом случае номер каждого сектора представляет собой 28-битное число и максимальным диском для LBA будет:
HDDmax(LBA) = 2^28*512 = 137 438 953 472байт= 137.4Gb (128ГБ)
3. BIOS по вышеописанной "иерархии" находится между ОС и контроллером винчестера. В его функцию входит перевод команд запроса на работу с диском от ОС в команды контроллера винчестера.
Большинство программного обеспечения использует CHS-адресацию. Поэтому с появлением "LBA-винчестеров", чтоб не переписывать имеющееся ПО, поступили следующим образом. Биос в случае определения LBA-винчестера, переводит его параметры в CHS-версию и ОС "думает", что работает с CHS-винчестером. Т.е. 28-битное значение LBA "раскладывается" следующим образом - "цилиндрические" 16 бит + "секторные" 8 бит + "головчатые" 4 бита (итого 16+8+4=28). Или конкретно:
- биты 0-7 - сектор (+1шт., т.к. адресация CHS начинается с 1-го, а не 0-го сектора)
- биты 8-15 - цилиндр, младший байт
- биты 16-23 - цилиндр, старший байт
- биты 24-27 - головка
При получении запроса на работу с диском, биос переводит для контроллера это значение обратно в 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) = 1024x256x63*512 = 8 455 716 864 = 8.46Gb (7,88ГБ)
Или для LBA-адресации это получается 24-битное (3 байта) число:
HDDmax(DOS-LBA) = 2^24*512 = 8 589 934 592 = 8.59Gb (8ГБ)
5. Приложения используют определённую файловую систему, которая также имеет свои ограничения. Например, в случае FAT16 объём раздела зависит от величины кластера и по максимуму может быть 2^16 кластеров. Кластер - это совокупность секторов и его стандартное максимальное значение - 64 сектора ("нестандартные" 128 и больше позволяют делать лишь linux-образные утилиты), т.е. 32кБ. Т.е. максимальный раздел для FAT16:
FAT16max = 2^16*32кБ = 2 147 483 648 = 2.15Gb (2ГБ)
Теперь, зная все эти моменты, попробуем восстановить хронологию возникновения проблем "больших" дисков.
134Mb, год 1990-й.
Самая старая и, наверное, уже мало кому известная проблема касается времён 100Mb (не Gb!) винчестеров и больше. Использовалась тогда FAT12, для которой максимальным был раздел:
FAT12max = 2^12*32кБ = 134 217 728 = 134Mb (128МБ)
Способ решения простой - переход на FAT16 (для этого-то он и создавался).
528Mb, год 1993-й.
Самая первая, самая известная и самая серьёзная проблема, затронувшая CHS.
Дело в том, что все первые биосописатели не рассчитывали, что когда-то в их детища кто-нибудь попытается засунуть такие "гигантские" винты. Проблема была из-за того, что Int13h и IDE имели следующие ограничения на значение CHS:
Int13h: C/H/S = 1024/256/63
IDE: C/H/S = 65536/16/255
Соответственно, максимальным вариантом, удовлетворяющем оба случая было 1024/16/63, а значит наибольший установленный винчестер мог быть:
HDDmax(oldBIOS) = 1024x16x63*512 = 528 482 304 = 528Mb (504МБ)
Решение проблемы имело три пути. Первый - это форматирование "слишком большого" винчестера с помощью встроенной в биос утилиты на 528Mb. Такой способ был достаточно "распространённым" в своё время (из-за неопытности пользователей;).
Второй - использование специального ПО - disk managers (типа OnTrack, EZ-Drive и др.), заменяющие подпрограммы BIOS для работы с дисками своими собственными. Как правило, для работы такие программы модифицировали MBR диска. Однако это не позволяло корректно работать с диском при загрузке с другого винчестера (или даже дискеты), а также возникали большие проблемы с установкой нескольких ОС на такой диск.
Ну, и третий - обновление биос. Однако флэш-память для микросхем биоса не была тогда распространена, да и интернет не был развит, соответственно и прошивок никто не делал и не выкладывал. Поэтому из-за практической малоэффективности всех этих способов, плату нужно (было) просто заменить на "поддерживающую LBA".
2.11Gb, год 1996-й.
Многие биосописатели не учли предыдущего опыта и добавили в биосе всего 2 бита на цилиндры. Итого получалось:
HDDmax(1996) = 2^12x16x63*512 = 2 113 929 216 = 2.11Gb (1.97ГБ)
При чём некоторые версии определяли только "часть" винчестера (например, 2.5Gb определялся как 425Mb), а некоторые просто зависали при автоопределении винчестера из-за неправильного перерасчёта головок.
Решение проблемы - обновление биос (либо использование disk managers).
2.15Gb, год 1996-й.
Только появившаяся Windows95 ("A", не OSR) использовала DOS-овские FAT16 и потому наследовала все его проблемы - вышеописанное ограничение в 2.15Gb на один раздел.
Решение проблемы - установка Windows95B (OSR2), которая позволяла использовать FAT32. У FAT32 максимальный раздел:
FAT32max = 2^32*32кБ = 17 042 430 230 528 = 17042Gb (15872ГБ)
3.28Gb, год 1996-1997-й.
В старых версиях Phoenix BIOS (v. 4.03 и 4.04) была ошибка с определением винчестеров более 3.277Mb.
Решение проблемы - обновление до версии 4.05 и позже.
4.23Gb, год 1997-й.
Не всем известное ограничение, оно вытекает из способов решения"проблемы 528Mb". Так вот, чтоб преодолеть барьер 528Mb биосы могли использовать один из двух способов:"LBA assist translation" и "Bit shift translation ("Large" Mode)".
Метод "LBA-трансляции" при наличии в системе LBA-винчестера для совместимости со старым ПО (Int 13h) высчитывал значение CHS по следующему алгоритму:
Общее число секторов на диске, S_lba | "Пересчитанное" число цилиндров, C | H | S | Максимальная ёмкость |
1 - 1 032 192 | S_lba / (63*16) | 16 | 63 | 528Mb |
1 032 192 - 2 064 384 | S_lba / (63*32) | 32 | 63 | 1.06Gb |
2 064 384 - 4 128 768 | S_lba / (63*64) | 64 | 63 | 2.11Gb |
4 128 768 - 8 257 536 | S_lba / (63*128) | 128 | 63 | 4.23Gb |
8 257 536 - 16 450 560 | S_lba / (63*255) | 255 | 63 | 8.42Gb |
Однако до появления LBA-винчестеров появилось много не поддерживающих LBA винчестеров ёмкостью больше 528Mb. Для работы с такими винчестерами использовался следующий пересчёт цилиндров:
Число цилиндров на диске, c | Число головок, h | Преобразован- ное число цилиндров, C | Преобразован-ное число головок, H | Максималь-ная ёмкость |
1 - 1 024 | 1-16 | C=c | H=h | 528Mb |
1 024 - 2 048 | 1-16 | C=c/2 | H=h*2 | 1.06Gb |
2 048 - 4 096 | 1-16 | C=c/4 | H=h*4 | 2.11Gb |
4 096 - 8 192 | 1-16 | C=c/8 | H=h*8 | 4.23Gb |
8 192 - 16 384 | 1-16 | C=c/16 | H=h*16 | 8.47Gb |
16 384 - 32 768 | 1-8 | C=c/32 | H=h*32 | 8.47Gb |
32 768 - 65 536 | 1-4 | C=c/64 | H=h*64 | 8.47Gb |
В результате биосы, использующие такую трансляцию для винчестеров 4.23Gb (и больше) и имеющие 16 головок "переводили" их количество в 256. Однако старое ПО (DOS, Windows95) "понимали" только значения 0-255 и 256 головок воспринималось как 0.
Решение проблемы - обновление биос.
7.93Gb, год 1997-1998-й.
В тех же "некоторых" биосах (что и в предыдущем случае), только более продвинутых, описанная выше проблема обходилась приравниванием числа головок к 15. В результате получалось не 256, а 240 дорожек и максимальный диск:
HDDmax(Large-15) = 1024x240x63*512 = 7 927 234 560 = 7.93Gb (7.38ГБ)
Решение проблемы - обновление биос.
8.46Gb, год 1998-й.
Вышеописанное ограничение Int 13h. Правда, конфигурации с 256-ю головками не встречались, потому реальное ограничение:
HDDmax(Int13h/DOS) = 1024x255x63*512 = 8 422 686 720 = 8.42Gb (7.84ГБ)
Решение - обновление биос.
33.8Gb, год 1999-й, лето.
Самая актуальная проблема. После исправления в биосе "проблемы Int 13h", ограничивающей диски до 8.4Gb, схема адресации стала аналогичной ATA-интерфейсу:
- С - два байта (16 бит), максимум - 2^16 = 65536
- H - один байт (4 бит), максимум - 2^4 = 16
- S - один байт (8 бит), максимум - 2^8 = 255
- или в режиме LBA - 16+4+8=28 бит
Т.е. теоретически можно было работать с самыми большими дисками 137.4Gb. Однако опять биосописатели ошиблись. Они не учли, что при пересчёте цилиндров по старой схеме им просто "не хватит" даже 16bit на цилиндры. Например, диск на 41.2Gb с конфигурацией 19710/16/255, получал от винчестера LBA-значение количества секторов 80 416 800 шт. и при пересчёте по "стандартному" алгоритму с 16-ю головками и 63-мя секторами получалось:
80416800 / (16*63) = 79778 цилиндра.
79778 > 65536 (2^16) и поэтому не помещалось в 16 бит.
Соответственно использующийся алгоритм с 16-битным делением просто зависал из-за ошибки переполнения. Для решения проблемы нужно было заменить все инструкции 16-битного деления на 32-битные и добавить условие: если LBA-значение количества секторов диска превышает:
HDDmax(32ГБ) = 65536x16x63 = 66 060 288 секторов = 33.8Gb (31.5ГБ),
то количество секторов приравнивается к 255. Это и было сделано в версиях Award BIOS в версиях после июня 1999-года.
Остановимся на решении этой проблемы подробнее, т.к. она всё ещё популярна из-за большого количества обладателей "старых" плат Socket7 (и первых Pentium2), желающих увеличить объём своего диска без "глобального" апгрейда всего компьютера. Просто цены на винчестеры 40-60Gb сейчас так упали, что диски меньшего объёма покупать совершенно невыгодно (и часто даже не из-за копеечной разницы по сравнению с 10-20Gb винчестерами, а просто из-за отсутствия моделей с меньшей ёмкостью).
Итак, главное и самое простое решение проблемы - обновить биос. Однако для подавляющего большинства Socket7-плат (все кроме "последних" - на VIA MVP3/MVP4, ALI V, SiS 530/540) производители не выложили новых версий биос с поддержкой "больших" винчестеров. Поэтому если вы счастливый обладатель какой-нибудь i430VX/TX или VIA VPX не мучайтесь с поисками в интернете "нового" биоса для вашего неопределяющегося свежекупленного винчестера. Ведь даже самый признанный "биосописатель" Asus не выложил новых версий для своей линейки плат на i430TX чипсете. Исправить, как вы видели, нужно было совсем немного, поэтому причина "забывчивости" всех производителей поголовно выложить новые версии под свои старые платы одна - маркетинг, мол, покупайте наши новые платы, там всё без проблем.
Что можно посоветовать, если вы уже купили такой "большой" диск.
1. На некоторых винчестерах есть перемычки для конфигурирования винчестера на 33.8Gb. Получите совершенно работоспособную систему, но, к сожалению, с меньшим объёмом.
2. Windows (98 и выше) применяет свои подпрограммы для определения винчестера, в которых нет проблем для работы с винчестерами больше 33.8Gb. Поэтому если вы хотите использовать "большой" диск просто в качестве "второго" (т.е. будете грузиться не с него, а с другого, меньшего, чем 33.8Gb), то можно просто выключить в биосе автоопределение "большого" винчестера (т.е. поставить Disabled). Тогда компьютер не повиснет в биосе, а Windows при загрузке сама вполне корректно определит "невидимый биосу" диск и можно будет совершенно корректно использовать весь его объём. Однако, во-первых, вы не сможете пользоваться "большим" диском из-под DOS (его разделы будут просто там отсутствовать), а во-вторых, многовероятно, что скорость работы с таким "невидимым в биос" диском будет существенно более низкая из-за "неинициализации" его UDMA-протокола (т.е. он может работать по протоколу PIO4-10Mb/s и даже ниже).
3. В некоторых редких биосах "проблему 32ГБ" удаётся обойти установкой параметров "большого" диска вручную (как для старых винчестеров).
4. Ну, и, наконец, старые, знакомые (и такие неудобные) - disc managers.
От себя лично, правда, могу добавить, что на моём сайтеwww.ROM.by можно найти "коллекцию" биосов под многие старые платы с поддержкой "больших" винчестеров, а если вашего биоса в коллекции не окажется, то всегда можно будет воспользоваться специальной программой BIOS Patcher, которая добавит вашему биосу корректную поддержку винчестеров вплоть до 120Gb.
65.5Gb, год 2000-й, зима.
Не все биосописатели подошли добросовестно к "проблеме 32Gb" и в результате была исправлена лишь одна ошибка, связанная с переполнением при 16-битном делении.
Дело в том, что для вывода на экран объёма винчестера использовался 16-битный регистр, объём выводился в мегабайтах, итого максимальный диск мог быть:
HDDmax(64ГБ) = 2^16 - 1 = 65535Mb = 65.5Gb (64ГБ),
В данном случае компьютер зависал сразу же после детекта винчестера и никаким способом это обойти было нельзя (кроме как выключения его в BIOS Setup). Позже для исправления этой проблемы было сделано следующее условие: до 64Гб - выводить ёмкость в мегабайтах, выше - в гигабайтах.
Решение - обновление биос.
137.4Gb, год 2002-й.
Современные диски достигли предела стандарта ATA. Для его преодоления уже нужно будет менять сам "интерфейс". Что, например, и предложил тот же Maxtor в своей спецификации на UDMA133.
Решение проблемы - обновление биоса, но для подавляющего большинства, всё ж, это совсем не проблема. Пока. ;)
www.ROM.by, Севко Роман