Определение начального сектора корневого каталога на диске FAT16

Я хочу выгрузить некоторые очень большие программные переменные из памяти и в файлы на диске.

Я прочитал десятки страниц на INT 13H, CHS, MBR и Таблице размещения файлов, и я изучил почти все, что мне нужно знать, за исключением того, что я не могу найти рабочий способ для вычисления начального сектора корневого каталога.

Согласно этой странице, http://nerdclub-uk.blogspot.co.uk/2012/11/understanding-fat-tables.html, определить это так же просто, как сложить смещение сектора, содержащее загрузочную запись, число зарезервированных секторов, и количество секторов в каждой копии FAT.

После изучения моего загрузочного сектора я подключил все эти значения, и на этом я и остановился.

1 + 1 + (2 * 256), что равно 514.

Итак, мой корневой каталог должен начинаться со смещения сектора 514. Наибольшее количество секторов на цилиндр - 63.

514/63 = 8r10

Итак, мой корневой каталог должен быть в цилиндре 8, сектор 10.

Однако в этом секторе есть только нули и все сектора вокруг него.

Очевидно, я делаю что-то очень неправильное, но после дня, проведенного в поиске Google, я готов сдаться.

1 ответ

Решение

Более новые диски используют LBA (адресация логических блоков), поэтому CHS больше не вступает в игру. Вы должны получить доступ к сектору 514 (сектор LBA 513, поскольку первый сектор равен 0 для LBA) из ваших вычислений. Что в этом секторе?

Что касается адресации CHS, каждый цилиндр состоит из нескольких головок (дорожек) на каждой стороне диска (-ов), а каждая головка (дорожка) - нескольких доступных секторов вокруг диска.

https://en.wikipedia.org/wiki/Cylinder-head-sector имеет формулу для перевода кортежа (c, h, s) в значение сектора LBA:

Кортежи CHS могут быть отображены на адреса LBA по следующей формуле:

A = (c Nголовок + h) Nсекторов + (s - 1), где A - адрес LBA, Nзаголовков - количество головок на диске, Nсекторов - максимальное количество секторов на дорожку, и (c, h, s) - адрес CHS.

и преобразование адресов LBA в CHS https://en.wikipedia.org/wiki/Logical_block_addressing

Адреса LBA могут быть сопоставлены с кортежами CHS по следующей формуле ("mod" - операция по модулю, т.е. остаток, а "÷" - целочисленное деление, то есть частное деления, где отбрасывается любая дробная часть):

C = LBA ÷ (HeadsPerCylinder (HPC) × SectorsPerTrack (SPT))

H = (LBA ÷ SPT) мод HPC

S = (LBA мод SPT) + 1

Другие вопросы по тегам