|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Valentin Nechayev 2:5020/400 04 Dec 2005 12:47:08 To : Stas Degteff <Stas.Degteff@p1.f102. Subject : Re: Старая FreeBSD и большие винты -------------------------------------------------------------------------------- >>> Stas Degteff wrote: VG>> Это знаменитый предел адресации CHS. 512 байтный сектор на 3 байта VG>> адреса в MBR (1023 цилиндра на 255 доржек на 63 сектора). Решалось VG>> введением LBA. SD> Путаник великий! Hе вводи народ в заблуждение. Путаник - ты. VG всё правильно сказал. SD> Диапазон CHS: сектор 1..63, дорожка 0..15, цилиндр 0..1023. SD> Предел CHS приходится на 504 Мб (63*16*1024*512=528482304 байт) Это диапазоны _общих возможностей_ CHS одновременно для геометрической шинной адресации IDE (65536*16*255, всего 28 бит) и адресации в BIOS и в таблицах разделов (1024*256*63, всего 24 бит). Когда он был превзойдён, потребовалась трансляция, SD> LBA был придуман для использования всей 24хбитной адресации и его предел - SD> 8192 Мб. _Шинный_ LBA был придуман для использования всей _28-битной_ (смотри внимательно на цифру и на слово "шинный") адресации. То есть до 128G, при стандартных секторах. Позже был придуман LBA48. В то же время вызовы BIOS отводят 8 байт на номер блока, то есть тут 64 бита. VS>> Интересно, почему FreeBSD 2.2.8 все современные жесткие IDE диски VS>> воспринимает как 8-гиговые? Что это за магический предел? SD> Это предел IDE c 24хбитным адресом сектора. Дальше уже EIDE с 32хбитным SD> адресом сектора, Hе было никогда 32-битного адреса, это ты курил неправильную траву. И нет такого различия между IDE и EIDE. SD> а нынешние диски уже требуют 48 бит под адрес сектора. SD> Размер сектора 512 байт как был так и остался. Частично процитирую свои старые заметки по данному вопросу. Текст немного нудноват из-за ориентации на полного чайника. ==={{{ Интерфейс ATA до сих пор (похерено только в ATA-6) указывает поддержку этого режима (шинной адресации), которая используется при начальной загрузке системы и других операциях; номер цилиндра, головки и сектора пишутся прямо в порты адресов ATA контроллера (и передаются напрямую диску), при этом диапазоны допустимых значений таковы: C - 0..65535, H - 0..15, S - 1..255. (По принятому стилю, нумерация секторов начинается с 1, а не с 0.) Hачиная с ATA-2, стала возможной, а с ATA-4 - обязательной поддержка линейной адресации, которая те же 28 бит использует как линейный адрес начиная с 0. С ростом технологий, подобная схема (CHS) стала слишком примитивной. Росли плотности как по количеству дорожек на поверхность, так и по количеству секторов. С какого-то момента контроллер диска стал производить ретрансляцию переданной ему геометрии в реальную дисковую, которая потеряла описанную примитивность - количество секторов на дорожку могло меняться, плотность записи могла меняться, и так далее. Используемая непосредственно на шине и рапортуемая для этих целей диском геометрия стала фиктивной, от которой требовалось соответствие желаниям и ограничениям интерфейса и софта, но не реальной обстановки на диске. Размер блока устоялся равным 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 адресом блока, в таблицу писались абсолютные номера блоков, но для реального доступа они не использовались - геометрия одна, и проще было применять CHS номера, чем пересчитывать абсолютные номера блоков. Драйверам файловых систем все равно приходилось делать такой пересчет, потому что в файловых системах нумерация была абсолютной; но загрузчики были лишены общения с абсолютными номерами блоков. Шинную геометрию можно узнать у диска командой Identify Device (код 0xEC). Она появилась не сразу (начиная с ATA-2, во времена 200M дисков); до этого можно было только задавать геометрию руками в настройках BIOS. С ее появлением в BIOS появилась возможность сделать автодетект диска - диску отдавалась команда Identify Device и геометрия бралась из ответа диска. Значительно позднее стали применять автоидентификацию при каждой загрузке, вместо ручного прогона при изменении конфигурации. (Вдогонку: понимаемую диском шинную геометрию можно менять в некоторых пределах. Hо обычно оставляли настройку в 16 головок и 63 сектора.) Идиллия кончилась по достижению барьера в 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 непосредственно). Пример такого решения для 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, в ту, которая сообщалась диском, или же в абсолютный номер блока, если такое поддерживалось диском (см. ниже). Hачиная с дисков размером ~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 и требовала линейной адресации. Для режима LARGE, он же ECHS, не устоялось общего на все BIOS метода трансляции, поэтому он использовался крайне редко.) Отметим, что от декларирования шинной геометрии с количеством секторов больше 63 отказались из-за желания получить все ту же совместимость с BIOS и MSDOS даже при выборе режима трансляции NORMAL (то есть без трансляции вообще). Решение вполне обоснованное - до того, как загрузчик сможет загрузить драйвер, умеющий это обходить, потребуется загрузить очень много другого и наверняка с секторов с номерами больше чем 63. Замечание: IBM IC35L060AVVA07 объемом 60G декларирует 255 секторов. Это новая тенденция в дискостроении, но следует ожидать ее широкого распространения:( Hиже мы этот диск упоминаем повторно. Одновременно с введением ретрансляции средствами BIOS или специальных драйверов было начато предоставлять возможность отказаться от CHS адресации вообще для тех, кто на это способен. В частности, для многих unix систем, не использующих MSDOS partitioning вообще, это было избавлением от бессмысленного промежуточного уровня. Аналогично начала работать и Windows NT (а позднее - Windows 98 и ME, но только в protected режиме). Это состояло из двух интерфейсов: * Для шины ATA - появилось задание адресации LBA битом DH[6], если диск сообщил о поддержке LBA. * Для BIOS - появились вызовы группы d-134X (INT 13h при AH=0x4X), использующие LBA номер блока вместо CHS. Эта группа вызовов, называемая IBM/MS INT13 extensions, а позднее EDD1, поддерживается почти всеми современными BIOS'ами (хотя некоторые редиски и сейчас делают BIOS'ы, которые их не поддерживают). (Позднейшее замечание: LBA на шине появилось, видимо, раньше чем началась трансляция геометрий; начиная с 200-300M его умеют уже все диски.) Здесь LBA адресация (не путать с LBA трансляцией!) означает Linear Block Access - доступ к блокам диска по их линейному (абсолютному) номеру, а не по фиктивной комбинации C/H/S. В современных BIOS'ах, она может использоваться и для LBA трансляции. Совсем недавно появилась поддержка 48-битной LBA адресации, кроме прежней 28-битной. Она используется для дисков объемом более 128G. (Это нововведение ATA-6, который одновременно вообще отменил поддержку геометрической адресации на шине; если устройство хочет уметь такое, оно декларирует поддержку более старых стандартов.) Барьер 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 и потомками: абсолютный адрес начала раздела и абсолютная длина размера (оба - в блоках диска). В старые поля (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 и загрузчиками). (См. там же про IC35L060AVVA07 как нарушителя этого правила.) Для дисков больше чем 32G потребовалось рапортовать более чем 65536 цилиндров, например, для IBM IC35L040AVER07 (40G) это 79780*16*63, при том, что LBA геометрия в этом случае - 5005*255*63. Превышение границы в 65536 цилиндров дало два эффекта: * Драйвера, не знающие про это переполнение, читали количество цилиндров, равное остатку от деления на 65536 реального количества. Для описанного IC35L040AVER07 устаревшее ядро Linux нашло только 14244 цилиндра и соответственно рассказало про 7G винт; * Множество BIOS'ов, основанных на коде Award, висли при попытке детекта такого диска. Производители дисков вынуждены были добавить специальный режим установки перемычек, при котором диск ограничивал видимую и пригодную к использованию шинную геометрию 65536 цилиндрами. Почти всегда восстановление нормальной работоспособности решалось апдейтом BIOS'а. * BIOS'ы группы Award 6.00 во всех трансляциях кроме LBA рапортовали 255 секторов на дорожку в отдаваемой BIOS'ом геометрии, что дало следствием неработу геометрических вызовов для области до 32G. Пример такого следствия - FreeBSD4 не загружалась в первых 32G, но загружалась за этой границей. Award не проявил стремления лечить это, поэтому при использовании загрузчиков и ОС предпочитающих геометрическую адресацию (MS-DOS, Windows 9x в DOS-режиме, FreeBSD до 5.4) установка LBA трансляции обязательна. ===}}} -netch- --- ifmail v.2.15dev5.3 * Origin: Dark side of coredump (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/223838fd453e5.html, оценка из 5, голосов 10
|