Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

По теме лабораторной работы. Жесткий диск представляет собой два или более дисков, посаженных на одну ось



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

· номер дорожки (нумерация дорожек начинается с 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-11-01; Прочитано: 352 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.03 с)...