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

 gotoxy(1,2);

 printf("***         Атрибути драйверу %5u          ***",cc);

 gotoxy(1,3);

 if (drv==clock) cprintf("     активний CLOCK$");

 if (drv==con) cprintf("     активний CON");

 gotoxy(1,4);

 if (drv->attr&0x8000)

 {

  ATR(1,"консоль вводу")

  ATR(2,"консоль виводу")

  ATR(4,"нульовий прилад")

  ATR(8,"CLOCK$ (години)")

  ATR(0x2000,"пiдтримуї  OUB")

 }

 else

 {

  ATR(2,"32-байтна адреса сектора")

  ATR(0x2000,"читаї  media FAT")

 }

 ATR(0x40,"пiдтримуї  функцi DOS  3.2")

 ATR(0x800,"пiдтримуї  Open/Close")

 ATR(0x4000,"пiдтримуї  IOCTL")

 gotoxy(1,12);

 if (getch()==0) getch();

 RmmW(0,1,rx,ry);

 gotoxy(xm,ym);

}

main() {

  int c;

  /* отримання адреси CVT */

  rr.h.ah=0x52; intDOS x(&rr,&rr,&sr);

  /* адреса драйвера годин */

  clock=DA(peek(sr.es,rr.x.bx+10),peek(sr.es,rr.x.bx+8));

  /* адреса драйверу консолi */

  con=DA(peek(sr.es,rr.x.bx+14),peek(sr.es,rr.x.bx+12));

  /* адреса NUL-драйвера */

  сlrscr();

  printf("             Перегляд списка драйверiв.           ");

  drv=DA(sr.es,rr.x.bx+34);

  gotoxy(8,3);

  printf("Нажмiть <SpaceBar> ,а для розгляду атрибутiв",

                          "драйверу <Enter>.");

  gotoxy(28,4);

  cc=1;

  cprintf("Список драйверiв приладiв :\n\r");

  while(FP_OFF(drv)!=0xffff) {

         printf("%5u",cc);

         printf("  Адреса - %Fp    ",drv);

         printf(" атрибути - %04X   ",drv->attr);

         if (drv->attr&0x8000)

                for (i=0;i<8; cprintf("%c",drv->name[i++]));

         else printf("блочний - %d",drv->name[0]);

                printf("\n\r"); y=0;

         while ((c=getch())==Enter)FlDrv();

         if (c==0) getch();

         drv=drv->next; /* адреса наступн.драйвера */

         cc++;

  }

    getch();

  }

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

 1 Адреса - 011c : 0048 атрибути - 8004   Nul

 2 Адреса - 02a6 : 0000 атрибути - 8000   Setverxx

 3 Адреса - 025d : 0000 атрибути - A000   Xmsxxxx0

 4 Адреса - 0070 : 0023 атрибути - 8013   Con

 5 Адреса - 0070 : 0035 атрибути - 8000   Aux

 6 Адреса - 0070 : 0047 атрибути - A0c0   Prn

 7 Адреса - 0070 : 0059 атрибути - 8008   Clock$

 8 Адреса - 0070 : 006b атрибути - 08c2   блокова - 4

 9 Адреса - 0070 : 007b атрибути - 8000   Com1

10 Адреса - 0070 : 008d атрибути - A0c0   Lpt1

11 Адреса - 0070 : 009f атрибути - A0c0   Lpt2

12 Адреса - 0070 : 00b8 атрибути - A0c0   Lpt3

13 Адреса - 0070 : 00ca атрибути - 8000   Com2

14 Адреса - 0070 : 00dc атрибути - 8000   Com3

15 Адреса - 0070 : 00ee атрибути - 8000   Com4

Висновок: Ознайомилися зі  принципом перегляду списку  драйверів пристроїв.


Лабораторна робота № 13.

“Управління пам’яттю: таблиця векторів переривань”

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

Постановка завдання: Визначити, що на даному комп'ютері вектори переривань перехоплені програмами не з складу DOS/BIOS і визначити імена цих програм.

Опис програми:

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

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

          Вхід :   Ah   =   35h;

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

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

Функція get_memtop() повертає адресу початку ланцюжка MSB csegm. Адресу початку ланцюжка блоків пам'яті можна отримати за допомогою  недокументованої функції DOS 0х52. Ця функція повертає в регістри ES:BX деяку адpесу. Віднімаючи з цієї адpеси 2, одержимо адpесу того слова пам'яті, в  якому DOS зберігає сегментну адpесу першого MSB в ланцюжку.