Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Лабораторная работа № 15-16.  «Получение навыков в работе с главной загрузочной записью жесткого диска». Краткие теоретические и учебно-методические материалы




Лабораторная работа № 15-16

 «Получение навыков в работе с главной загрузочной записью жесткого диска»

Цель работы: получение практических навыков в работе с главной загрузочной записью жесткого диска.

Образовательные результаты, заявленные во ФГОС третьего поколения:

Студент должен

уметь:

- осуществлять разработку кода программного модуля на современных языках программирования;

- создавать программу по разработанному алгоритму как отдельный модуль;

- выполнять отладку и тестирование программы на уровне модуля

знать:

- основные этапы разработки программного обеспечения;

- основные принципы технологии структурного и объектно-ориентированного программирования;

- основные принципы отладки итестирования программных продуктов

Краткие теоретические и учебно-методические материалы

по теме лабораторной работы

Жесткий диск представляет собой два или более дисков, посаженных на одну ось. Все головки чтения/записи здесь, как и для дискеты образуют жесткий блок, то есть перемещаются все вместе. Для жесткого диска вполне органичным является понятие цилиндра - совокупности всех дорожек, расположенных на разных поверхностях и равноудаленных от оси вращения. С точки зрения адресации понятия " дорожка" и " цилиндр" являются синонимами. Сектор является минимальной адресуемой единицей при обращениях к внешней памяти. Адрес сектора на внешней памяти состоит из трех составляющих:

· номер дорожки (нумерация дорожек начинается с 0);

· номер головки (нумерация головок начинается с 0);

· номер сектора на дорожке (нумерация секторов начинается с 1).

В DOS для чтения/записи секторов служат прерывания (прерывания, а не функции DOS! ) 0x25 (чтение) и 0x26 (запись). Обычный формат обращения к этим прерываниям  следующий:

AL - номер логического диска (0 - A, 1 - B, 2 - C, etc. );
CX - количество секторов, которое нужно прочитать /записать; DX - логический номер сектора;
DS: BX - адрес области оперативной памяти, с которой происходит обмен.

На выходе, как и для прерывания 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...