Смещение области данных файла FAT12

Я создал образ FAT с помощью:

[user@localhost]$ dd if=/dev/zero of=floppy.img bs=1024 count=2880
[user@localhost]$ mkdosf -F 12 floppy.img

Затем я монтирую образ и добавляю новый файл:

[user@localhost]$ echo "Hello, World!" >> /mnt/hello.txt

В Википедии обзор файловой системы, область данных находится по адресу: ReservedSectors + (NumerOfFATs * SectorsPerFAT) + ((NumberOfRootEntries * 32) / BytesPerSector)

Загрузочный сектор floppy.img выглядит следующим образом:

jmp : 0xeb 0x3c
nop : 0x90
OEM : mkfs.fat
Bytes per sectors : 512
Sectors per cluster : 2
Reserved sectors : 1
FAT copies : 2
Root directory entries : 224
Small sectors : 5760
Media type : 0xf0
Sectors per FAT : 9
Sectors per track
Heads : 2
Hidden sectors : 0
Large sectors : 0
Drive number : 0
Signature : 41
Serial number : 1845425665
Volume label : NO NAME    
FS type : FS type : FAT12   
Executable : 0xaa55

В таблице корневого каталога я ищу файл hello.txt и получаю ответ, что первый кластер находится по адресу 0x03:

entry 1: HELLO.TXT cluster : 0x03

Теперь я вычисляю предыдущую формулу и получаю следующее смещение в секторах:

1 + (2 * 9) + ((224 * 32) / 512) = 33

В байтах должно быть 33 * 512 = 16896. Это должно быть началом области данных. Чтобы найти данные файла hello.txt, я должен добавить смещение Cluster * SectorsPerCluster = 6.

Данные файла должны располагаться в 39 секторе или на 19968 байтах от начала. Но когда я просматриваю этот сектор с помощью hexdump, ничего не возвращается:

[user@localhost]$ hexdump -C -s 19968 floppy.img
00004e00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

Читая hedump, я обнаружил, что hello.txt находится по смещению 17920 байт или в 35-м секторе от начала.

Что мне не хватает?


person Bruno Mondelo    schedule 31.07.2018    source источник


Ответы (1)


Смещение раздела данных правильное: ReservedSectors + (NumerOfFATs * SectorsPerFAT) + ((NumberOfRootEntries * 32) / BytesPerSector).

Смещение файлового кластера в разделе данных должно быть: DataSectionOffset + ((cluster - 2) * SectorsPerCluster). С помощью этой новой формулы теперь данные файла hello.txt равны 33 + ((3 - 2) * 2) = 35.

В байтах это смещение равно 17920:

[user@localhost]$ hexdump -C -s 17920 floppy.img
00004600  48 65 6c 6c 6f 2c 20 57  6f 72 6c 64 21 0a 00 00  |Hello, World!...|
person Bruno Mondelo    schedule 31.07.2018