как FAT, дайте мне знать, что загрузить следующую подсказку кластера по первому кластеру файла? - PullRequest
0 голосов
/ 24 апреля 2011

Я читаю учебник OS Dev от Breakthorn

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

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

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

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

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

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

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

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

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

вопрос такой.

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

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

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

спасибо.

Ответы [ 3 ]

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

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

next_cluster = FAT[0x002];

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

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

1 голос
/ 24 апреля 2011

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

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

1 голос
/ 24 апреля 2011

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

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

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

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

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

...