Лабораторная работа № 15-16. «Получение навыков в работе с главной загрузочной записью жесткого диска». Краткие теоретические и учебно-методические материалы
Лабораторная работа № 15-16 «Получение навыков в работе с главной загрузочной записью жесткого диска» Цель работы: получение практических навыков в работе с главной загрузочной записью жесткого диска. Образовательные результаты, заявленные во ФГОС третьего поколения: Студент должен уметь: - осуществлять разработку кода программного модуля на современных языках программирования; - создавать программу по разработанному алгоритму как отдельный модуль; - выполнять отладку и тестирование программы на уровне модуля знать: - основные этапы разработки программного обеспечения; - основные принципы технологии структурного и объектно-ориентированного программирования; - основные принципы отладки итестирования программных продуктов Краткие теоретические и учебно-методические материалы по теме лабораторной работы Жесткий диск представляет собой два или более дисков, посаженных на одну ось. Все головки чтения/записи здесь, как и для дискеты образуют жесткий блок, то есть перемещаются все вместе. Для жесткого диска вполне органичным является понятие цилиндра - совокупности всех дорожек, расположенных на разных поверхностях и равноудаленных от оси вращения. С точки зрения адресации понятия " дорожка" и " цилиндр" являются синонимами. Сектор является минимальной адресуемой единицей при обращениях к внешней памяти. Адрес сектора на внешней памяти состоит из трех составляющих: · номер дорожки (нумерация дорожек начинается с 0); · номер головки (нумерация головок начинается с 0); · номер сектора на дорожке (нумерация секторов начинается с 1). В DOS для чтения/записи секторов служат прерывания (прерывания, а не функции DOS! ) 0x25 (чтение) и 0x26 (запись). Обычный формат обращения к этим прерываниям следующий:
На выходе, как и для прерывания 0x13, устанавливается флаг переноса, а регистр AH содержит код ошибки при наличии таковой. Заметим, что дисковый адрес задается здесь не физический, а логический - номер сектора относительно начала логического диска. Нумерация секторов внутри логического диска начинается с 0, и номер логического сектора может быть вычислен как: logs = ( (t * ns) + h) * nh + s-1; (1), где · t, h, s - физический адрес (дорожка, головка, сектор); · ns - количество секторов на дорожке, · nh - количество головок чтения/записи. Для получения абсолютного номера сектора надо к вычисленному значению прибавить еще некоторую величину s0 - абсолютный номер сектора начала логического диска. Некоторые области диска содержат системную информацию, используемую DOS при работе с данным диском. К таким областям относятся: · Главная Загрузочная Запись (MBR - Master Boot Record) - только для жесткого диска; · Загрузочный Сектор логического диска (Boot-сектор); · Таблица Размещения Файлов (FAT - File Allocation Table); · Корневой Каталог (Root Directiry). Пример: Прочитать и выполнить форматный вывод на экран Главной Загрузочной Записи жесткого диска на своем рабочем месте. Программа состоит из основной программы main(), которая реализует все действия для чтения главной загрузочной записи. Переменные в основной программе: x, y - экpанные кооpдинаты; head - номеp головки (0); Sect_Trk - номеp доpожки и сектоpа (0, 1); ndrive=0 - номеp логического диска; EndList - указатель на подпись. Кроме того, в программе есть такие структуры:
Структура элемента раздела: struct Part { byte ActFlag; /* признак активного раздела */ /* физический адрес начала раздела */ byte Begin_Hd; /* # головки */ word Begin_SecTrk; /* # сектора та дорожки */ byte SysCode; /* код системы */ /* физический адрес конца раздела */ byte End_Hd; /* # головки */ word End_SecTrk; /* # сектора и дорожки */ dword RelSec; /* # сектора початку */ dword Size; /* количество секторов */ }; Стpуктуpа главной загрузочной записи. struct MBR { char LoadCode[0x1be]; /* пpогpамма загрузки */ struct Part rt[4]; /* 4 элемента pазделов */ word EndFlag; /* подпись MBR */ }; Начальный адрес для чтения задается: 0, 0, 1. При помощи прерывания 0x13 программа считывает сектор по заданному адресу, далее происходит поэлементный анализ таблицы разделов - пока не встретится признак конца таблицы или раздел нулевого размера. Значения полей элемента таблицы выводятся на экран. Манипуляции, которые описываются макросами TRK и SECT, обеспечивают распаковку номера дорожки и сектора. Если в поле SysCode содержится признак расширенного раздела, то устанавливается новый дисковый адрес, считывается новый сектор и анализируется новая таблица. /* Стандартные заголовки */ #include < dos. h> #include < conio. h>
/* Типы данных */
#define byte unsigned char #define word unsigned int #define dword unsigned long
void read_MBR(void); /* Чтение MBR */ /* Получение из упакованного SecTrk # сектора */ #define SECT(x) x& 0x3f /* Получение из упакованного SecTrk # дорожки */ #define TRK(x) (x> > 8)|((x< < 2)& 0x300)
/* структура элемента раздела */ struct Part { byte ActFlag; /* признак активного раздела */ /* физический адрес начала раздела */ byte Begin_Hd; /* # головки */ word Begin_SecTrk; /* # сектора и дорожки */ byte SysCode; /* код системы */ /* физический адрес конца раздела */ byte End_Hd; /* # головки */ word End_SecTrk; /* # сектора и дорожки */ dword RelSec; /* # сектора початку */ dword Size; /* количество секторов */ }; /* стpуктуpа главной загрузочной записи */ struct MBR { char LoadCode[0x1be]; /* пpогpамма загрузки */ struct Part rt[4]; /* 4 эл-та pазделов */ word EndFlag; /* подпись MBR */ } mbr; /* дополнительные переменные */ int x=10, y; /* экpанные кооpдинаты */
byte head=0; /* номеp головки (0) */ word Sect_Trk=1; /* номеp доpожки и сектоpа (0, 1) */ int ndrive=0; /* номеp логического диска */ word *EndList; /* указатель на подпись */ union REGS rr; struct SREGS sr; word i; /*--------------------------------------------------------*/ main() { textbackground(0); clrscr(); textattr(0x0a); cprintf(" Лабораторная работа " ); gotoxy(1, 2); cprintf(" Главная загрузочная запись" ); textattr(12); gotoxy(30, 4); cprintf(" Разделы жесткого диска: \n" ); gotoxy(1, 6); textattr(11); cprintf(" Лог. диск -----> \n\r" ); cprintf(" Признак ------> \n\r" ); cprintf(" Код системы --> \n\r" ); cprintf(" Начало: гол. --> \n\r" ); cprintf(" дор. --> \n\r" ); cprintf(" сект. -> \n\r" ); cprintf(" Конец: гол. --> \n\r" ); cprintf(" дор. -> \n\r" ); cprintf(" сект. -> \n\r" ); cprintf(" Нач. сектор ---> \n\r" ); cprintf(" Размер -------> \n\r" ); textcolor(11); NEXT: read_MBR(); for (EndList=(word *)& mbr. rt[(i=0)]; (*EndList! =0xaa55)& & (mbr. rt[i]. Size> 0L); EndList=(word *)& mbr. rt[++i]) { /* кооpдинаты куpсоpа */ y=6; x+=7; gotoxy(x, y++); if (mbr. rt[i]. SysCode==5) {textattr(13); cprintf(" Ext " ); } else textattr(12); cprintf(" %-7c", 'C'+ndrive++); gotoxy(x, y++); textattr(14); cprintf(" %02xH ", mbr. rt[i]. ActFlag); gotoxy(x, y++); textattr(15); cprintf(" %-7d", mbr. rt[i]. SysCode); gotoxy(x, y++); textattr(14); cprintf(" %-7d", mbr. rt[i]. Begin_Hd); gotoxy(x, y++); textattr(15); cprintf(" %-7u", TRK(mbr. rt[i]. Begin_SecTrk)); gotoxy(x, y++); textattr(14); cprintf(" %-7u", SECT(mbr. rt[i]. Begin_SecTrk)); gotoxy(x, y++); textattr(15); cprintf(" %-7d", mbr. rt[i]. End_Hd); gotoxy(x, y++); textattr(14); cprintf(" %-7u", TRK(mbr. rt[i]. End_SecTrk)); gotoxy(x, y++); textattr(15); cprintf(" %-7u", SECT(mbr. rt[i]. End_SecTrk)); gotoxy(x, y++); textattr(14); cprintf(" %-7lu", mbr. rt[i]. RelSec); gotoxy(x, y++); textattr(15); cprintf(" %-7lu", mbr. rt[i]. Size); if (mbr. rt[i]. SysCode==5) { /* если код системы 5, pаздел содержит свою таблицу pазделов; определяется ее дисковый адpес, и новая таблица считывается в память */ head=mbr. rt[i]. Begin_Hd; Sect_Trk=mbr. rt[i]. Begin_SecTrk; goto NEXT; } } gotoxy(x, y++); textattr(10+128); gotoxy(29, 18);
cprintf(" Нажмите любую клавишу... " ); getch(); } /*---------------------- MBR------------------------*/ void read_MBR(void) { rr. h. ah=2; /* Чтение */ rr. h. al=1; /* Секторов 1 */ rr. h. dl=0x80; /* Жесткий диск */ rr. h. dh=head; /* Головка */ rr. x. cx=Sect_Trk; /* Дорожка, сектор */
sr. es=FP_SEG(& mbr); /* Адрес буфера в ОП */ rr. x. bx=FP_OFF(& mbr); int86x(0x13, & rr, & rr, & sr); /* Проверка ошибок чтения */ if (rr. x. cflag) { printf(" Ошибка чтения: %x. ", rr. h. ah); printf(" Нажмите любую клавишу... \n\7" ); getch(); exit(); } } В процессе работы программы на экран выводится информация такого вида: Разделы жесткого диска: Лог. диск -----> C Ext E Ext G Признак ------> 80H 00H 00H 00H 00H Код системы --> 1 5 4 5 0 Начало: гол. --> 1 0 1 0 1 дор. --> 0 121 121 724 724 сект. -> 1 1 1 1 1 Конец: гол. --> 4 4 4 4 4 дор. -> 120 975 723 975 975 сект. -> 17 17 17 17 17 Нач. сектор ---> 17 10285 17 51255 17 Размер -------> 10268 72675 51238 21420 21403
Задания для лабораторной работы: Прочитать и выполнить форматный вывод на экран главной загрузочной записи жесткого диска на своем рабочем месте. Контрольные вопросы: 1. Что такое сектор жесткого диска? 2. Из чего состоит адрес сектора? 3. Как считается нумерация секторов диска? 4. Для чего необходим Boot-сектор? 5. Для чего необходимо прерывание 0х13?
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|