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

ZI-LR&PZ / LR_1-3

.pdf
Скачиваний:
8
Добавлен:
02.02.2015
Размер:
260.39 Кб
Скачать

Методичні вказівки до лабораторної роботи 1-3

“Запис і читання інформації диска с зміною чергуванням секторів”

за курсом “Захист інформації у комп’ютерних системах та мережах”

1. Ціль роботи Придбання навичок роботи з нестандартними можливостями дисків на

низькому рівні. Використання зміни чергування секторів на гнучкому диску.

2.Теми для попереднього пророблення Структура диска.

Способи захисту дискет. Нестандартне чергування секторів.

Робота з перериваннями і керування контролером дисководів. Робота системного таймеру.

3.Постановка задачі

Необхідно розробити і налагодити програму що дозволяє виконати форматування інженерних секторів дискети зі зміненим чергуванням секторів, запис, читання і перевірку якості виконання мітки з цими секторами.

4. Індивідуальні завдання Програма форматування доріжки дискети з нестандартним чергуванням

секторів і запис інформації в заданий сектор, виконана на низькому рівні. Число секторів на доріжці 9.

Варіанти:

 

 

 

 

№ % 6

Номер

Сторона

Довжина

№ % 5

Порядок

проходження

 

 

доріжки

 

сектора

 

секторів

 

 

0

80/40

0

1024

0

4,3,2,1,9,8,7,6,5

 

1

80/40

1

256

1

9,6,5,3,7,8,7,4,2

 

2

80/40

0

512

2

7,6,4,2,9,8,5,3,1

 

3

81/41

1

1024

3

1,9,4,3,6,7,2,5,8

 

4

81/41

0

256

4

1,9,2,8,7,3,4,6,5

 

5

81/41

1

512

де

- номер по журналі

%- операція знаходження залишку від цілочислового розподілу

Номер сектора в який виконується запис СЕКТ СЕКТ = № % 9

зсув для запису Прізвища у секторі СЕКТ дорівнює № байт зсув для запису Назви Групи у секторі СЕКТ дорівнює

(Довжина сектора - № - 10) байт

Примітка:

Визначити та обґрунтувати які сектори треба перевіряти.

Необхідно настроїти таблицю контролера дисководів (див. лекції) при виконанні форматування, записи, читання.

Правильно формувати таблицю форматування доріжки.

5.Приклад рішення задачі

Умова завдання.

Створити таблицю форматування інженерного циліндра для контролера дисководів за допомогою переривання 1ЕН (20 циліндр, 1 сторона, 15 секторів, довжина сектора 512 байт).

Виконати форматування встановленого циліндра

Записати в нього ідентифікаційну інформацію і перевірити якість запису.

Прочитати отриману інформацію

Приклад виконання завдання

У приведеній нижче програмі використане "зворотне" розташування секторів - спочатку йде сектор з номером 15, потім 14 і т.д.

#include <stdio.h> #include <conio.h> #include <dos.h> #include <stdlib.h> #include <bios.h> #include "sysp.h"

// Номер форматируемой дорожки

#define TRK 20

// Код размера сектора - 512 байт

#define SEC_SIZE 2

/* таблица параметров дискеты */

typedef struct _DPT_ { unsigned char srt_hut; unsigned char dma_hlt; unsigned char motor_w; unsigned char sec_size; unsigned char eot; unsigned char gap_rw; unsigned char dtl; unsigned char gap_f; unsigned char fill_char; unsigned char hst; unsigned char mot_start;

} DPT;

union REGS inregs, outregs; char _far diskbuf[512];

void main(void); void main(void) {

struct diskinfo_t di; unsigned status;

unsigned char old_sec_size, old_fill_char, old_eot; int i, j;

DPT _far *dpt_ptr;

printf("\nПрограмма уничтожит содержимое" "\n20-й дорожки диска А:." "\nЖелаете продолжить? (Y,N)\n");

// Ожидаем ответ оператора и анализируем его

i = getch();

if((i != 'y') && (i != 'Y')) exit(-1);

//Получаем адрес таблицы параметров дискеты dpt_ptr = get_dpt();

//Сохраняем старые значения из таблицы параметров

old_sec_size = dpt_ptr->sec_size; old_fill_char = dpt_ptr->fill_char; old_eot = dpt_ptr->eot;

//Устанавливаем в таблице параметров дискеты

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

//форматировании, количество секторов на дорожке

dpt_ptr->sec_size = SEC_SIZE; dpt_ptr->fill_char = 0xf6;

dpt_ptr->eot

= 15;

// Устанавливаем тип диска

inregs.h.ah = 0x17; inregs.h.al = 3; inregs.h.dl = 0;

int86(0x13, &inregs, &outregs);

// Устанавливаем среду для форматирования

inregs.h.ah = 0x18; inregs.h.ch = TRK; inregs.h.cl = dpt_ptr->eot; inregs.h.dl = 0;

int86(0x13, &inregs, &outregs);

// Подготавливаем параметры для функции форматирования

di.drive

= 0;

di.head

= 0;

di.track

= TRK;

di.sector

= 1;

di.nsectors = 15;

di.buffer

= diskbuf;

//Подготавливаем буфер формата для 15-ти секторов

//Используем обратный порядок расположения секторов

//на дорожке

for(i=0, j=15; j>0; i += 4, j--) { diskbuf[i] = TRK; diskbuf[i+1] = 0; diskbuf[i+2] = j; diskbuf[i+3] = SEC_SIZE;

}

// Вызываем функцию форматирования дорожки

status = _bios_disk(_DISK_FORMAT, &di) >> 8; printf("\nФорматирование завершилось с кодом: %d",status);

//Восстанавливаем старые значения в

//таблице параметров дискеты

dpt_ptr->sec_size = old_sec_size; dpt_ptr->fill_char = old_fill_char;

dpt_ptr->eot

= old_eot;

exit(0);

 

}

Для аналізу використовуваного чергування секторів можна використовувати наступну програму, що намагається прочитати підряд два розташованих поруч сектори з номерами 1 і 2. Якщо сектора на доріжці чергуються звичайним образом, то сектора з номерами 1 і 2 знаходяться поруч. Якщо ж доріжка відформотована приведеною вище програмою, то ці сектори знаходяться на максимальному видаленні друг від друга.

Програма аналізує час, необхідне на те, щоб 50 разів підряд прочитати ці два сектори на двадцятій доріжці. Спочатку використовується 0-ва голівка нестандартної доріжкі, потім - голівка 1, для якої раніш було виконано

стандартне форматування.

На екран виводяться не тільки часи, але і їхнє відношення, що і може служити критерієм при визначенні того, з чим ми маємо справу - з оригінальною дискетою або з її копією.

#include <stdio.h> #include <conio.h> #include <bios.h> #include <dos.h> #include <stdlib.h> #include <time.h>

char _far diskbuf[1024];

void main(void);

void main(void) {

unsigned status = 0, i, j; struct diskinfo_t di; time_t start, end;

float t1, t2;

// Читаем первый сектор дорожки для синхронизации таймера

di.drive

= 0;

di.head

= 0;

di.track

= 20;

di.sector

= 1;

di.nsectors = 1;

di.buffer

= diskbuf;

for(i = 0; i < 3; i++) {

status = _bios_disk(_DISK_READ, &di) >> 8; if( !status ) break;

}

//Отсчет времени начинаем сразу после чтения сектора,

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

//мотора дисковода.

start = clock();

// Повторяем 50 раз чтение секторов с номерами 1 и 2

for(j=0; j<50; j++) {

di.drive

= 0;

di.head

= 0;

di.track

= 20;

di.sector

= 1;

di.nsectors = 2; di.buffer = diskbuf;

for(i = 0; i < 3; i++) {

status = _bios_disk(_DISK_READ, &di) >> 8; if( !status ) break;

}

}

end = clock();

t1 = ((float)end - start) / CLK_TCK;

printf("Время для головки 0: %5.1f\n",t1);

//Выполняем аналогичную процедуру для дорожки,

//которая была отформатирована обычным способом.

di.drive

= 0;

di.head

= 1;

di.track

= 20;

di.sector

= 1;

di.nsectors = 1;

di.buffer

= diskbuf;

for(i = 0; i < 3; i++) {

status = _bios_disk(_DISK_READ, &di) >> 8; if( !status ) break;

}

start = clock();

for(j=0; j<50; j++) {

di.drive

= 0;

di.head

= 1;

di.track

= 20;

di.sector

= 1;

di.nsectors = 2;

di.buffer

= diskbuf;

for(i = 0; i < 3; i++) {

status = _bios_disk(_DISK_READ, &di) >> 8; if( !status ) break;

}

}

end = clock();

t2 = ((float)end - start) / CLK_TCK;

printf("Время для головки 1: %5.1f\n",t2);

printf("\nОтношение времен чтения для головок 0 и 1: %5.1f", t1/t2);

}

7. Зміст звіту.

Тема лабораторної роботи

Ціль роботи

Опис використовуваних переривань і функцій bios

Алгоритм програми (графічний або словесний опис)

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

Результати роботи програми

Висновки

Соседние файлы в папке ZI-LR&amp;PZ