Вычислить следующий кластер
Недавно я прочитал несколько хороших руководств по разработке ОС на 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 байта!