Определение начального сектора корневого каталога на диске 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