1

До LBA у вас было просто физическое отображение диска, при котором исходный доступ к диску через BIOS на старой машине, совместимой с IBM-PC, выглядел бы примерно так:

  • Номер цилиндра: (10b)
    • 0-1024 (1024 = 2 ^ 10)
  • Номер головы: (8b)
    • 0-256 (256 = 2 ^ 8)
  • Номер сектора : (6b)

Общий адрес CHS: 24b (10+8+6)


В свое время средний размер (файл | блок | сектор) был 512B.

Пример из википедии:

512(bytes) × 63(sectors) x 256(heads) × 1024(cylinders) = 8064 MiB (yields what is known as 8 GiB limit) 

Что меня смущает, так это то, что на самом деле означает голова, когда в формуле LBA ее называют heads-per-cylinder . Это не имеет смысла для меня, потому что из того, что я знаю, голова - это голова, и, если это не съемный носитель, у каждого диска есть два из них (верхний, нижний) по одному на каждую из ее поверхностей.

На мой взгляд, было бы лучше упомянуть их как heads-per-disk или heads-per-surface , поскольку цилиндр проходит через весь диск (несколько пластин).


Адресация логических блоков:

Формула: A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1)

  • A - Адрес логического блока
  • Nheads - количество головок на heads-per-disk
  • Nsectors - количество секторов на дорожке sectors-per-track
  • c,h,s - это цилиндр, головка, номера секторов, всего 24-bits total (10+8+6)

Глядя на первый пример здесь:

For geometry 1020 16 63 of a disk with 1028160 sectors CHS 3 2 1 is LBA  3150=(3× 16+2)× 63

Геометрия: (это определяется производителем)

  • Баллоны - 1020
  • Голов 16
  • Секторов - 63

2 ответа2

6

В целом, вы довольно неаккуратны с терминологией, так что это источник дальнейшей путаницы.

1024-битное адресуемое число (1024 = 2 ^ 10)

IBM PC/XT использовал дисковый контроллер Western Digital WD1010, который использовал (в аппаратных регистрах) 10-битный номер цилиндра.
Первый цилиндр имеет адрес 0, поэтому есть 1024 адреса цилиндров.
« Адресуемый номер » не имеет смысла.

-1 для "загрузочного сектора" (c-0, h-0, s-0)
63-битное адресуемое число (63 = 2 ^ 6 - 1)

Первый сектор (каждой дорожки) - это адрес 1, поэтому 6-битный номер сектора может адресовать до 63 секторов (номера секторов от 1 до 63) на каждой дорожке.
Нет адреса сектора ноль. Это не зарезервировано. Не существует
Вычитание этого смещения является арифметической необходимостью и никак не связано с загрузочным сектором. Использование первого сектора (или любого сектора) дисковода для загрузки (или любой другой функции) не имеет отношения к необходимости вычитать начальное смещение.

Таким образом, вы можете получить теоретический максимальный адрес следующего:

512(байты) × 63(сектора) x 256(головки) × 1024(цилиндры) = 8064 МиБ

Нет, это максимальная вместимость.
Дисковые адреса для секторов, а не байтов.

Я понимаю, что номер главы является 246-битным адресуемым номером ...

Да ??? "Адресуемый номер" ???
Одним из параметров привода является количество головок (в цилиндре).
Одно из чисел в адресе CHS является номером головы.
246 бит ???

Что меня смущает, так это то, что на самом деле означает голова, когда ее называют heads-per-track .

Heads-per-track - это то, что вы придумали, поскольку для типичного жесткого диска, используемого в ПК, такого параметра нет (т. Е. Это число всегда будет равно единице).
Конкретный трек будет прочитан и записан только одним конкретным носителем R/W.
Там одна головка R/W на поверхность. (Вы вряд ли будете использовать двухпортовый накопитель.)
Головка R/W установлена на конце рычага.
Все головки и рычаги R/W содержат узел, который перемещается / вращается приводом.
(Но были также дисководы с фиксированной головкой, например, одна головка на дорожку, которые имеют нулевое время поиска.)

Эти термины не имеют никакого смысла для меня, потому что из того, что я знаю, есть голова (фактическая рука, которая делает чтение / запись), и если только на сменном носителе нет каждого диска, есть два из них (вверху, внизу), так что это действительно делает больше с тех пор, как их называют головками на диске или головками на диске ... и на самом деле это должны быть секторы на дорожку, верно?

Тогда, видимо, вы не понимаете, что такое голова.
Вы также путаете "блюдо" с "поверхностью".
Не требуется использовать обе стороны диска, поэтому каждая поверхность рассматривается как единое целое, а не как единое целое.
Существует параметр привода, называемый sectors per track .

Теперь этот термин heads-per-track появляется, когда вы смотрите на преобразование из CHS в LBA.

Опять же, что-то, что вы, казалось, сделали. Голов за трек - это единство.

но как геометрия 1020,16,63 переводится в CHS 3,2,1, может кто-нибудь объяснить это мне?

LBA - это адрес сектора.
CHS также адрес сектора.
Чтобы преобразовать один стиль адреса в другой, вам нужно указать геометрию диска:

. number of cylinders  
. number of heads (per cylinder)  
. number of sectors per track

Вы не можете * перевести * геометрию в адрес; Вы используете геометрию для преобразования адреса.
Адрес CHS 3,2,1 эквивалентен адресу LBA 3150 если геометрия привода равна 1020,16,63 .


ADDENDUM для пересмотренного Вопроса

На мой взгляд, было бы лучше упомянуть их как головки на диск или головки на поверхность, поскольку цилиндр проходит через весь диск (несколько пластин).

Из многочисленных технических документов (от производителей дисководов), которые я прочитал, в таблице спецификаций для (однопортового) накопителя будет указано количество головок R/W и количество пластин. Никогда не было соотношения heads per disk , heads per surface или heads per platter .

Работая инженером по программному обеспечению и микропрограммному обеспечению, разрабатывая микропрограммное обеспечение контроллеров, драйверы устройств для дисков и обработчики файловых систем, я никогда не интересовался и не должен был использовать количество пластин. Количество пластин или наличие двух возможных поверхностей для пластины - это механические свойства , которые совершенно не зависят от геометрии привода для адресации CHS.

C в CHS относится к адресу цилиндра. Дисковод должен (электромеханически) искать требуемый адрес / местоположение цилиндра, чтобы сборка головки R / W была правильно установлена.

H в CHS относится к главному адресу R/W. Контроллер диска (электрически) выбирает запрошенную головку R/W (после завершения поиска) по ее адресу для доступа к правильной дорожке. Все остальные головки R/W отключены (электрически).

S в CHS относится к адресу сектора. Контроллер диска (программно) сканирует каждый сектор (после поиска и выбора головки), когда он вращается под (выбранной) головкой R/W, пока не будет найден запрошенный сектор (например, считывает запись идентификатора сектора и выполняет адрес сравнение).

Также
Если вы знакомы с анализом размеров, указание числа головок дисковода в виде heads per cylinder имеет больше смысла, чем heads per drive .

Я понимаю геометрические числа CHS, но откуда берутся (3,2,1) числа кортежей CHS?

Это просто произвольный адрес CHS, выбранный для использования в примерах преобразования в адреса LBA.

КСТАТИ
В жаргоне конечного пользователя "диск" == диск.
В профессиональном жаргоне HDD, "диск" == диск диск.

0

Вот удобный краткий обзор конверсии, исторических особенностей и правильной терминологии, реализованной в Python. Верхний регистр задает геометрию, нижний регистр - компоненты (c,h,s) адреса сектора.

Геометрия по умолчанию (C,H,S) дает значения, обычно используемые для современных больших дисков при ранней загрузке для загрузки в стиле MBR/BIOS.

def chs(lba,C=1024,H=255,S=63):
  """
  'lba' linearly addresses sector, indexing from zero.
  'C','H','S' specify geometry - fixed for a given disk:
     1 <= C <= 1024 (10 bits)
     1 <= H <= 255  (8 bits) not 256 due to WD1010 quirk
     1 <= S <= 63   (6 Bits) not 64 due to WD1010 quirk
   Returns address as c,h,s tuple:
     0 <= c <= 1023 (10 bits) modulo C
     0 <= h <= 255  (8 bits) modulo H
     1 <= s <= 63   (6 Bits) not 64 due to WD1010 quirk
  """
  if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
    raise ValueError, \
      "Invalid (C,H,S) geometry: ({},{},{})". \
        format(C,H,S)
  t,s = divmod(lba,S); s+=1 # tracks, sector offset
  c,h = divmod(t,H)
  if c>=C: raise ValueError, \
    "Unaddressable lba value: {} for ({},{},{}) geometry.". \
      format(lba,C,H,S)
  return (c,h,s)

def lba(c,h,s,C=1024,H=255,S=63):
  """
  'C','H','S' specify geometry as for function 'chs'.
  'c','h','s' address a sector in this geometry.
  """
  if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
    raise ValueError, \
      "Invalid (C,H,S) geometry: ({},{},{})". \
         format(C,H,S)
  if c<0 or h<0 or s<1 or c>=C or h>=H or s>S:
    raise ValueError, \
      "Unaddressable (c,h,s) value: ({},{},{}) for ({},{},{}) geometry.". \
         format(c,h,s,C,H,S)
  return (c*H+h)*S+(s-1)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .