Списки в оперативній пам'яті, операції над списками. Керування програмами. Керування таймером. Системні керуючі блоки. Управління пам’яттю: таблиця векторів переривань, страница 30

Функція name_handler() знаходить якою програмою було перехоплено поточне переривання. Для визначення власника вектору переривання нам необхідно визначити клас блоку. Клас блоку визначається по наступним правилам. Якщо Pid власника блоку нульовий, блок є  вільним (клас Free). Для зайнятих блоків клас уточнюються. Якщо Pid (сегментна  адреса Psp) власника містить адресу, що лежить до кінця пам'яті ,що розподіляється memtop, то блок одержує клас DOS. Для блоків, що не належать DOS, перш за все перевіряється сегментна адреса власника. Якщо ця адреса є адресою сегменту, наступного за поточним MSB, це означає, що блок пам'яті містить програмний сегмент і одержує клас Pgm. В іншому випадку програма "зазираї "  в Psp власника. Зі зміщенням 0x2c у Psp міститься адреса сегменту оточення; якщо ця адреса є адресою сегменту, наступного за поточним MSB, то блок одержує клас Env. Якщо клас блоку не вдається визначити ніяким з описаних вище засобів, вважаємо, що блок містить дані і одержує він клас Data.

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

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

void *readvect(int in);

void get_memtop(void);

void DOS _version_h(void);

void name_handler(void);

void PrintVec(int num);

struct MSB { /* блок упpавлўння пам`яттю */

  char type; /* тип */

  word owner,/* власник */

                 size; /* розмўр */

  byte reserved[3]; /* зарезервовано */

  char pgmname[8];  /* ўм'я програми, що знаходиться в даному

  блоцў ( для   DOS  4. 0 ў вище ) */

        };

struct MSB *cMSB;  /* адpеса поточного MSB */

struct MSB *eMSB;  /* адpеса MSB оточення */

word memtop;       /* сегм.адреса початку пам`ятў */

word csegm;        /* сегментна адpеса поточного MSB */

word othersegm;    /* сегм.адреса ўншого MSB */

word othersegm1;

word fathersegm;   /* сегм.адреса батька */

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

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

byte DOS ;          /* номер версў DOS  */

void far *vect;    /* вектор */

int intnum;      /* номер переривання */

union REGS rr;

struct SREGS sr;

void main() {

 int i,a;

get_memtop();

DOS _version_h();

clrscr();

printf("Таблиця векторўв переривання.");

gotoxy(1,4);

printf("Номер   - Адреса     - Чим_зайнятий");

gotoxy(7,25);

printf("Клавіші управління: <Up>,<Dn>,<Home>,<End>,<PgUp>,<PgDn>,<Esc>");

intnum=0;

PrintVec(intnum);

for(i=0;i==0;)

switch(getch())

  { /* Обробка нажатих клавўш */

        case Esc: i++; break;

        case 0: switch (getch()) {

                                case   Up: intnum--;

                                                          if(intnum<0) intnum=0;

                                                          PrintVec(intnum);

                                                          break;

                                 case Down:intnum++;

                                                          if(intnum>240) intnum=240;

                                                          PrintVec(intnum);

                                                          break;

                                 case PgUp:intnum-=16;

                                                          if(intnum<0) intnum+=16;

                                                          PrintVec(intnum);

                                                          break;

                                 case PgDn:intnum+=16;

                                                          if(intnum>256) intnum-=16;

                                                          PrintVec(intnum);

                                                          break;

                                 case Home:intnum=0;

                                                          PrintVec(intnum);

                                                          break;

                                 case Endk:intnum=0xf0;