From: Bob <ubob@mail.ru.>
Date: Mon, 4 Dec 2006 13:01:37 +0000 (UTC)
Subject: Логическая структура жесткого диска
Когда-то давно мною была опубликована статья под названием "Логическая
структура жесткого диска", http://www.opennet.ru/base/dev/hdd_struct.txt.html
Но код программы в этой статье содержит ошибки. Первая, и самая
существенная - если количество основных разделов не равно четырем, то
программа выдаст неправильную информацию о структуре диска. Вторая
ошибка не критичная, но тем не менее также требует устранения. Дело в
том, что для хранения информации о логических дисках расширенного
раздела используется массив на фиксированное число элементов.
В этой статье будут устранены обе ошибки. Информации о логических дисках
будет храниться в виде однонаправленного списка.
Для организации списка воспользуемся макросами, которые определены в
<sys/queue.h>, в частности, семейством TAILQ.
Порядок использования этих макроопределений подробно изложен в man queue.
Все теоретические вопросы о логической структуре жесткого диска и
форматы ключевых структур данных рассматривались в предыдущей статье
(см. ссылку выше), поэтому приступим непосредственно к переделке кода
программы.
Элемент списка разделов будет выглядеть следующим образом:
Предварительно этот список надо проинициализировать вызовом:
TAILQ_INIT(&head);
Функция чтения основной таблицы разделов из MBR. Параметры функции:
- int dev - дескриптор открытого устройства
- u64 *seek - смещение к расширенному разделу, если таковой есть. Как видно, параметр передается по ссылке.
int read_main_ptable(int dev, u64 *seek)
{
int i = 0;
u8 mbr[512];
pt_entry_t *part = NULL;