Чтение содержимого каталога в FAT32 - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь записать драйвер файловой системы FAT32 на RPI 3B.Я могу читать сектора FAT и сектора корневых каталогов с помощью драйвера emmc.

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

Мое текущее понимание заключается в следующем: Получить первый номер кластера (cluster_number) каталога / файла. Считать сектор FAT, который содержит запись first_cluster_number.Скажем, я читаю сектор FAT как

uint8_t fat_sector[512] = { 0 };
uint32_t this_fat_sector_num, this_fat_entry_offset;
this_fat_sector_num =  unusedSectors + reservedSectorCount + ((cluster_number * 4)/ bytesPerSector);
this_fat_entry_offset =  (cluster_number * 4)/ bytesPerSector;
read_fat_sector(this_fat_sector_num, & fat_sector[0]);
// Calculate next cluster in chain
uint32_t next_cluster_number = ((uint32_t * fat_sector[this_fat_entry_offset])) & 0x0fffffff;
// Calculate next cluster in chain 1 more time, is below code correct ?
 uint32_t next_next_cluster_number = ((uint32_t * fat_sector[next_cluster_number])) & 0x0fffffff;

Что происходит, когда следующий номер кластера отсутствует в уже прочитанном буфере fat_sector (512 байт)?Если номер кластера = индекс следующей записи в fat_sector, нужно ли умножить его на 4, учитывая, что жирные 32 записи занимают 4 байта.Если кто-то может дать некоторую ясность, это будет полезно.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Реализация кеша (в оперативной памяти) FAT. Допустим, что кэш имеет достаточно ОЗУ для 20 секторов и начинается пустым.

Далее напишите функцию "getFATentry", которая проверяет, находится ли сектор в кеше, и находит правильную запись в кеше, если она есть; или (при необходимости) извлекает что-либо из кэша, чтобы освободить место, извлекает правый сектор с диска в кэш, а затем находит нужную запись в кэше.

Как только это будет сделано, вы можете next_cluster = getFATentry(previous_cluster);, не беспокоясь о кеше или любом дисковом вводе-выводе (но захотите что-то сделать при изменении FAT - например, принять политику «сквозной записи» или «обратной записи»).

Примечание. Регулируя размер «FAT-кеша», вы можете повысить производительность или уменьшить потребление ОЗУ. Было бы неплохо позволить динамически увеличивать / уменьшать размер кэша (например, увеличиваться до размера всей FAT, если больше ничего не требуется в ОЗУ, но сокращать до минимума, если вся память требуется для чего-то другого).

0 голосов
/ 14 мая 2019

Я нашел решение.

Сначала прочитайте начальный жирный сектор для данного номера кластера.

Найдите thisFatEntryOffset и прочитайте следующую жирную запись.

Новая жирная запись будет новым номером кластера.Найдите thisFatNumber и thisFatEntryOffset для нового номера кластера.

Если новый жировой сектор! = Старый жировой сектор, то прочитайте новый жировой сектор и прочитайте запись, используя thisFatEntryOffset.

...