1- 6_Системное программное обеспечение
.docСистемное программное обеспечение
Шифр 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,®,®,&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.