The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Геометрия в ATA/IDE (ata ide disk)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: ata, ide, disk,  (найти похожие документы)
From: Valentin Nechayev <http://segfault.kiev.ua>; Date: Mon, 26 Mar 2006 14:31:37 +0000 (UTC) Subject: Геометрия в ATA/IDE Оригинал: http://segfault.kiev.ua/~netch/articles/ata-geom.html ATA (IDE) - технология с историей и со странностями. Путь ее развития весьма извилистый. Этим объясняется множество проблем и заморочек, с которыми приходится на ней сталкиваться. Некоторые из них перешли и на применение SCSI дисков - например, проблемы с partition tables. Диск - это непрерывный массив физических блоков. Непрерывность этого массива принципиальна - нарушения сейчас допускаются только для "плохих" (нечитаемых и иным образом испорченных) физических блоков, и то эта особенность постепенно уходит в прошлое - плохие блоки там, где должны быть критически важные структуры, и раньше не допускались, а сейчас (по крайней мере для ATA дисков) сообщение о плохом блоке означает исчерпание внутреннего резерва запасных блоков и поэтому невозможность дальнейшей работы с этим диском. В то же время, адресовать блоки в этом непрерывном массиве можно двумя путями. Первый путь - адресация по прямому номеру блока; блоки нумеруются от нуля до максимально возможного номера, без разрывов в этой последовательности. Этот путь был изначальным для SCSI, но не для IDE. Второй - изначальный для IDE/ATA, но не для SCSI - использование трех чисел, которые называются номером цилиндра, головки (дорожки) и сектора. Весь наш рассказ посвящен проблемам, которые исходят от этого пути. Понятие номера головки и номера дорожки обычно смешиваются. В дальнейшем я буду стараться останавливаться на номере головки, как на более точном, потому что номер дорожки имеет интерпретацию также не в пределах цилиндра, а по всему диску Адресация CHS - то есть, цилиндр/головка/сектор (cylinder/head/sector) - отражает технологию, принятую в ранних дисках. Опишем ее подробнее. Диск - множество пластин (одна или больше), на которых могут использоваться одна или две стороны. Номер поверхности - номер головки (еще один синоним к имеющимся двум, но использовать его мы не будем). Поверхность разбита на кольцевые дорожки. Группа дорожек на равном расстоянии от центра - цилиндр. На всех дорожках одинаковое количество одинаковых блоков. Угловая скорость чтения/записи блока - одинакова для всех цилиндров; линейная - растет по мере удаления от центра. Нехитрая премудрость этой адресации здесь заканчивается. Интерфейс ATA вплоть до ATA-6 (2002 г.) требовал поддержку этого режима, которая используется при начальной загрузке системы и других операциях; номер цилиндра, головки и сектора пишутся прямо в порты адресов ATA контроллера (и передаются напрямую диску), при этом диапазоны допустимых значений таковы: C - 0..65535, H - 0..15, S - 1..255. (По принятому стилю, нумерация секторов начинается с 1, а не с 0.) С ростом технологий, подобная схема стала слишком примитивной. Росли плотности как по количеству дорожек на поверхность, так и по количеству секторов. С какого-то момента контроллер диска стал производить ретрансляцию переданной ему геометрии в реальную дисковую, которая потеряла описанную примитивность - количество секторов на дорожку могло меняться, плотность записи могла меняться, и так далее. Используемая непосредственно на шине и рапортуемая для этих целей диском геометрия стала фиктивной, от которой требовалось соответствие желаниям и ограничениям интерфейса и софта, но не реальной обстановки на диске. Размер блока устоялся равным 512 байт. Менять уже не стали - изменение этого размера могло вызвать проблемы в софте значительно большие, чем все геометрии вместе взятые. Как сказано выше, ограничение шины - 65536*16*255. В то же время, BIOS (интерфейсами d-1302, d-1303 - см. Ralf Brown's Interrupt List) ввела другие ограничения: 10 бит на цилиндр, 8 на головку и 6 на сектор, что дало предельную геометрию 1024*256*63. Эти же ограничения были повторены в структуре записи раздела в MSDOS partition table. Одновременно с C/H/S адресом блока, в таблицу писались абсолютные (линейные) адреса (номер начального блока и длина раздела), но для доступа средствами MS-DOS они не использовались - геометрия одна, и проще было применять CHS номера, чем пересчитывать абсолютные номера блоков. Драйверам файловых систем все равно приходилось делать такой пересчет, потому что в файловых системах нумерация была абсолютной; но загрузчики были лишены общения с абсолютными номерами блоков. Шинную геометрию можно узнать (если диск поддерживает ATA-5 или более ранний стандарт) у диска командой Identify Device (код 0xEC). Эта команда появилась не сразу; до этого можно было только задавать геометрию руками в настройках BIOS. С ее появлением в BIOS появилась возможность сделать автодетект диска - диску отдавалась команда Identify Device и геометрия бралась из ответа диска. Значительно позднее стали применять автоидентификацию при каждой загрузке, вместо ручного прогона при изменении конфигурации. Идиллия с геометрическим доступом кончилась по достижению барьера в 1024*16*63 блока, то есть 504 мегабайта (или 528, по принятому у производителей дисков подсчету). Ограничение шины - 65536*16*255 - почти 2^28 блоков. (С учетом описанного ниже предела в 63 сектора - почти 2^26 блоков.) Ограничение BIOS и MSDOS - 1024*256*63 - почти 2^24 блока. Зато общее подмножество - только около 2^19 блоков, общая геометрия - 1024*16*63, что дает 504 "длинных" мегабайта, или 528 "коротких". Вместо переделки шин и таблиц, было принято решение по использованию ретрансляции на произвольном участке между MSDOS (и Windows, к тому времени) и шиной ATA - это решение откладывало переделку таблиц как минимум до достижения объема в 32 раза больше, чем 504M. Два пути, которыми это решалось - поддержка BIOS режимов, названных LARGE и LBA, и специальные драйвера, загружавшиеся на этапе чтения config.sys, сделанные из OnTrack Disk Manager производителями своих дисков (или OnTrack Disk Manager непосредственно). Пример решения с трансляциями в BIOS для Quantum Fireball 1.2G. Геометрия диска, видимая на шине - 2484*16*63, что дает 1.28 "коротких" G. BIOS, видя количество цилиндров больше чем 1024, включал режимы ретрансляции: если установлен режим LARGE, то геометрия показывалась 1242*32*63; если LBA - то 621*64*63. Только вариант, выбранный для LBA, был пригоден для использования всего диска в MS-DOS и других системах, использующих BIOS в качестве драйвера. При установке такого режима, BIOS производил трансляцию геометрии, полученной в вызовах группы INT 13h, в ту, которая сообщалась диском, или же в абсолютный номер блока, если такое поддерживалось диском (см. ниже). Начиная с дисков размером 4G, установилась практика транслировать при выборе LBA ретрансляции в фиктивную геометрию с 255 головками и 63 секторами. Режим в 256 головок решили не применять из-за ограничений используемого софта. Эта ретрансляция используется и поныне, хотя в 1024 цилиндра новые диски уже не вмещаются даже при ней. ((Точный механизм вычисления так называемой LBA-геометрии, если точнее - LBA-assist геометрии, следующий. Полное количество блоков диска, полученное из ответа команды Identify Device, делилось на 1024*63. Если частное было 255 или больше, количество головок в геометрии устанавливалось 255. Если меньше, происходило округление вверх до ближайшего числа из следующего набора: 16, 32, 64, 128, 255. Разделив количество блоков диска на 63 и на подобранное количество головок и округлив ответ вниз до целого, получали количество цилиндров в итоговой LBA-assist геометрии. Если оно было более 1024, часть диска уже не могла адресоваться через старые (геометрические) вызовы BIOS и требовала линейной адресации.) Отметим, что от декларирования шинной геометрии с количеством секторов больше 63 отказались (вплоть до перехода 32G границы - см. ниже) из-за желания получить все ту же совместимость с BIOS и MSDOS даже при выборе режима трансляции NORMAL (то есть без трансляции вообще). Решение вполне обоснованное - до того, как загрузчик сможет загрузить драйвер, умеющий это обходить, потребуется загрузить очень много другого и наверняка с секторов с номерами больше чем 63. Одновременно с введением ретрансляции средствами BIOS или специальных драйверов было начато предоставлять возможность отказаться от CHS адресации вообще для тех, кто на это способен. В частности, для многих unix систем, не использующих MSDOS partitioning вообще, это было избавлением от бессмысленного промежуточного уровня. Аналогично начала работать и Windows NT (а позднее - Windows 98 и ME, но только в protected режиме). Это состояло из двух интерфейсов: * Для шины ATA - появилось (начиная с ATA-2) и стало обязательно (начиная с ATA-4) задание адресации LBA битом DH[6], если диск сообщил о поддержке LBA. * Для BIOS - появились вызовы группы d-134X (INT 13h при AH=0x4X), использующие LBA номер блока вместо CHS. Эта группа вызовов, называемая IBM/MS INT13 extensions, она же EDD1, поддерживается почти всеми современными BIOS'ами (ориентировочно, последние не поддерживавшие EDD1 закончились в 2001 году). Здесь LBA адресация (не путать с LBA трансляцией!) означает Linear Block Access - доступ к блокам диска по их линейному (абсолютному) номеру, а не по фиктивной комбинации C/H/S. В современных BIOS'ах, она может использоваться и для LBA трансляции. В ATA-6 появилась поддержка 48-битной LBA адресации, кроме прежней 28-битной. Она используется для дисков объемом более 128G. (Для сравнения, BIOS вызовы группы d-134X изначально поддерживают 64 бита номера блока.) Барьер 1024 цилиндров - барьер ограничений BIOS и MSDOS - не преодолевается старыми средствами BIOS; для его преодоления нужны как минимум функции группы d-134X (по номенклатуре Ральфа Брауна). Для BIOS'ов, не умеющих ретрансляцию геометрии, он наступил на границе 504(528)MB; диски объемом больше чем этот граничный нельзя использовать в полном объеме для MSDOS и наследников, если BIOS не поддерживает ретрансляцию геометрии или поддерживает ее иначе, чем тот, на котором диск был форматирован на логическом уровне (записана partition table). Если BIOS поддерживает стандартную LBA ретрансляцию, то этот барьер наступает при достижении диском размера 8G. Барьер 8G - барьер 1024 цилиндров при выборе LBA ретрансляции в BIOS'е. Предельный адресуемый размер диска средствами старых вызовов BIOS и при стандартной интерпретации MSDOS partition table - 1024*255*63 блока, или 8.422 "коротких" GB. Преодоление барьера в 1024 цилиндра потребовало ряда специальных мер. Так как BIOS не дает использовать CHS адресацию для цилиндров более 1024, ОС вынуждены использовать LBA адресацию - через вызовы d-134X или через свой драйвер - или же производить ретрансляцию в шинную геометрию своими силами, но тоже через свой драйвер, потому что BIOS этого не позволяет. Загрузочные разделы, при использовании старого загрузчика в MBR, не могут выходить за границы первых 1024 цилиндров. В MSDOS partition table потребовались специальные меры для обозначения разделов за пределами первых 1024 цилиндров, потому что стандартные обозначения непригодны. Для этого были взяты поля записей, которые ранее всегда писались, но не использовались MSDOS и потомками: абсолютный адрес начала раздела и абсолютная длина размера; оба - в блоках диска и 32 бита (то есть перестанут удовлетворять по достижению объема диска в 2TB). В старые поля (C,H,S) стали писаться фиктивные параметры: или правильный C/H/S адрес начала (конца), но с цилиндром обрезанным выше младших 10 битов, или специальное значение 1023/head_max/sector_max (чаще всего 1023/254/63). Чтобы избежать конфликта со старыми правилами понимания partition table, были введены новые типы разделов: * 0x0c - Win95 FAT32 (LBA) * 0x0e - Win95 FAT16 (LBA) * 0x0f - Win95 Ext'd (LBA) - для которых интерпретируются только абсолютные адрес начала и длина. Для систем, иных, чем DOS/Win9x/WinME, проблема опознания границ раздела была изначально решена в пользу абсолютных номеров (это относится к WinNT, Linux, FreeBSD и так далее), поэтому для их разделов новый тип не требовался. Барьер 32G (для некоторых дисков он был при немного меньшем объеме) - барьер в 65536 цилиндров для шинной геометрии. Как сказано выше, для шинной геометрии пределом считалось - 16 головок и 63 сектора (а не 256 и не 255, потому что вмешивается совместимость с BIOS и загрузчиками). Для дисков больше чем 32G потребовалось рапортовать более чем 65536 цилиндров, например, для IBM IC35L040AVER07 (40G) это 79780*16*63, при том, что LBA геометрия в этом случае - 5005*255*63. Превышение границы в 65536 цилиндров дало два эффекта: * Драйвера, не знающие про это переполнение, читали количество цилиндров, равное остатку от деления на 65536 реального количества. Для описанного IC35L040AVER07 устаревшее ядро Linux (ряда 2.2) нашло только 14244 цилиндра и соответственно рассказало про 7G винт; * Множество BIOS'ов, основанных на коде Award 4.51, висли при попытке детекта такого диска. Производители дисков вынуждены были добавить специальный режим установки перемычек, при котором диск ограничивал видимую и пригодную к использованию шинную геометрию 65536 цилиндрами. Почти всегда восстановление нормальной работоспособности решалось апдейтом BIOS'а. * BIOS'ы группы Award 6.00 во всех трансляциях кроме LBA рапортовали 255 секторов на дорожку в отдаваемой BIOS'ом геометрии, что дало следствием неработу геометрических вызовов для области до 32G. Например: для диска SAMSUNG SP1203N при выборе NORMAL такой BIOS показывает 57473*16*255, при LARGE - 3831*240*255. Пример такого следствия - FreeBSD4 не загружалась в первых 32G, но загружалась за этой границей. Award не проявил стремления лечить это, поэтому при использовании загрузчиков и ОС предпочитающих геометрическую адресацию (MS-DOS, Windows 9x в DOS-режиме, FreeBSD до 5.4) установка LBA трансляции обязательна. Немного о других границах и проблемах от их пересечения. * 2TB - граница 32-разрядного номера блока. По достижении этой границы таблицы разделов MS-DOS станут окончательно непригодны. Как альтернатива, Intel разработал GPT (GUID Partition Table) в рамках своей спецификации EFI (Extensible Firmware Interface), в которой размеры и адреса начала разделов описываются 64-битными числами. * 1TB - граница 32-разрядного номера блока в понимании как числа со знаком; по достижении этой границы следует ожидать всплытия большого числа багов в разнообразном программном обеспечении. * 128GB (или 137GB, считая миллиардами байт) - граница доступности через шинные интерфейсы ATA - геометрический и LBA28. Подробно она описывалась выше, но есть и ряд других эффектов. Например, в Windows 2000 до SP5 и Windows XP до SP2 лишние биты обрезались, в результате чего можно было доступом за пределы области нижних 128G получить затирание начальных областей диска. * 4GB - граница непригодности "классической" ECHS трансляции, которая порождала геометрию с 256 головками. Для исправления этого был введён т.наз. "revised ECHS", который пересчитывал геометрию в 15-головочный вариант и затем удваивал количество головок до тех пор пока оно не достигало 240 или количество цилиндров не становилось не более 1024. * 2GB - вызывало проблемы в некоторых BIOS из-за хранения количества цилиндров в выбранной геометрии в 8 битах (вместо необходимых 10). (C) 2002-2005 Valentin Nechayev. All rights reserved.

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру