Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Исакова.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
282.62 Кб
Скачать

Задача 1.

Условие:

Найти количество секторов в одном кластере.

Способ 1: программа читает загрузочную запись диска (BOOT-сектор) в специальную структуру и затем получает из нее значение поля,

Листинг программы:

#include <stdio.h>

#include <dos.h>

#include <conio.h>

#include <ctype.h>

typedef struct _EBPB_

{

unsigned sectsize;

char clustsize;

unsigned ressecs;

char fatcnt;

unsigned rootsize;

unsigned totsecs;

char media;

unsigned fatsize;

unsigned seccnt;

unsigned headcnt;

unsigned hiddensec_low;

unsigned hiddensec_hi;

unsigned long drvsecs;

} EBPB;

typedef struct _BOOT_

{

char jmp[3];

char oem[8];

EBPB bpb;

char drive;

char reserved;

char signature;

unsigned volser_lo;

unsigned volser_hi;

char label[11];

char fat_format[8];

char boot_code[450];

} BOOT;

int getboot(BOOT far *boot, int drive);

int main(void)

{

char boot[512];

BOOT far* boot_rec = (BOOT far*)boot;

int i, status;

char drive;

printf("\nЧтение загрузочной записи логического диска");

// Запрашиваем диск, для которого необходимо

// выполнить чтение загрузочной записи

printf(

"\nВведите обозначение диска, для просмотра"

"\nзагрузочной записи (A, B, ...):");

drive = getche();

// Вычисляем номер дисковода

drive = toupper(drive) - 'A';

// Читаем загрузочную запись в буфер

status = getboot((BOOT far*)boot_rec, drive);

// Если произошла ошибка (например, неправильно

// указано обозначение диска),

// завершаем работу программы

if(status)

{

printf("\nОшибка при чтении загрузочного сектора");

return(-1);

}

printf("\nСодержимое загрузочного "

"сектора для диска %c", drive + 'A');

printf("\n\nИнформация из расширения BPB:");

printf("\nКоличество головок - %d",

boot_rec->bpb.headcnt);

return 0;

}

/**

* getboot

*

* Прочитать загрузочную запись

*

* int getmboot(BOOT far *boot, int drive);

*

* boot - указатель на буфер, в который

* будет прочитана загрузочная запись

*

* drive - номер физического НМД

* (0 - первый НМД, 1 - второй, ...)

**/

int getboot(BOOT far *boot, int drive)

{

union REGS reg;

struct SREGS segreg;

reg.x.ax = drive;

reg.x.bx = FP_OFF(boot);

segreg.ds = FP_SEG(boot);

reg.x.cx = 1;

reg.x.dx = 0;

int86x(0x25, &reg, &reg, &segreg);

// Извлекаем из стека оставшееся там после

// вызова прерывания слово

asm pop ax

return(reg.x.cflag);

}

Теоретическое обоснование.

Главная загрузочная запись

Самый первый сектор жесткого диска (сектор 1, дорожка 0, головка 0) содержит так называемую главную загрузочную запись (Master Boot Record ). Эта запись занимает не весь сектор, а только его начальную часть.

Сама по себе главная загрузочная запись является программой. Эта программа во время начальной загрузки операционной системы с НМД помещается по адресу 7C00h:0000h, после чего ей передается управление. Загрузочная запись продолжает процесс загрузки операционной системы.

Таблица разделов диска

В конце самого первого сектора жесткого диска располагается таблица разделов диска (Partition Table). Эта таблица содержит четыре элемента, описывающих до четырех разделов диска. В последних двух байтах сектора находится значение 55AAh. Это признак таблицы разделов (сигнатура таблицы разделов).

Для просмотра и изменения содержимого таблицы разделов НМД используется программа fdisk.exe .

Что представляет из себя элемент таблицы разделов диска?

Это структура размером 16 байт, соответствующая части диска, называемой разделом. В структуре располагается информация о расположении и размере раздела в секторах, а также о назначении раздела.

Разделы диска бывают активными или неактивными. Активный раздел может использоваться для загрузки операционной системы. Заметим, что диск может содержать одновременно несколько активных разделов, которые могут принадлежать разным операционным системам.

Приведем формат первого сектора жесткого диска :

Смещение, байт

Размер, байт

Описание

0

1BEh

Загрузочная запись

1BEh

10H

Элемент таблицы разделов диска

1CEh

10H

Элемент таблицы разделов диска

1DEh

10H

Элемент таблицы разделов диска

1EEh

10H

Элемент таблицы разделов диска

1FEh

2

Признак таблицы разделов - значение 55AAh

Все элементы таблицы разделов диска имеют одинаковый формат:

Смещение, байт

Размер, байт

Описание

0

1

Признак активного раздела: 0 - раздел неактивный; 80h - раздел активный

1

1

Номер головки для начального сектора раздела

2

2

Номер сектора и дорожки для начального сектора раздела в формате функции чтения сектора INT 13h

4

1

Код системы: 0 - неизвестная система; 1, 4 - MS-DOS; 5 - расширенный раздел MS-DOS

5

1

Номер головки для последнего сектора раздела

6

2

Номер сектора и дорожки для последнего сектора раздела в формате функции чтения сектора INT 13h

8

4

Относительный номер сектора начала раздела

12

4

Размер раздела в секторах