вторник, 12 мая 2009 г.

Структура диска – базовые концепции

Физически жесткий диск представляет собой запечатанную банку с одной или несколькими одно или двухсторонними пластинами, насажанными на шпиндель. Чтение/запись данных осуществляется блоком магнитных головок, каждая их которых обслуживает одну из поверхностей пластины. Информация хранится в форме концентрических колец, называемых треками (track) или дорожками. Треки, расположенные на равном расстоянии от центра всех пластин, образуют цилиндр (cylinder). Фрагмент трека, образованный радиальным делением, называется сектором (sector). В современных винчестерах количество секторов на трек не остается постоянным и дискретно растет по мере удаления от центра пластины, поддерживая более или менее постоянные линейные размеры сектора. Треки и головки нумеруются начиная с нуля, сектора – начиная с единицы. Размер сектора для жестких дисков – 512 байт.

Первой схемой адресации секторов, доставшейся жестким дискам в наследство от дискет, стала так называемая CHS-адресация, представляющая собой сокращение от Cylinder/Head/Sector (Цилиндр/Головка/Сектор) и возникшая под давлением экономических причин. Когда-то, координаты адресуемого сектора напрямую соответствовали физической действительности, что упрощало (а, значит, и удешевляло!) дисковый контроллер, не требуя от него никакой интеллектуальности. Помимо того, что такая схема адресации чудовищна неудобна для программистов (последовательное чтение диска растягивается на три вложенных цикла!), она еще и до неприличия косна! Количество секторов в треке должно быть постоянным для всего диска, а в новых винчестерах это не так. Поэтому, для сохранения совместимости с существующим программным обеспечением, дисковый контроллер виртуализует геометрию винчестера, что ставит нас в зависимость от выбранной схемы трансляции (а схема трансляции – дело сугубо внутреннее и потому не стандартизированное). Параметры диска, сообщаемые устройством и напечатанные на этикетке, всегда виртуальные и никакой возможности узнать реальное положение дел у нас нет.

IDE-диски благодаря наличию интегрированного контроллером внутри, в наименьшей степени зависимы от внешнего мира и могут свободно мигрировать от одной машины к другой (при условии корректного поведения BIOS'а, но об этом чуть позже). Некоторые винчестеры поддерживают специальную ATA-команду "Initialize device parameters", устанавливающую текущую виртуальную геометрию диска, а точнее выбранное количество головок и число секторов на дорожку. Количество цилиндров вычисляется контроллером самостоятельно, на основании общего объема диска, который кстати говоря, также можно изменять программными средствами (за это отвечает ATA-команда SET MAX ADDRESS). Некоторые драйвера (и BIOS'ы) изменяют геометрию диска, привязывая винчестер к себе прочными брачными узами и в другом окружении такой диск работать уже не будет, ну во всяком случае до установки правильной геометрии.

Со SCSI-устройствами ситуация обстоит гораздо хуже и диск соглашается работать только с тем контроллером, под которым он был отформатирован. Различные контроллеры используют различные схемы трансляции и потому подключение диска к несовместимому контроллеру произвольным образом "перемешивает" сектора. Редактор диска с таким винчестером работать еще будет, а вот штатные средства операционной системы (и большинство "докторов") нет.

Продвинутые контроллеры автоматически замещают плохие сектора, либо сохраняя эту информацию в свой энергонезависимой памяти, либо в записывая ее в инженерные сектора самого диска. Это еще сильнее привязывает накопитель к его контроллеру (правда, некоторые SCSI-диски выполняют переназначение секторов собственными средствами). Таким образом, выход SCSI-контроллера из строя фактически приравнивается к отказу самого диска. Никогда не приобретайте SCSI-контроллеры no-name производителей – в любой момент они могут кануть в лету и тогда поставки новых контроллеров прекратятся. Контроллеры, интегрированные в материнские платы, это вообще песня. Ненадежные, ни с чем не совместимые… а что вы еще хотели за такую цену?

Сложнее всего приходится RAID-массивам, схема трансляции адресов которых полностью определяется контроллером. Массивы уровня 1 (mirroring или зеркала) чаще всего транслируются всквозную и без особых проблем могут быть перенесены на любой другой контроллер или даже подключены в обход него. Массивы остальных уровней (и в особенностей RAID 3/RAID 5) на других типах контроллеров по обыкновению неработоспособны. Программные RAID'ы, монтируемые Windows NT, содержат информацию о своей геометрии в системном реестре и не могут быть непосредственно перенесены на другие системы. Переустановка Windows NT (равно как и крах оной) уничтожает программный RAID. К счастью, эта потеря обратима и в следующих статьях этого цикла мы раскроем секреты техники восстановления.

Несмотря на то, что CHS-трансляция в настоящее время признана устаревшей (устройства, придерживающиеся спецификации ATA/ATAPI-6, принятой в июне 2001 года, уже не обязаны ее поддерживать), она до сих пор встречается во многих служебных структурах операционной системы (в частности в таблице разделов и загрузочном секторе), поэтому имеет смысл остановиться на этом вопросе поподробнее, тем более, что здесь есть о чем поговорить.

На интерфейсном уровне, адрес сектора передается следующим образом 

 

порт                       значение

0172/01F2              кол-во секторов

0173/01F3              номер сектора (биты 0-7)

0174/01F4              номер цилиндра (биты 0-7)

0175/01F5              номер цилиндра (биты 8-15)

0176/01F6              номер головки (биты 0-3), привод на шине (бит 4), режим CHS/LBA (бит 6)

Листинг 1 интерфейс с IDE-диском в режиме CHS

 

Сервисные функции BIOS'а, напротив, адресуют диск слегка по своему:

 

регистр                 значение

AL                          кол-во секторов для обработки

CH                          номер цилиндра (биты 0-7)

CL                          номер цилиндра (биты 6-7), номер сектора (биты 0-5)

DH                         номер головки

DL                          привод на шине | 80h

Листинг 2 интерфейс с прерыванием INT13h BIOS

Таким образом, на адресацию цилиндров BIOS отводит всего 10 бит и потому максимальное количество цилиндров на диске ограничено всего 1024, что при четырех битной адресации головок, дает предельно достижимый объем диска в 512 * 210 * 26 * 24 == 536870912 байт или 512 Мб. Ха! Производители винчестеров перешагнули этот барьер уже много лет назад и с той поры, кстати говоря, очень многое изменилось. MS-DOS ушла небытие, а пришедшая ей на смену Windows работает с диском через собственный драйвер и ограничения BIOS ее никак не касаются. Ну почти не касаются… Ведь первичную загрузку операционной системы осуществляет никто иной как BIOS и если системные компоненты расположены в секторах, находящихся за пределами 1024 сектора, операционная система попросту не будет загружена! Причем, это относиться ко всем операционным системам, а не только к критикуемой Windows!

Для преодоления этого ограничения BIOS вводит дополнительный уровень трансляции (режим LARGE), увеличивая количество головок (благо, BIOS выделяет для их адресации аж 8 бит, против 4 бит, выделяемых контроллером диска). К следствие, предельно допустимый объем диска теперь составляет 512 210 26 * 28 == 8.589.934.592 байт или 8 Гбайт. Это в теории. На практике же большинство BIOS'ов содержали грубые ошибки и при работе с дисками свыше 2 Гб они либо банально зависали, либо теряли старшие разряды цилиндра, обращаясь к началу диска и необратимо гробя все служебные структуры. До сих пор многие вполне современные BIOS'ы не позволяют адресовать более 64 головок (виртуальных), что ограничивает предельно допустимый объем диска все тем же 2 Гбайтами. Поэтому, при переустановке Windows поверх старой версии на логический диск емкостью свыше 2 Гбайт, она может перестать загружаться. Все очень просто! Когда система ставится на только что отформатированный диск, она располагает все свои файлы в самом начале, но по мере же заполнения диска, область свободного пространства отодвигается все дальше к концу… Кстати говоря, отодвинуть файлы первичной загрузки может и дефрагментатор (или установка пакета обновления). Короче говоря, владельцем больших винчестеров настоятельно рекомендуется разбить свое хозяйство на несколько дисков, установив размер первого (загрузочного) раздела не более, чем в 8 Гбайт, а лучше даже в 2 Гбайта.

SCSI-устройства от рождения поддерживают прозрачный механизм логической адресации, или сокращенно LBA (Linear Block Address), последовательно нумерующий все сектора от 0 до последнего сектора диска. В IDE-накопителях LBA-адресация появилась только начиная с ATA-3, но быстро завоевала всеобщее признание. Разрядность адресации определяется устройством. В SCSI она от рождения 32-битная, а IDE-устройства вплоть до принятия спецификации ATA-6 были ограничены 28 битами, которые распределялись следующим образом:

 

порт                       значение

0172/01F2              кол-во секторов

0173/01F3              номер сектора (биты 0-7)

0174/01F4              номер сектора (биты 8-15)

0175/01F5              номер сектора (биты 16-24)

0176/01F6              номер сектора (биты 24-28), привод на шине (бит 4), режим CHS/LBA (бит 6)

Листинг 3 интерфейс с IDE-диском в режиме LBA

Как можно видеть, 28 битная адресация обеспечивает поддержку дисков с объемом вплоть до 128 Гбайт, однако, включение в BIOS поддержки LBA еще не отменяет 8 Гбайтного ограничения и номер последнего адресуемого цилиндра по прежнему остается равным 1024 со всеми вытекающими отсюда последствиями. SCSI-дискам с их подлинно 32 битной адресацией несколько проще и они поддерживают законные 2 Тбайта, а все потому что управляются своим собственным BIOS'ом, на которых не наложено никаких дурацких пережитков старины.

Утвержденная ATA-6 48 битная адресация расширяет предельно допустимые размеры IDE-дисков до астрономических величин (конкретно – до 131.072 Тбайт), по крайней мере в теории. На практике же, в Windows 2000 с пакетом обновления SP2 или более ранним, отсутствует поддержка 48 разрядной LBA и для работы с большими дисками необходимо обновить драйвер Atapi.sys и добавить к следующему ключу реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\atapi\Parameters параметр EnableBigLba типа DWORD со значением 1. (за подробностями обращайтесь к Microsoft Knowledge Base: 260910).

Один физический диск может быть разбит на несколько логических, каждый из которых последовательно нумеруется от первого до последнего сектора либо "сквозной" адресацией, либо по CHS-схеме. В одних случаях Windows требует задания абсолютного номера сектора (который на самом деле никакой не абсолютный, а относительный, отсчитывающийся от стартового сектора раздела), в других – ожидает увидеть "святую троицу" (цилиндр, головку, сектор), опять-таки, отсчитывающихся от стартового сектора. Так, если раздел начинается с адреса 123/15/62, то первой его головкой все равно будет головка 0!

На уровне файловой системы операционная система адресует диск кластерами (cluster). Каждый кластер образован непрерывной последовательностью секторов, количество которых равно степени двойки (1, 2, 4, 8…). Размер кластера задается на этапе форматирования диска и в дальнейшем уже не меняется. Основное назначение кластеров – уменьшение фрагментации файлов и уменьшение разрядности служебных файловых структур. В частности, FAT16 нумеруют кластеры двойными словами и потому может адресовать не более 10000h*sizeof(cluster) дискового пространства. Легко видеть, что уже на 80 Гбайтовом диске размер кластера составляет 1 Мбайт и десяток файлов по одному байту каждый сожрут 10 Мбайт! Впечатляет, не правда ли? NTFS, оперирующая 64 битными величинами, не страдает подобными ограничениями и типичная величина кластера, выбираемая по умолчанию, составляет всего 4 сектора. В отличии от секторов, кластеры нумеруются начиная с нуля.

Комментариев нет:

Отправить комментарий