как FAT сообщает мне, что загружать подсказку следующего кластера по первому кластеру файла?

Я читаю учебник по OS Dev от Brokenthorn.

http://www.brokenthorn.com/Resources/OSDev6.html

Я застрял на этом несколько дней.;

загрузить "stage2.sys",

поиск в корневом каталоге "stage2 sys".

корневой каталог содержит имя файла и адрес начального кластера (например, 0x002).

загрузите 0x002-й кластер и найдите в FAT, какой кластер загружать следующим.

FAT состоит из 12-битного массива и

размер массива 4077

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

вопрос вот в чем.

  1. есть ли пропущенные или неправильные точки?

  2. как FAT сообщает мне, что загружать подсказку следующего кластера по первому кластеру файла?

FAT состоит всего из 12-битного массива.. как?

Благодарю.


person kim taeyun    schedule 24.04.2011    source источник


Ответы (3)


Список кластеров FAT представляет собой просто массив, в котором элементы массива представляют собой следующий индекс в цепочке кластеров файла. Запись файла в каталоге сообщает вам расположение первого кластера (в примере это кластер 0x002). Чтобы найти следующий кластер, вы смотрите на индекс 0x002 в массиве FAT:

next_cluster = FAT[0x002];

Например, если FAT[0x002] содержит 0x014, то это кластер, который будет содержать следующий набор данных для файла, тогда вы будете искать в FAT[0x014] третий кластер и т. д.

Если вы имеете дело с 12-битной FAT, это означает, что у вас есть некоторые сложности при индексации массива. Я думаю, что индексация идет примерно так

// find the 16-bit word that contains the 12-bit FAT entry
uint16_t tmp = ((uint16_t*)(((char*)FAT) + index + (index / 2)));

// keep either the high 12-bits or low 12-bits depending on if the 
// index is even or odd.
next_cluster = (tmp >> ((index % 2) ? 4 : 0)) & 0x0fff;

Конечно, это основано на FAT в памяти. Если FAT читается с носителя, вам необходимо соответствующим образом преобразовать его в сектор для чтения (и смещение в секторе).

person Michael Burr    schedule 24.04.2011

Запись каталога для файла содержит номер первого кластера. Вы можете использовать это, чтобы получить фактический кластер из «данной» части диска, плюс номер следующего кластера из FAT.

Запись в FAT содержит номер кластера следующего в файле.

Таким образом, у вас будет запись в каталоге, которая может указывать на то, что номер первого кластера равен 22. Затем вы должны пойти и получить данные для кластера 22, а также найти запись FAT для кластера номер 22 — скажем, в нем содержится 76.

Итак, следующий кластер в файле имеет номер 76, и вы выполняете тот же процесс: получаете данные, а также ищете следующий номер кластера в записи FAT 76.

Специальные значения для следующего номера кластера указывали на то, что цепочка была завершена и больше не было доступно. Я думаю (по памяти), что это было 0xFFF для FAT12, но, возможно, это был диапазон высоких значений.

person paxdiablo    schedule 24.04.2011
comment
прежде всего, спасибо. верна ли следующая концепция? если корневой каталог говорит, что первый кластер файла равен 0x002, то загрузите 3-й кластер и для загрузки следующего кластера найдите 3-й 12-битный элемент FAT (от 24-го до 36-битного), если он говорит 0x06, затем загрузите 7-й кластер и найдите 7-й 12-битный элемент FAT ( 72-й бит до 84-го бита), если он говорит, что значение больше или равно 0xff8 и меньше или равно 0xfff, то это конец кластера - person kim taeyun; 24.04.2011

FAT в основном представляет собой связанный список. Если начало файла находится в кластере 2, то для поиска следующего кластера вы смотрите запись 2 в FAT. Это будет содержать номер кластера следующего кластера для этого файла. Вы выполняете их до тех пор, пока не дойдете до того, который содержит число больше (исходя из памяти) 0ff8h, что отмечает конец файла.

Кроме того, если вы действительно не настроены на работу с 12-битной FAT, с 16-битной FAT работать значительно проще.

person Jerry Coffin    schedule 24.04.2011