LBA и кластер - PullRequest
       45

LBA и кластер

2 голосов
/ 25 апреля 2011

Меня интересует LBA и номер кластера.

У меня такой вопрос:

  1. LBA 0 всегда кластер 2?

  2. тогда для чего кластер 0 и 1?

  3. единственное различие между кластером и LBA в том, где они начинаются с диска?

  4. отношение между CHS, LBA, кластерным номером?

  5. и в текущем коде, что означает add ax, WORD [datasector] для?

    ;************************************************;
    ; Convert CHS to LBA
    ; LBA = (cluster - 2) * sectors per cluster
    ;************************************************;
    
    
    ClusterLBA:
              sub     ax, 0x0002                          ; zero base cluster number
              xor     cx, cx
              mov     cl, BYTE [bpbSectorsPerCluster]     ; convert byte to word
              mul     cx
              add     ax, WORD [datasector]               ; base data sector
              ret
    

1 Ответ

8 голосов
/ 25 апреля 2011

Существует много схем нумерации секторов на дисках. Одним из ранних был CHS (Сектор головки цилиндров) . Один сектор можно выбрать, указав цилиндр (дорожку), головку чтения / записи и сектор на триплет дорожки. Эта схема нумерации зависит от фактических физических характеристик дисковода.

Первый логический сектор находится в цилиндре 0, головке 0, секторе 1. Второй находится в секторе 2 и так далее. Если на диске больше нет секторов (например, на дискете 1,44 МБ есть 18 секторов на дорожку), то применяется следующий заголовок, снова начинающийся с сектора 1 и т. Д.

Вы можете преобразовать адреса CHS в абсолютный (или логический) номер сектора с небольшой математикой:

L = (C * Nh + H) * Ns + S - 1

, где C , H и S - номера цилиндров, головок и секторов в соответствии с адресом CHS, тогда как Nh и Ns - количество головок и количество секторов на дорожке (цилиндре) соответственно. Обратный расчет (для преобразования LBA в CHS) так же прост:

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

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

Опять же, номер логического сектора первого сектора кластера может быть легко вычислен:

L = ((U - Sc) * Nc) + Sd

где U - номер кластера, Nc - количество секторов в кластере, Sc - первый действительный номер кластера, а Sd - номер первого логического сектора, доступного для общих файловых данных. Последние два параметра (Sc и Sd) являются полностью специфическими значениями файловой системы и операционной системы.

Некоторые файловые системы (например, FAT16 и все семейство FAT) резервируют кластер с номерами 0 и 1 для специальных целей, поэтому первым фактическим кластером является кластер номер два (в данном случае Sc = 2). Точно так же могут быть некоторые зарезервированные сектора в начале диска, где никакие данные не могут быть записаны и прочитаны. Эта зарезервированная область может варьироваться от нескольких секторов (например, загрузочной записи) до миллионов секторов (например, совершенно другой раздел, который предшествует нашему разделу на жестком диске).

Да, это был длинный ответ. В конце концов, краткие ответы на ваши вопросы можно обобщить следующим образом:

  1. Нет, LBA 0 - это не всегда кластер 2, он специфичен для файловой системы (в случае FAT кластер 2 - это первый доступный сектор на диске, но не всегда LBA 0 - см. Ответ 5).

  2. Интерпретация кластера № 0 и 1 также зависит от файловой системы (в случае FAT кластер № 0 представляет пустой кластер в таблице размещения файлов, а кластер № 1 зарезервирован).

  3. Нет, главное отличие состоит в том, что номер кластера относится к группе непрерывных секторов, а LBA обращается к одному сектору на диске.

  4. См. Формулы (формулы?) И сопровождающее описание в длинном ответе выше.

  5. Трудно сказать по такому короткому ассемблерному коду, но мое лучшее предположение - количество зарезервированных секторов в начале раздела (отмечено в Sd в формуле выше).

...