Сопоставление CHS с LBA - (дисковое хранилище)

Сопоставление CHS с LBA - (дисковое хранилище)

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

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

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


Раньше средний размер (файла|блока|сектора) составлял 512 Б.

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

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

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

введите описание изображения здесь

По моему мнению, было бы лучше называть их 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

решение1

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

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(сектора) × 256(головок) × 1024(цилиндров) = 8064 МиБ

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

Я понимаю, что номер заголовка — это 246-битное адресуемое число...

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

Я не совсем понимаю, что на самом деле представляет собой голова, когда ее называют heads-per-track.

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

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

Тогда, по-видимому, вы не понимаете, что такое головка.
Вы также путаете «пластину» с «поверхностью».
Нет требования, чтобы обе стороны пластины были использованы, поэтому каждая поверхность рассматривается как единица, а не пластина как единица.
Есть параметр привода, называемый 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.


ДОПОЛНЕНИЕ к пересмотренному вопросу

По моему мнению, было бы правильнее называть их «головками на диск» или «головками на поверхность», поскольку цилиндр проходит через весь диск (несколько пластин).

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

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

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

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

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

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

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

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

КСТАТИ
На жаргоне конечного пользователя «диск» == дисковый накопитель.
На профессиональном жаргоне HDD «диск» == дисковая пластина.

решение2

Вот удобный краткий обзор преобразования, исторических особенностей и правильной терминологии, реализованной в 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)

Связанный контент