![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Жесткий диск представляет собой два или более дисков, посаженных на одну ось. Все головки чтения/записи здесь, как и для дискеты образуют жесткий блок, то есть перемещаются все вместе. Для жесткого диска вполне органичным является понятие цилиндра - совокупности всех дорожек, расположенных на разных поверхностях и равноудаленных от оси вращения. С точки зрения адресации понятия "дорожка" и "цилиндр" являются синонимами. Сектор является минимальной адресуемой единицей при обращениях к внешней памяти. Адрес сектора на внешней памяти состоит из трех составляющих:
· номер дорожки (нумерация дорожек начинается с 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; Прочитано: 364 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!