Вычислить следующий кластер

Недавно я прочитал несколько хороших руководств по разработке ОС на BrokenThorn: это хорошая серия OSDev.

У меня возникли проблемы с пониманием идеи "вычисления следующего кластера", когда я хочу загрузить второй этап нашего загрузчика. Код является:

      mov     ax, WORD [cluster]  ; The current Cluster.
      mov     cx, ax              ; copy current cluster
      mov     dx, ax              ; copy current cluster
      shr     dx, 0x0001          ; divide by two
      add     cx, dx              ; sum for (3/2)

      mov     bx, 0x0200          ; location of FAT in memory
      add     bx, cx              ; index into FAT
      mov     dx, WORD [bx]       ; read two bytes from FAT

      test    ax, 0x0001

      jnz     .ODD_CLUSTER
      jz      .EVEN_CLUSTER 

Почему мы умножаем текущий номер кластера на 3/2, чтобы получить следующий номер кластера?

3 ответа

Я нашел тот же вопрос в теге сборки, но не могу найти его для ссылки!! (это очень полезно) Извините.

Итак, почему мы умножаем индекс на 3/2, чтобы получить индекс следующего кластера??

Прежде всего нам необходимо уточнить некоторые идеи:

Что такое Enrty в таблице FAT?

Это мир памяти длиной 12 битов. Итак, таблица FAT является ансамблем этой записи.

Что есть в этой записи??

В этом мире памяти есть индекс (Number), этот индекс относится к записи в той же таблице FAT (сколько записей с начального адреса FAT).

Каждая запись длиной 12 бит:

<---- 12 bits ----><---- 12 bits ----><---- 12 bits ----><---- 12 bits ---->
    1st index          2nd index          3rd index         4th index 

Когда мы получим первый индекс из корневого каталога (например: 4), мы должны перейти к этому индексу в таблице FAT, чтобы найти индекс для следующего номера кластера. Как мы продолжим?

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

     mov bx, [FAT address]   ; Strat address of FAT table
     mov ax, [cluster]       ;the index (for ex: 4)
     add bx, ax              ;Start address + index = the next Entry (cluster).

Легко:-)!!

Но где фракция 3/2? :-D.
приведенный выше код неверен, почему??

Логика верна, но есть неправильное понимание " Адресация ".
в большинстве процессоров адресация блока - это BYTE (8 бит), поэтому, когда мы делаем [index], это означает: индекс * 8 бит в памяти. поэтому, когда мы сделали [cluster] ---> index * 8-bit, вот так мы будем индексировать записи длиной 8 бит.

Наоборот, наш индекс 12-битный, а не 8-битный!!! Так как же решить эту большую проблему lool??

Решение: мы должны просто умножить [кластер] на 3/2, так что:
индекс * 8 бит * 3/2 = индекс * 12 бит. это то что нам нужно!! Теперь мы можем индексировать память по 12-битной единице (1,5 байта).
Правильный код:

     mov bx, [FAT address]   ; Strat address of FAT table
     mov ax, [cluster]       ;the index (for ex: 4)
     mov dx, ax              ; make copy of index
     shr dx, 0x0001          ; divide it By 2.
     add ax, dx              ; index/2 + index = index * 3/2.
     add bx, ax              ;Start address + index = the next Entry (cluster).

Я новичок, так что если что-то не так, просто сообщите об этом;-D!! Thankx.

Эта странность характерна для файловых систем FAT12.

Поскольку размер записи для кластера в FAT12 составляет 12 бит, для вычисления ее смещения (в байтах) в таблице размещения файлов необходимо взять ее индекс и умножить его на 3/2 (или 12 бит /8 бит).

Запись кластера содержит номер следующего кластера (например, указатель в связанном списке) меток файла или конца файла. Для свободных кластеров запись кластера может помечать плохие кластеры или просто является бесплатной.

Помните, что это FAT12: каждый кластер 12 бит. Поскольку байт составляет 8 битов, одна запись составляет один байт и половину или 3/2 байта!

Другие вопросы по тегам