Керування пам’ятю. Перегляд таблиці векторів перериваннь, що знаходяться в ЕОМ на робочому місці

Страницы работы

Содержание работы

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ «ХПІ»

Кафедра “Обчислювальна техніка та програмування”

Лабораторна робота №7

з курсу “Системне програмне забезпечення”

 на тему: “Керування пам’яттю “.

Виконав:             

                                 студент  групи АП-30б   

                                               Попов О.С.

Перевірив:

       Межерицький С. Г.

Харків 2002

Тема: “Керування пам’ятю.”

Мета: Перегляд таблиці векторів   перериваннь, що на даний час знаходяться в ЕОМ на робочому місці.

Постановка задачі: Визначити на данній ЕОМ, ким зайняті вектори перериваннь (DOS, BIOS, ім’я програми)

Структура програми.

Програма складається з основної програми   main () та  5 допоміжних функцій.

void *readvect (int in) - функція читає вектор переривання з номером in і вертає його значення.

void  get_memtop (void) - функція вертає адресу початку ланцюжка MСB csegm.

void   DOS _version_h (void) - функція вертає номер версії   DOS .

void   name_handler (void) - функція знаходить, якою програмою було перехоплено поточне   переривання.

void   Printvec (int   num) - функція виводить на екран номер   преривання й програми що їх перехопили починаючи з номеру  num.

Опис змінних.

Змінні глобальні для всієї програми :

memtop -   сегментна адреса початку пам'яті;

csegm -   сегментна адpеса поточного   MСB;

othersegm -   сегментна адреса іншого   MСB;

fathersegm -   сегментна адреса батька;

*envstr -   адpеса рядка оточення;

envlen - довжина чергового рядка оточення;

envsize - розмір блоку оточення;

DOS  - номер версії   DOS ;

vect - вектор;

intnum - номер   переривання.

Опис алгоритму програми.

   Головна програма   main ( ) виконує нескінченний цикл для обробки кодів нажатих клавіш й в залежності від них викликається функція   Printvec (int   num) для виводу на екран інформації про вектори переривання. Вихід з даного циклу здійснюється по натиску клавіши   Esc.

   Функцўя   readvect () читає вектор заданого   переривання. Для читання вектору використовуємо функцію   35h   DOS  (переривання 21h) :

          Вхід :   Ah   =   35h;

                       Al   = номер вектору   переривання.

          Вихід :  ES:BX   = адреса програми обробки   переривання.

   Функція   get_memtop () вертає адресу початку ланцюжка   MСB csegm.  

   Функція  DOS_version_h () повертає номер версії  DOS за  допомогою функції   0x30.

   Функція  name_handler () знаходить, якою програмою було перехоплено поточне   переривання. Для визначення власника вектору переривання   нам необхідно визначити клас блоку. Клас блоку визначаїться по наступним правилам :

  якщо   Pid власника блоку   нульовий - блок є  вільним (клас Free). Для зайнятих блоків клас уточнюється; якщо   Pid (   сегментна  адреса   Psp ) власника містить адресу, що лежить до кінця пам'яті, що розподіляється   memtop ( звичайно це число 8 ), то блок одержує клас DOS .Для блоків, що не належать DOS, перш за все перевіряється   сегментна адреса власника. Якщо ця адреса є адресою сегменту, наступного за поточним MСB, це означає, що блок пам'яті містить програмний сегмент і одержує клас Pgm.

   В іншому випадку програма " зазираї " в   Psp власника. Зі зміщенням   0x2c в   Psp міститься адреса сегменту оточення; якщо ця адреса є адресою сегменту, наступного за поточним   MCB, то блок одержує клас Env. Якщо клас блоку не вдається визначити ніяким з описаних вище засобів, вважаймо, що блок містить дані й одержує клас  Data.

  Для програм, запущених з командного рядка DOS ,батьком є Command.Com. Батьком    Command.Com є  він сам. По цій ознаці ( сам собі батько ) він і може бути  ідентифікований.

  Якщо ж програма не є  програмою   DOS ,  командним процесором чи резидентною, завантаженою по   Install, для неї повинен зберігатися рядок виклику. Рядок виклика знаходиться у сегменті оточення.

   Функцўя   Printvec (int num) виводить на екран номера  переривання і програми, що їх перехопили, починаючи з номеру   num, при цьому вона в циклі викликає функцію   name_handler () для отримання  інформацўії про програму, що перехопила поточний вектор переривання.

Похожие материалы

Информация о работе