Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1- 6_Системное программное обеспечение

.doc
Скачиваний:
25
Добавлен:
23.06.2014
Размер:
76.29 Кб
Скачать

Системное программное обеспечение

Шифр 1969

Задача 1 вариант 9

Требуется, выбрав вариант согласно шифру, составить две программы на языке Си. Первая программа читает загрузочную запись диска (ВООТ-сектор) в специальную структуру и затем получает из нее значе­ние поля, указанного в варианте.

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

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

Решение

Некоторые области диска содержат системную информацию, используемую DOS при работе с данным диском. К таким областям относятся:

Главная Загрузочная Запись (MBR - Master Boot Record) - только для жесткого диска;

Загрузочный Сектор логического диска ( Boot - сектор );

Таблица Размещения Файлов (FAT - File Allocation Table);

Корневой Каталог (Root Directiry).

10.3.1. MBR занимает самый первый сектор жесткого диска (дорожка 0, головка 0, сектор 1). Причины введения MBR в логическую структуру диска следующие. Формат некоторых системных данных и обращений к прерываниям 0x25, 0x26 в ранних версиях DOS не предусматривал возможности работы с жестким диском объемом более 32 Мбайт. Начиная с версии DOS 3.30, это ограничение обходится путем разбиения жесткого диска на два или более логических дисков, объем каждого из которых менее 32 Мбайт. И хотя уже в версии 4.0 снято ограничение на объем логического диска, возможность разбиения диска остается, так как обеспечивает целый ряд дополнительных удобств (например, разделение внешней памяти между пользователями).

Формат MBR следующий (в программе примера 10.2 он описан структурой struct MBR):

первые 466 (0x1BE) байт занимает программа начальной загрузки;

далее следует таблица разделов, состоящая из четырех элементов;

последние два байта - признак конца таблицы - код 0xAA55.

Программа начальной загрузки, содержащаяся в MBR, выполняет поиск по таблице активного раздела (логического диска, с которого должна происходить загрузка DOS), чтение в память Boot - сектора этого раздела и передачу управления на него.

Элемент таблицы разделов описан в программе примера 10.2 структурой struct Part. Добавим некоторые комментарии к этому описанию.

Поле ActFlag принимает значение 0x80 для активного раздела или 0 - для неактивного.

В физических адресах начала и конца раздела дорожка и сектор задаются в формате регистра CX прерывания 0x13. Раздел, как правило, начинается и заканчивается на границе цилиндра. Если первый сектор цилиндра занимает MBR (или ее продолжение в расширенном разделе DOS), то остальные сектора этой дорожки не используются, и раздел начинается с сектора 1, головки 1 этой дорожки. Неиспользуемые сектора называются скрытыми.

Поле SysCode для MS-DOS может принимать значения: 1 - логический диск объема менее 32 Мбайт, 12-битная FAT; 4 - логический диск объема менее 32 Мбайт, 16-битная FAT; 6 - логический диск объема более 32 Мбайт; 5 - расширенный раздел DOS.

Последнее значение SysCode означает, что сектор, задаваемый адресом начала раздела в свою очередь содержит MBR (без программы загрузки, но с таблицей разделов по смещению 446), в этой таблице в свою очередь может содержаться описатель расширенного раздела и т.д. Системная утилита FDISK, производящая разбиение физического диска на логические, использует только два элемента в каждой таблице разделов, позволяя создать один первичный (соответствующий логическому диску) и один расширенный раздел DOS.

Поле RelSect содержит номер начального сектора (логический адрес) относительно начала раздела внешнего по отношению к данному.

Программист не может прочитать MBR средствами DOS. Для прерывания 0x25 задается логический адрес - номер сектора внутри данного логического диска, а сама MBR не принадлежит никакому логическому диску.

Для MS-DOS версии 4.0 BOOT-сектор имеет другой формат:

Смещение

Размер

Содержимое

(+0)

3

Команда JMP xxxx - переход типа NEAR на программу начальной загрузки

(+3)

8

Название фирмы-производителя операционной системы и версия, например: "IBM 4.0"

(+11)

25

Extended BPB - расширенный блок параметров BIOSBIOS

(+36)

1

Физический номер дисковода (0 -флоппи, 80h - жесткий диск)

(+37)

1

Зарезервировано

(+38)

1

Символ ')' - признак расширенной загрузочной записи DOS 4.0

(+39)

4

Серийный номер диска (Volume Serial Number), создается во время форматирования диска

(+43)

11

Метка диска (Volume Label)

(+54)

8

Зарезервировано, обычно содержит запись типа 'FAT12 ', которая идентифицирует формат таблицы размещения файлов FAT

Первые два поля в BOOT-секторе для DOS 4.0 аналогичны описанным раньше.

Поле со смещением (+38) всегда содержит символ ')'. Этот символ означает, что используется формат расширенной загрузочной записи операционной системы MS-DOS 4.0.

Серийный номер диска формируется во время форматирования диска на основе даты и времени форматирования. Это поле может быть использовано для определения факта замены диска в дисководе.

Метка диска формируется при форматировании и может быть изменена командой операционной системы LABEL. Одновременно метка диска помещается в корневой каталог.

Поле со смещением 11 содержит расширенный блок параметров BIOS. Он состоит из обычного BPB и дополнительного расширения:

(0)

2

sect_siz

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

(+2)

1

clustsiz

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

(+3)

2

res_sect

Количество зарезервированных секторов.

(+5)

1

fat_cnt

Количество таблиц FAT.

(+6)

2

root_siz

Максимальное количество дескрипторов файлов, содержащихся в корневом каталоге диска.

(+8)

2

tot_sect

Общее количество секторов на носителе данных (в разделе DOS).

(+10)

1

media

Байт-описатель среды носителя данных.

(+11)

2

fat_size

Количество секторов, занимаемых одной копией FAT.

 

 

 

---- Расширение стандартного BPB -----

(+13)

2

sectors

Количество секторов на дорожке

(+15)

2

heads

Количество магнитных головок

(+17)

2

hidden_l

Количество скрытых секторов для раздела, который по размеру меньше 32 мегабайтов.

(+19)

2

hidden_h

Количество скрытых секторов для раздела, превышающего по размеру 32 мегабайта. (Только для DOS 4.0).

(+21)

4

tot_secs

Общее количество секторов на логическом диске для раздела, превышающего по размеру 32 мегабайта.

Как обычный, так и расширенный блок параметров BIOS содержит байт-описатель среды media. Этот байт может служить для идентификации носителя данных и может содержать следующие величины, характеризующие носитель данных по количеству сторон диска и количеству секторов на дорожке:

FFh

2 стороны, 8 секторов на дорожке;

FEh

1 сторона, 8 секторов на дорожке;

FDh

2 стороны, 9 секторов на дорожке;

FCh

1 сторона, 9 секторов на дорожке;

F9h

2 стороны, 15 секторов на дорожке;

F8h

жесткий диск.

Текст программы

#include <stdio.h>

#include <alloc.h>

#include <dos.h>

int getbootc(char*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);

return(reg.x.cflag);

}

void main(void)

{

char far*boot_rc;

int statusc;

char drive;

boot_rc=malloc(512);

printf("\n nomer diska?(A,B...):");

drive=getche();

drive=toupper(drive)-'A';

statusc=getbootc((char far*)boot_rc,drive);

if(statusc)

{printf("\nOosibka\n");exit(-1);}

printf("\nkolizestvo ravno%d\n",*(unsigned*)(boot_rc+24));

/*11 байт до начала плюс еще 13 (см.структуру загруз.записи*/

free(boot_rc);

}

Результаты работы

Задача 2 вариант 6

Записать в буфер клавиатуры последовательность символов согласно выбранному варианту тремя способами ('три программы на языке Си): с использованием функции 5 прерывания 16h, осу­ществляя непосредственный доступ к ячейкам памяти, выделен­ным под буфер клавиатуры, по текущему значению указателя "головы" буфера; то же, но по текущему указателю "хвоста" бу­фера.

Получить оглавление каталога текущего диска, поместив в буфер клавиатуры коды символов и клавиш: dir,<Еnter>.

Задача 3 вариант 5

Составить и отладить резидентную программу, которая, ис­пользуя обработчики прерываний 9 и 1Сh, позволяет по нажа­тию определенной переключательной клавиши вызвать на экра­не появление заданного слова. Переключатель прерывания и сло­во указаны в варианте, который следует выбрать согласно шифру.

Создать резидентную программу, которая выводит на терми­нал слово "while" по нажатию Сtrl.

7