Rambler's Top100

Реклама на сайте | Реклама в Интернет | "Все Кулички"


Главная страница
Все о компьютерном "железе"
Вся полезная информация
Эрудиту
Гарантированная продажа рекламных мест
Цены магазинов Москвы на ноутбуки и мобильные компьютеры
Мои разработки и переводы
Микроконтроллеры >>
Мои разработки
Полезные конструкции
Программаторы
FAQ по ПИКам
"Глюки" ПИКов
Ссылки
Железо и драйвера >>
Статьи и FAQ
Ссылки на статьи
Определение конфигурации
Настройка компонентов ПК
Утилиты для накопителей информации
Ремонт "железа"
Восстановление информации
Полезный софт
Операционные системы
Безопасность и защита информации
Радиоэлектроника
Программирование >>
Техдокументация
Разработчику программ
Мобильники
Вебмастеру
Поиск информации
On-Line перевод
Обмен ссылками, сотрудничество
Немного о себе
Контакты
Гостевая книга
Форум

Поиск на сайте
Поиск на Куличках:

Сделать стартовой страницей

Реклама:

(!) MP3 плееры всех видов. Возьми с собой 6 обычных Audio-CD на одном(!!!) MP3-CD
Телевизоры, DVD-плееры, видеомагнитофоны, видео-плееры. Аппаратура Hi-End класса


rax.ru: показано число посетителей за сегодня

Рейтинг@Mail.ru

RadioTOP-рейтинг радиотехнических сайтов
PROext: Top 1000
ENGLISH version
Добрый вечер! Вторник, 23 апреля 2024
ОГРАНИЧЕНИЯ BIOS, IDE И ОС НА ОБЪЁМ ВИНЧЕСТЕРОВ
Источник: ROM.BY
Публикуется с разрешения администратора
В далёкие 80-е года прошлого тысячелетия, во времена уже, наверное, мало кому известного MFM и RLL, для доступа к винчестеру программам необходимо было знать и указывать его "геометрию". Под "геометрией" понимается физическое количество цилиндров (дорожек), головок и секторов на дорожку. То есть любой блок информации на стандартном ATA-винчестере характеризуется тремя переменными - C, H и S (Cylinders, Heads, Sectors), а метод доступа на адресации CHS-адресация). Необходимо отметить, что эти величины всегда были реальными.

Но все современные винчестеры имеют гораздо более высокую плотность информации. Кроме того, их реальная геометрия варьируется от модели к модели. Поэтому даже такая, на первый взгляд, "логичная" величина, как S (количество секторов на дорожку) даже близко не соответствует указанному на этикетке винчестера (и при детекте в BIOS) значению. В реальности количество секторов на дорожку - величина переменная и уменьшается по мере приближения к последней внутренней дорожке. Поэтому для преодоления этой неоднозначности контроллер винчестера "сообщает" BIOS'у не реальные значения, а "удобоваримые" для него параметры. А при получении запроса на чтение или запись переводит поступившие от системы "координаты" в реальные. Например, винчестер может содержать две пластины и, соответственно, четыре головки, а контроллер "скажет" BIOS'у о 16-ти имеющихся головках. Мало того, BIOS для "удобоваримости" параметров уже для операционной системы, может яростно "утверждать", что на винчестере вовсе не 16, а целых 255 головок. В свою очередь ОС к проблемам всех этих "пересчётов" будет добавлять ещё и ограничения на объём раздела из-за использования конкретной файловой системы (например, FAT16). Именно из-за такой многогранности проблемы многие люди так часто спорят, путая и смешивая различные по происхождению проблемы. Попробуем прояснить все ее аспекты.

Как система работает с диском

Чтобы разобраться с "ограничениями", нужно достаточно чётко представлять всю структуру работы с диском: от приложения до самих головок чтения/записи. Схематически процесс взаимодействия можно представить в следующем виде:

Схема работы дисковой подсистемы

Рассмотрим "форматы" каждого из этапов.

  1. Винчестер "физически" состоит из одной или нескольких пластин, покрытых магнитным слоем. С обеих сторон пластины (иногда - только с одной) располагаются головки чтения/записи информации. Информация записывается на "дорожки", которые в случае нескольких головок образуют цилиндр. Дорожка разбита на секторы, каждый из которых и представляет тот минимум блок информации, которую можно записать на диск. Стандартный размер сектора - 512 байт. Как уже говорилось, самые первые винчестеры имели постоянное количество секторов на дорожку на всём диске. Однако это не позволяло эффективно использовать всю поверхность диска - каждая следующая внешняя дорожка длинней внутренней, соответственно, на ней может поместиться больше информации. Поэтому современные винчестеры разбиты на "зоны", то есть совокупности соседних дорожек с одинаковым количеством секторов на дорожку. Именно поэтому график линейного чтения винчестера (исправного) выглядит в виде нисходящих ступенек.
  2. Контроллер винчестера управляет работой головок чтения/записи. Он переводит команды "интерфейса" в электрические сигналы на головках. Интерфейсы бывают разные: "доисторические" ST506 и ESDI, современные ATA (IDE) и SCSI, "будущие" Serial ATA и Serial SCSI. Нас, естественно, интересует IDE-винчестеры, потому и рассмотрим интерфейс ATA.

  3. Как уже говорилось, исторически первой появилась CHS-адресация. В этом в случае:

    • для "С" выделено два байта (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 байт
    МБ = 1024 кБ = 1024*1024 байт = 1 048 576 байт
    ГБ = 1024 МБ = 1024*1024*1024 байт = 1 073 741 824 байт
    Mb = 1 000 000 байт, 1МБ = 1.05Mb
    Gb = 1 000 000 000 байт, 1ГБ = 1.07Gb
    Все современные винчестеры используют LBA-адресацию. В этом случае номер каждого сектора представляет собой 28-битное число, и максимальным диском для LBA будет:
    HDDmax(LBA) = 2^28*512 = 137 438 953 472 байт = 137.4Gb (128ГБ)
  4. BIOS по вышеописанной "иерархии" находится между ОС и контроллером винчестера. В его функцию входит перевод команд запроса на работу с диском от ОС в команды контроллера винчестера.

  5. Большинство программного обеспечения использует 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)
  6. В далёкие, ещё DOS'овские времена, разработчики не подозревали, что когда-то ёмкость винчестеров будет измеряться десятками и даже сотнями гигабайт. Ведь самый богатый в мире человек (и самый проклинаемый компьютерной братией в одном лице) тоже как-то рассуждал "о бесконечности" 640кБ оперативной памяти. В результате для адресации CHS в DOS (int 13h) была выбрана следующая "трёхбайтовая" система:
    1.  
    2. один байт - для младших битов значения цилиндров (0-7 биты);
    3. один байт - для двух старших бит значения цилиндров (8-9 биты) и шесть битов значения сектора;
    4. один байт - для значения головок.
    Итого получалось, что "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ГБ)

  7. Приложения используют определённую файловую систему, которая также имеет свои ограничения. Например, в случае с FAT16 объём раздела зависит от величины кластера, и максимальное количество кластеров ограничено числом 2^16. Кластер - это совокупность секторов, и его максимальный объем - 64 сектора ("нестандартные" 128 и больше позволяют делать лишь linux-образные утилиты), т.е. 32кБ. Максимальный раздел для FAT16 получается таким:

  8. FAT16max = 2^16*32кБ = 2 147 483 648 = 2.15Gb (2ГБ)

Барьеры емкости

Теперь, зная все моменты, попробуем восстановить хронологию возникновения проблем "больших" дисков.

134 Mb, год 1990-й.

Самая старая и, наверное, уже мало кому известная проблема касается времён 100Mb (не Gb!) винчестеров. Использовалась тогда FAT12, для которой максимальным был раздел:
FAT12max = 2^12*32кБ = 134 217 728 = 134Mb (128МБ)

Способ решения простой - переход на FAT16 (для этого-то он и создавался).

528 Mb, год 1993-й.

Самая первая, самая известная и самая серьёзная проблема, затронувшая CHS.

Дело в том, что все первые биосописатели не рассчитывали, что когда-то в их детища кто-нибудь попытается засунуть такие гигантские винты. Проблема была из-за того, что в BIOS'е для CHS было выделено:

  • для С - 10 бит, итого 2^10 = 1024 максимум;
  • для H - 4 бит, итого 2^4 = 16 максимум;
  • для S - 6 бит, итого 2^6 - 1 = 63 максимум.
При таком подходе максимальный установленный винчестер мог быть:
HDDmax(oldBIOS) = 1024x16x63*512 = 528 482 304 = 528Mb (504МБ)

"Почему так мало выделялось", спросите вы? Всё просто: 10 + 4 + 6 и ещё 4 управляющих бита позволяли "вписаться" в три байта (24 бита). В то время с памятью была "напряженка", вот и экономили на каждом бите;)

Решение проблемы имело три пути. Первый - это форматирование "слишком большого" винчестера с помощью встроенной в BIOS утилиты на 528Mb. Такой способ был достаточно распространённым в своё время (из-за неопытности пользователей;). Второй - использование специального ПО - Disk Managers (типа OnTrack, EZ-Drive и др.), заменяющего подпрограммы BIOS для работы с дисками своими собственными. Как правило, для работы такие программы модифицировали MBR диска. Однако это не позволяло корректно работать с диском при загрузке с другого винчестера (или даже дискеты), а также возникали большие проблемы с установкой нескольких ОС на такой диск.

Ну, и третий - обновление BIOS. Однако флэш-память для микросхем BIOS не была тогда распространена, да и интернет не был развит, соответственно и прошивок никто не делал и не выкладывал. Поэтому из-за малой практической эффективности всех этих способов, плату нужно было просто заменить на "поддерживающую LBA".

2.11 Gb, год 1996-й.

Многие описатели не учли предыдущего опыта и добавили в BIOS всего 2 бита на цилиндры. Итого получалось: HDDmax(1996) = 2^12x16x63*512 = 2 113 929 216 = 2.11Gb (1.97ГБ)

Причём некоторые версии определяли только "часть" винчестера (например, 2.5Gb определялся как 425Mb), а некоторые просто зависали при автоопределении винчестера из-за неправильного перерасчёта головок.

Решение проблемы - обновление BIOS (либо использование disk managers).

2.15 Gb, год 1996-й.

Только появившаяся Windows95 (версия "A", не OSR) использовала DOS-овские FAT16 и потому наследовала все его проблемы - вышеописанное ограничение в 2.15 Gb на один раздел.

Решение проблемы - установка Windows95B (OSR2), которая позволяла использовать FAT32. У FAT32 максимальный раздел: FAT32max = 2^32*32кБ = 17 042 430 230 528 = 17042Gb (15872ГБ)

3.28 Gb, год 1996-1997-й.

В старых версиях Phoenix BIOS (v. 4.03 и 4.04) была ошибка с определением винчестеров более 3.277Mb.

Решение проблемы - обновление до версии 4.05 и позже

4.23 Gb, год 1997-й.

Не всем известное ограничение. Оно вытекает из способов решения "проблемы 528 Mb". Так вот, чтоб преодолеть барьер 528Mb, BIOS'ы могли использовать один из двух способов: "LBA Assist Translation" и "Bit Shift Translation (так называемый "Large" режим трансляции).

Метод LBA-трансляции при наличии в системе LBA-винчестера для совместимости со старым ПО (int 13h) высчитывал значение CHS по следующему алгоритму:
Общее число секторов на диске, S_lba С 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-трансляции на рынке было много винчестеров с ёмкостью больше 528 Mb. Для работы с такими винчестерами использовался следующий пересчёт цилиндров:
Число цилиндров на диске, С Число головок, 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

В результате BIOS'ы, использующие такую трансляцию для винчестеров 4.23 Gb и больше с 16-ю головками, "переводили" количество последних в 256. Однако старое ПО (DOS, Windows95) "понимали" только значения 0-255, и 256 головок воспринималось как 0.

Решение проблемы - обновление BIOS.

7.93 Gb, год 1997-1998-й.

В тех же "некоторых" BIOS'ах, только более продвинутых, описанная выше проблема обходилась приравниванием числа головок к 15. В результате получалось не 256, а 240 дорожек и максимальный диск: HDDmax(Large-15) = 1024x240x63*512 = 7 927 234 560 = 7.93Gb (7.38ГБ)

Решение проблемы - обновление BIOS.

8.46 Gb, год 1998-й.

Вышеописанное ограничение Int 13h. Правда, конфигурации с 256-ю головками не встречались, потому реальное ограничение: HDDmax(Int13h/DOS) = 1024x255x63*512 = 8 422 686 720 = 8.42Gb (7.84ГБ)

Решение - обновление BIOS.

33.8Gb, год 1999-й, лето.

Самая актуальная нынче проблема. После исправления в BIOS'е "проблемы Int 13h", ограничивающей объем диска восемью гигабайтами, схема адресации стала аналогичной внутреннему формату ATA-интерфейса:
  • С - два байта (16 бит), максимум 2^16 = 65536;
  • H - один байт (4 бит), максимум 2^4 = 16;
  • S - один байт (8 бит), максимум 2^8 = 255;
  • или в режиме LBA - 16+4+8=28 бит.
То есть теоретически можно было работать с самыми большими дисками объемом до 137.4 Gb. Однако опять биосописатели ошиблись. Они не учли, что при пересчёте цилиндров по старой схеме им просто "не хватит" даже 16 разрядов на цилиндры. Например, диск на 41.2 Gb с конфигурацией 19710/16/255, получал от винчестера LBA-значение количества секторов 80 416 800, то при пересчёте по стандартному алгоритму с 16-ю головками и 63-мя секторами получалось: 80416800 / (16*63) = 79778 цилиндра. 79778 > 65536 (2^16), число не помещается целиком в 16 бит, использующийся алгоритм с 16-битным делением просто зависает из-за ошибки переполнения. Для решения проблемы нужно было заменить все инструкции 16-битного деления на 32-битные и добавить условие: если LBA-значение количества секторов диска превышает 65536x16x63 = 66 060 288, то количество секторов приравнивается к 255. Это и было сделано в версиях Award BIOS после июня 1999-года.

Остановимся на решении этой проблемы подробнее, так как она всё ещё актуальна из-за большого количества обладателей "старых" плат Socket7 (и первых Pentium-II), желающих увеличить объём своего диска без "глобального" апгрейда всего компьютера. Просто цены на винчестеры 40-60 Gb сейчас так упали, что диски меньшего объёма покупать совершенно невыгодно (и часто даже не из-за копеечной разницы по сравнению с 10-20 Gb винчестерами, а просто из-за отсутствия моделей с меньшей ёмкостью).

Итак, главное и самое простое решение проблемы - обновить BIOS. Однако для подавляющего большинства Socket7-плат (кроме "последних" на чипсетах VIA MVP3/MVP4, ALI V, SiS 530/540) производители не выложили новых версий BIOS с поддержкой "больших" винчестеров. Поэтому если вы счастливый обладатель какой-нибудь i430VX/TX или VIA VPX, не мучайтесь с поисками в интернете "нового" BIOS'а для вашего не определяющегося свежекупленного винчестера. Ведь даже самый признанный "биосописатель", ASUS, не выложил новых версий для своей линейки плат на чипсете i430TX. Исправить, как вы уже видели, нужно было совсем немного, поэтому причина "забывчивости" всех производителей одна - маркетинг: мол, покупайте наши новые платы, там всё без проблем.

Вот что можно посоветовать, если вы уже купили такой "большой" диск:

  1. На некоторых винчестерах есть перемычки для конфигурирования винчестера на 33.8 Gb. Вы получите полностью работоспособную систему, но, к сожалению, с меньшим объёмом.
  2. Windows (98 и выше) применяет свои подпрограммы для определения винчестера, у которых нет проблем для работы с винчестерами больше 33.8 Gb. Поэтому если вы хотите использовать "большой" диск просто в качестве "второго" (т.е. будете грузиться не с него, а с другого, меньшего, чем 33.8 Gb), то можно просто выключить в BIOS'е автоопределение "большого" винчестера (т.е. поставить Disabled). Тогда компьютер не повиснет в BIOS, а Windows при загрузке сама вполне корректно определит "невидимый BIOS'у" диск, и можно будет совершенно корректно использовать весь его объём. Однако, во-первых, вы не сможете пользоваться "большим" диском из-под DOS (его разделы будут просто там отсутствовать), а во-вторых, очень вероятно, что скорость работы с таким "невидимым в BIOS" диском будет существенно более низкой из-за "неинициализации" его контроллера (т.е. он может работать только по протоколу PIO-4, скорость которого ограничена 16 Мб/с).
  3. В некоторых редких BIOS'ах "проблему 32 ГБ" удаётся обойти установкой параметров "большого" диска вручную (как для старых винчестеров).
  4. Ну, и, наконец, старые, знакомые и такие неудобные disc managers.
От себя лично, правда, могу добавить, что на моём сайте www.ROM.by я постепенно выкладываю "коллекцию" BIOS под старые платы с поддержкой "больших" винчестеров. Например, если у вас плата Asus, можете смело заходить - там есть все их модели под Socket7 (и Socket8). Вскоре собираюсь выложить исправленные 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. Правда, для подавляющего большинства все же это совсем не проблема.


Наверх | К списку статей | На главную страницу


Полное или частичное воспроизведение любых материалов, содержащихся на этом сайте, допускается только с письменного разрешения администрации. Авторские права на опубликованные на сайте материалы принадлежат их владельцам.
Замечания? Предложения? "Мертвые" ссылки? Проблемы с загрузкой страниц? Пишите вебмастеру или в гостевую книгу
Designed by Эfir studio | © 2002-03 Yuri Lysenkov