НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ «ХПІ»
Лабораторна робота №7
з курсу “Системне програмне забезпечення”
на тему: “Керування пам’яттю “.
Виконав:
студент групи АП-30б
Попов О.С.
Перевірив:
Межерицький С. Г.
Тема: “Керування пам’ятю.”
Мета: Перегляд таблиці векторів перериваннь, що на даний час знаходяться в ЕОМ на робочому місці.
Постановка задачі: Визначити на данній ЕОМ, ким зайняті вектори перериваннь (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 () для отримання інформацўії про програму, що перехопила поточний вектор переривання.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.