Обмеження 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 = 267 386 880 секторів. У секторі 512 байт, отже:
HDDmax (CHS) = 65536 x 255 x 16 x 512 = 136 902 082 560 байт = 136,9 Gb (127,5 ГБ) *
Всі сучасні вінчестери використовують лінійну LBA-адресацію. У цьому випадку номер кожного сектора є одним 28-бітове число, і максимальним диском для LBA буде:
HDDmax (LBA) = 228 x 512 = 137 438 953 472 байт = 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