Перед тем, как прочитать или записать что-либо на диск, надо определить позицию с которой мы хотим начать читать или писать информацию. Позицию можно определить например путем передачи номера сектора или блока диска. Если рассматриваемый диск является SCSI диском, то номер сектора переводится в команды SCSI, а далее сам диск находит нужную позицию. Если диск имеет интерфейс IDE и использует LBA, то происходит почти то же самое. Если же диск нам достался с доисторических времен (RLL, MFM или IDE, когда не знали LBA), в этом случае диску для поиска нужной позиции требуется три значения: цилиндр, считывающая головка, сектор.
Между последовательной нумерацией и 3D нотацией(под выражением 3D нотация
подразумевается поиск нужного сектора по трем параметрам c,h,s) имеется следующее
соответствие: для диска с C цилиндрами, H считывающими головками и S
секторами/дорожками - позиция (c,h,s) в 3D или CHS нотации соответствует
позиции c*
H*
S + h*
S + (s-1) в последовательной или LBA
нотации. (Минус 1, это следствие того, что по традиции номер сектора в 3D
нотации начинается с 1, а не с 0.)
Следовательно, чтобы получить доступ к очень старому не SCSI диску, надо знать его геометрию.
Linux не использует при своей работе BIOS, но другие операционные системы
могут использовать BIOS. Старые BIOS, которые были сделаны перед внедрением
LBA, используют для доступа к диску функции INT13, которые используют 3D
нотацию (c,h,s). (Точнее: AH
- выбор операции, CH
- младшие 8 бит
номера цилиндра, CL
- 7-6 биты соответствуют старшим битам номера
цилиндра, 5-0 биты соответствуют номеру сектора, DH
- номер считывающей
головки и DL
- номер диска (80h или 81h). Это объясняет схему
построения таблицы разделов.)
В результате мы имеем номер в CHS нотации, укладывающийся в 3 байта: 10 бит на номер цилиндра, 8 бит на номер считывающей головки и 6 бит на номер сектора (от 1 до 63). Следствием этого является ограничение на количество цилиндров (от 0 до 1024), которое может поддерживать BIOS.
Когда появились IDE диски с поддержкой LBA, программное обеспечение для DOS и Windows не изменилось. И DOS, и Windows хотят знать геометрию диска, даже если она им не нужна для операция чтения/записи, им требуется это для обращения к BIOS. OS Linux требуется знание физической геометрии диска, если от нее требуется общаться с BIOS или с другими операционными системами, даже при работе с современными дисками.
Такое состояние дел продолжалось около 4ех лет, или около того, а затем на рынке появились диски, которые нельзя читать через функции INT13 (потому что 10+8+6=24 бит, следовательно обращаться только к 8.5 ГБ - для большего не хватает адресного пространства). Был создан новый интерфейс для BIOS - так называемые расширенные INT13 (Extended INT13) функции, где DS:SI указывает на 16 байтовый Адресное Дисковое Пространство (Disk Address Packet), которое содержит 8-ми байтовый абсолютный номер блока.
Очень медленно Microsoft ползет в сторону использования расширенных INT13 функций. Вероятно, через несколько лет никому больше не понадобятся знания о физической геометрии диска.
Не более чем 65536 цилиндров (нумерация 0-65535), 16 считывающих головок (нумерация 0-15), 255 секторов/дорожек (нумерация 1-255). Максимальная емкость: 267386880 секторов по 512 байт каждый, что составляет 136902082560 байт (137 ГБ). Сейчас (1999 год) это не является проблемой, но через несколько лет это станет проблемой.
Не более чем 1024 цилиндров (нумерация 0-1024), 256 считывающих головок (нумерация 0-255), 63 сектора/дорожек (нумерация 1-63). Максимальная емкость: 8455716864 байт (8.5 ГБ). Сегодня это является серьезным ограничением на размер диска. А именно, DOS не в состоянии использовать большие диски.
Если при обращению к диску использовать одни и те же значения c,h,s при обращении через Int 13 функции BIOS и через функции IDE интерфейса, то оба эти ограничения складываются так, что никто не может использовать больше чем 1024 цилиндра, 16 считывающих головок и 63 сектора/дорожки, что составляет 528482304 байт (528 МБ). Это и есть всем известная проблема ограничения в 504 Mб для DOS в комбинации со старыми BIOS. Это стало проблемой примерно в 1993 году. Для обхода этой проблемы использовались всевозможные трюки: железо (LBA), firmware (BIOS `translation'), программное обеспечение (disk managers). Концепция трансляции (`translation') была изобретена в 1994 году: BIOS использует одну геометрию диска, когда общается с диском и другую (фальшивую) при общении с DOS, и `переводит' одну нотацию в другую.
В некоторых старых BIOS под число цилиндров в CMOS RAM резервируется только
12 бит. Следовательно число цилиндров не может быть больше 4096, что дает
максимально доступную емкость диска в
4095*
16*
63*
512=2113413120 байт. Если диск имел большую
емкость, то в процессе загрузки это приводило к `зависанию' компьютера. Это
привело к росту популярности дисков обладающих 4092/16/63 геометрией. До сих
пор попадается довольно много больших дисков, которые с помощью
переключателей можно заставить `прикинуться' диском с подобной геометрией.
Более подробную информацию можно найти по адресу
over2gb.htm.
Более новые BIOS
в процессе загрузки не `завешивают' компьютер, но видят диск меньшего
размера. Например определяют, что диск размером в 2.5 ГБ имеет размер в 429
МБ.
В BIOS от Phoenix версий 4.03 и 4.04 был баг, который приводил к перезагрузке системы в случае наличии в компьютера диска с емкостью более 3277 МБ. Подробности ищите по адресу over3gb.htm.
Простая BIOS трансляция (ECHS=Extended (расширенный) CHS, иногда зовется как
`Large disk support' или просто как `Large') работает путем увеличения числа
считывающих головок и уменьшения числа цилиндров, выдаваемых для
использования DOS, до тех пор, пока число цилиндров не сравняется с 1024.
На данный момент и DOS, и Windows 95 не поддерживает 256 считывающих головок.
Обычно, когда диск сообщает о 16 считывающих головках, простой механизм
трансляции позволяет получить доступ к диска с емкостью не более чем
8192*
16*
63*
512=4227858432 байт (с фальшивой геометрией диска в
1024 цилиндров, 128 считывающих головок, 63 сектора/дорожки). Обратите
внимание, что ECHS не меняет число секторов на дорожке, поэтому, если число
секторов меньше 63, то ограничение становится еще более жестким. Для получения
более подробной информации смотрите
over4gb.htm.
Более продвинутые BIOS обходят, описанную выше
проблему, путем приравнивание числа считывающих головок 15 (`Улучшеный ECHS'),
поэтому фальшивая геометрия может состоять из 240 считывающих головок, что
дает 1024*
240*
63*
512=7927234560 байт.
Ну и наконец: если BIOS делает все возможное и невозможное для увеличения
емкости диска - использует 256 считывающих головок и 63 сектора/дорожки
(`assisted LBA' или просто `LBA'), то это дает
1024*
255*
63*
512=8422686720 байт, немного меньше чем 8.5 ГБ,
так как геометрии с 256 считывающими головками следует избегать.
Следующий барьер на пути повышение емкости приходится на 33.8 ГБ. Дело в том, что при 16 считывающих головках и 63 секторах/дорожках требуется число цилиндров большее, нежели 65535 - не вмещается в short (2 байта). Большинство BIOS на сегодня не в состоянии поддерживать подобные диски. (Для решения этой проблемы смотрите, например Asus upgrades для поиска новых прошивок для флэш памяти без этой проблемы.) Для решения этой проблемы ядру Linux версий ниже 2.2.14 / 2.3.21 требуется патч. Подробности смотрите в разделе Проблемы IDE с дисками емкостью 34+ ГБ.
Смотрите так же Препятствия и ограничения, и более детальное описание в статье Ограничения для жестких дисков IDE.
Жесткие диски емкостью более чем 8.4 ГБ сообщают, что их геометрия равна 16383/16/63. Это означает, что понятие геометрии изжило себя и что полный размер диска не может быть подсчитан через геометрию.